SHBrowseForFolder是一個windows shell函數,可以以目錄為單位進行瀏覽,其函數原型為:
LPITEMIDLIST SHBrowseForFolder(LPBROWSEINFOlpbi);
參數lpbi是一個指向結構BROWSEINFO的指標,該結構的定義如下:
typedef struct _browseinfo {
HWND hwndOwner;
LPCITEMIDLIST pidlRoot; //指向一個item identifier list指標,設定開始瀏覽的預設目錄
LPTSTR pszDisplayName;
LPCTSTR lpszTitle; //設定瀏覽對話方塊的標題,可以用這個變數對使用者進行提示
UINT ulFlags;
BFFCALLBACK lpfn; //回呼函數的地址,即基於該瀏覽對話方塊的視窗過程
LPARAM lParam;
int iImage;
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO; 由BROSEINFO的原型可以看出,很難設定一個預設的目錄。可以在ulFlags中設定BIF_VALIDATE並設定一個回呼函數來處理BFFM_INITIALIZED訊息(該訊息表示對話方塊已經為調用作好準備),在處理該訊息時再SendMessage一個BFFM_SETSELECTION訊息給視窗過程,並把初始目錄的字串作為LPARAM參數傳遞.下面的代碼把初試目錄設定為了"C:/Program Filese"......
if(uMsg == BFFM_INITIALIZED)
{
SendMessage(hwnd, BFFM_SETSELECTION,TRUE,(LPARAM)_T("C://Program Files"));
}
...... 以下是在vc++.net 2003中的一個例子。
#include<shlobj.h> //SHBrowseForFolder在shlobj.h中定義
#include<TCHAR.h>
#include<windows.h>int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)
{
if(uMsg == BFFM_INITIALIZED)
{
SendMessage(hwnd, BFFM_SETSELECTION,
TRUE,(LPARAM)_T("C://Program Files"));
}
return 0;
}void ShowSHBrowseForFolderDemoDlg()
{
TCHAR m_dir[500];
BROWSEINFO bi = {0};
bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS|BIF_VALIDATE;
bi.lpszTitle = _T("請選擇儲存計算結果檔案的位置");
bi.lpfn = BrowseCallbackProc; //指定回呼函數地址
ITEMIDLIST *pIDL = SHBrowseForFolder(&bi);
if(SHGetPathFromIDList(pIDL,m_dir) == TRUE) //變數m_dir中儲存了經過使用者選擇後的目錄的完整路徑.
{
MessageBox(NULL,m_dir,"sample",0);
}
}int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)
{
ShowSHBrowseForFolderDemoDlg();
return 0;
}