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 結構傳遞的參數 );