天天看點

目錄選擇對話框

 int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)//回調函數

{

 if (uMsg==BFFM_INITIALIZED)

 {

  //設定初始目錄

  if (lpData)

   SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)lpData);

 }

 return TRUE;

}

CString getpath(CWnd* cw)

{

 char pBuffer[256];

 CString temp;

 char currentdirbuf[255]="";

 GetCurrentDirectory(255,currentdirbuf);

 BROWSEINFO bi;

 memset(&bi,0,sizeof(BROWSEINFO));

 bi.hwndOwner=cw->m_hWnd;

 bi.lpszTitle="生成程式前,先為ut檔案選擇儲存檔案夾";

 //bi.pszDisplayName=selectpath_or_lastpath.GetBuffer(0);

 bi.ulFlags=BIF_RETURNONLYFSDIRS;

 bi.lParam=(LPARAM)currentdirbuf;

 ATLTRACE("currentdirbuf=%s/n",currentdirbuf);

 bi.lpfn=BrowseCallbackProc;//回調函數

 ITEMIDLIST *pIDList = SHBrowseForFolder(&bi);

 if(pIDList)

 {

  SHGetPathFromIDList(pIDList,pBuffer);

  GlobalFree(pIDList);

  char systembuf[255]="";

  GetSystemDirectory(systembuf,255);

  strcat_s(systembuf,"//last_pathname.ini");

  CStdioFile file;

  file.Open(systembuf,CFile::modeCreate|CFile::modeWrite);

  file.SeekToBegin();

  file.WriteString(pBuffer);

  file.Close();

  //LPMALLOC pMalloc=NULL;

  //if (SUCCEEDED(SHGetMalloc(&pMalloc)))

  //{

  // pMalloc->Free(pIDList);

  // pMalloc->Release();

  // //return;

  //}

 }

 ATLTRACE("pBuffer=%s/n",pBuffer);

 temp.Format("%s",pBuffer);

 return temp;

}

解釋一下這個函數用到的一些值的含義。

   1.  BROWSEINFO

typedef struct _browseinfo {     HWND hwndOwner;         // 對話框所有者視窗的句柄     LPCITEMIDLIST pidlRoot; // 表示在哪個路徑下選擇,通常設為NULL     LPTSTR pszDisplayName; //[ 傳回]所選目錄的名稱(不包含父級目錄)被拷貝到這個指針指向的位置     LPCTSTR lpszTitle;      // 視窗上顯示的提示語句     UINT ulFlags;           // 組合此對話框的元素标記     BFFCALLBACK lpfn;       // 事件産生時對話框調用的函數位址,一般不用,設定為NULL     LPARAM lParam;          // 傳遞給回調函數的參數     int iImage;             // 與所選目錄相關聯的圖示在系統圖示集合中的索引 } BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;

    它是一個結構, 原型是

    typedef struct _browseinfo { 

    HWND hwndOwner;          // 彈出的dialog的父窗體的句柄

    LPCITEMIDLIST pidlRoot;  // 指向一個ITEMIDLIST的指針,我們會在後邊介紹ITEMIDLIST結構,可空

    LPSTR pszDisplayName;    // 指向一個buffer,這個buffer用來存放使用者選中的目錄,buffer的size為MAX_PATH  

    LPCSTR lpszTitle;        //指向一個非空的string,用來顯示樹目錄之上的訓示資訊

    UINT ulFlags;            // 指出了顯示的檔案夾的類型

    BFFCALLBACK lpfn;        //回調函數,一般不用,簡單的記為NULL    

    LPARAM lParam;           // 當lpfn不為空時,把dialogbox的值傳給回調函數lpfn

    int iImage;              // 系統的圖示list的索引,當使用者選中目錄的時候,得到這個索引

} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;

    ulFlags的可能取值為:

    BIF_BROWSEFORCOMPUTER  ——隻傳回"我的電腦",當選中"我的電腦"之外的目錄時,OK鍵為灰色

    BIF_BROWSEFORPRINTER       ——隻傳回"列印機",當選中"列印機"之外的目錄時,OK鍵為灰色

    BIF_DONTGOBELOWDOMAIN   ——不包括"網路上的芳鄰"

    BIF_RETURNFSANCESTORS    ——隻傳回"我的檔案",當選中"我的檔案"之外的目錄時,OK鍵為灰色

    BIF_RETURNONLYFSDIRS        ——同上

    BIF_STATUSTEXT                         ——Includes a status area in the dialog box. The callback can set the status text by sending messages to the dialog box.

2.  ITEMIDLIST

   是一個結構,指明了預設浏覽的根檔案夾的位置,可以為空,那樣的話,預設為桌面檔案夾的檔案目錄.

   原型為

  typedef struct _ITEMIDLIST

  { 

    SHITEMID mkid;  // list of item identifers 

  } ITEMIDLIST, * LPITEMIDLIST;

  typedef const ITEMIDLIST * LPCITEMIDLIST;

3.  把項目标示符表(LPITEMIDLIST類型,SHBrowseForFolder函數的傳回值)轉換為檔案路徑:

BOOL SHGetPathFromIDList(     LPCITEMIDLIST pidl, // 項目标示符表     LPTSTR pszPath       // 傳回的檔案路徑 );

4.回調函數:

int CALLBACK BrowseCallbackProc(     HWND hwnd, // 浏覽對話框的窗體句柄,用這句柄給上圖對話框發消息改變其狀态(SendMessage)     UINT uMsg,// 浏覽對話框傳回的消息     LPARAM lParam, // 消息參數     LPARAM lpData   //BROWSEINFO 結構傳遞的參數     );