瀏覽文件夾_browseinfo
一、BROWSEINFO 結(jié)構(gòu) ....................................................................................
一、BROWSEINFO 結(jié)構(gòu) ................................................................................................................... 2
●定義....................................................................................................................................... 2
●成員變量 . .............................................................................................................................. 2
二、BROWSEINFO 的使用 ............................................................................................................... 4
(1)新建文件夾 . .................................................................................................................... 4
(2)回調(diào)函數(shù) . ........................................................................................................................ 4
(3)LPBROWSEINFO 與BROWSEINFO 的關(guān)系 . ..................................................................... 5
三、BROWSEINFO 對話框的缺陷 ................................................................................................... 5
四、參考資料 . .................................................................................................................................. 5
,一、BROWSEINFO 結(jié)構(gòu)
Visual C (VC)中,BROWSEINFO 結(jié)構(gòu)中包含有用戶選中目錄的重要信息。
(1)BROWSEINFO 結(jié)構(gòu)
●定義
typedef struct_browseinfo
{
HWND hwndOwner;
LPCITEMIDLIST pidlRoot;
LPSTR pszDisplayName;
LPCSTR lpszTitle;
UINT ulFlags;
BFFCALLBACK lpfn;
LPARAM lParam;
int iImage;
}BROWSEINFO,*PBROWSEINFO,*LPBROWSEINFO;
●成員變量
hwndOwner :瀏覽文件夾對話框的父窗體句柄。
pidlRoot :ITEMIDLIST 結(jié)構(gòu)的地址,包含瀏覽時的初始根目錄,而且只有被指定的目錄和其子目錄才顯示在瀏覽文件夾對話框中。該成員變量可以是NULL ,在此時桌面目錄將被使用。
它指向一個ITEMIDLIST 結(jié)構(gòu),作為在列表中顯示的文件夾的根目錄,如果為NULL 則默認(rèn)為Desktop 。ITEMIDLIST 結(jié)構(gòu)除了用在這里外,它還用作函數(shù)的返回值(參看函數(shù)原型) 。那為什么不用字符串來表示這個目錄呢,這個結(jié)構(gòu)怎樣表示一個目錄呢? 下面作一個簡單的介紹。
ITEMID 和ITEMIDLIST
Windows Shell 的一個功能在于管理并提供方法存取系統(tǒng)中的眾多對象,這些對象
,包括了文件,網(wǎng)路上的計算機(jī),控制面板程序,回收站等等,為了識別每一個對像,Windows Shell使用了Item ID來表示它們,而Item ID Lists用來表示一個對像的路徑。所以,ITEMID 和ITEMIDLIST 的關(guān)系類似于文件名和路徑的關(guān)系。如果只對文件系統(tǒng)而言的話,ITEMIDLIST 可以看成是路徑的另一中表示法,Windows Shell 也提供了函數(shù)來進(jìn)行轉(zhuǎn)化。
BOOL SHGetPathFromIDList( LPCITEMIDLIST pidl, LPSTR pszPath )
這個函數(shù)將一個ITEMLIST 轉(zhuǎn)換成文件系統(tǒng)中的路徑。
返回值
SHBrowseForFolder 的返回值也是一個指向ITEMIDLIST 的指針。這個ITEMIDLIST 正式表示了用戶所選擇的文件夾。如上所述,通過SHGetPathFromIDList ,就可以獲得一個文件夾Path 的字符串。
要注意的是返回的指針必須由應(yīng)用程序自己來釋放。并且,由于SHBrowseForFolder
是通過調(diào)用IMalloc Interface來分配Memory ,所以,也必須通過這個Interface 來釋放。 pszDisplayName :用來保存用戶選中的目錄字符串的內(nèi)存地址。該緩沖區(qū)的大小缺省是定義的MAX_PATH常量宏。
lpszTitle :該瀏覽文件夾對話框?qū)υ捒虻娘@示文本,用來提示該瀏覽文件夾對話框的功能、作用和目的。
ulFlags :該標(biāo)志位描述了對話框的選項。它可以為0,也可以是以下常量的任意組合: BIF_BROWSEFORCOMPUTER:返回計算機(jī)名。除非用戶選中瀏覽器中的一個計算機(jī)名,否則該對話框中的“OK ”按鈕為灰色。
BIF_BROWSEFORPRINTER:返回打印機(jī)名。除非選中一個打印機(jī)名,否則“OK ”按鈕為灰色。
BIF_BROWSEINCLUDEFILES:瀏覽器將顯示目錄,同時也顯示文件。
BIF_DONTGOBELOWDOMAIN:在樹形視窗中,不包含域名底下的網(wǎng)絡(luò)目錄結(jié)構(gòu)。 BIF_EDITBOX:瀏覽對話框中包含一個編輯框,在該編輯框中用戶可以輸入選中項的名字。
BIF_RETURNFSANCESTORS:返回文件系統(tǒng)的一個節(jié)點。僅僅當(dāng)選中的是有意義的節(jié)點時,“OK ”按鈕才可以使用。
BIF_RETURNONLYFSDIRS:僅僅返回文件系統(tǒng)的目錄。例如:在瀏覽文件夾對話框中,當(dāng)選中任意一個目錄時,該“OK ”按鈕可用,而當(dāng)選中“我的電腦”或“網(wǎng)上鄰居”等非有意義的節(jié)點時,“OK ”按鈕為灰色。
BIF_STATUSTEXT:在對話框中包含一個狀態(tài)區(qū)域。通過給對話框發(fā)送消息使回調(diào)函數(shù)設(shè)置狀態(tài)文本。
BIF_VALIDATE:當(dāng)沒有BIF_EDITBOX標(biāo)志位時,該標(biāo)志位被忽略。如果用戶在編輯框中輸入的名字非法,瀏覽對話框?qū)l(fā)送BFFM_VALIDATEFAILED消息給回調(diào)函數(shù)。 lpfn :應(yīng)用程序定義的瀏覽對話框回調(diào)函數(shù)的地址。當(dāng)對話框中的事件發(fā)生時,該對話框?qū)⒄{(diào)用回調(diào)函數(shù)。該參數(shù)可用為NULL 。
lParam :對話框傳遞給回調(diào)函數(shù)的一個參數(shù)指針。
iImage :與選中目錄相關(guān)的圖像。該圖像將被指定為系統(tǒng)圖像列表中的索引值。
,二、BROWSEINFO 的使用
(1)新建文件夾
我們在用“browseinfo ”產(chǎn)生的瀏覽文件夾的對話框中發(fā)現(xiàn)沒有“新建文件夾”這一個項目(默認(rèn)沒有) 。如何在“BROWSEINFO ”產(chǎn)生的“瀏覽文件夾”對話框中加入“新建文件夾”按鈕。就是指定BROWSEINFO 結(jié)構(gòu)中的ulFlags 變量為(BIF_NEWDIALOGSTYLE | BIF_EDITBOX)的組合。
例子如下:
#define BIF_NEWDIALOGSTYLE 0x0040
#define BIF_USENEWUI (BIF_NEWDIALOGSTYLE | BIF_EDITBOX) void SelectFolder(HWND hWnd,CString& strSelectPath) {
BROWSEINFO bifolder;
char FileName[MAX_PATH];
ZeroMemory(&bifolder,sizeof(BROWSEINFO));
bifolder.hwndOwner = hWnd;
bifolder.pszDisplayName = FileName;
bifolder.lpszTitle="請選擇文件夾";
bifolder.ulFlags= BIF_USENEWUI;
LPITEMIDLIST idl=SHBrowseForFolder(&bifolder);
if(idl==NULL)
return;
SHGetPathFromIDList(idl,FileName);
}
(2)回調(diào)函數(shù)
此處只針對路徑改變做了相應(yīng)處理,實際中可根據(jù)需要進(jìn)行相應(yīng)處理。 inline int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
_TCHAR szDir[_MAX_PATH];
switch(uMsg)
{
case BFFM_INITIALIZED: // 初始化
break;
case BFFM_SELCHANGED: // 路徑改變
if(SHGetPathFromIDList((LPITEMIDLIST)lParam,szDir))
{
,SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szDir);
}
break;
default:
break;
}
return 0;
}
(3)LPBROWSEINFO 與BROWSEINFO 的關(guān)系
LPBROWSEINFO 是BROWSEINFO 的指針結(jié)構(gòu),LPBROWSEINFO 只是一個指針,指針必須要指向一個特定的變量,指針才能使用的,即一定要初始化后才可以使用。
三、BROWSEINFO 對話框的缺陷
調(diào)用BROWSEINFO 對話框這個結(jié)構(gòu)體,缺點就是對話框標(biāo)題與對話框的間距很大。若想調(diào)整間距,得自己去寫一個類似瀏覽文件的對話框。我沒有自己寫過,因為只為這一個功能去實現(xiàn),有一些得不償失。
四、參考資料
參考資料全部來源于網(wǎng)絡(luò)