在我們的應用程序中經常需讓用戶選擇目錄,如殺毒軟件中用戶選擇處理目錄等。這就涉及目錄的選擇,我們可使用如下方法之一讓用戶選擇目錄:
1、使用SHBrowseForFolder和SHGetPathFromIDList函數
函數原形申明如下:
WINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolder(LPBROWSEINFO lpbi);
WINSHELLAPI BOOL WINAPI SHGetPathFromIDList(LPCITEMIDLIST pidl, LPSTR pszPath); LPBROWSEINFO和LPITEMIDLIST的結構請參考Win32文檔。這種方法選取目錄可獲得Windows桌面下所有可用的目錄,包括網絡鄰居中其它計算機的共享目錄等,但不可新建目錄。下面的例程可讓用戶選擇目錄,該例程返回指向所選擇目錄的全路徑字符串。
#include < shlobj.h >
//用WINAPI函數彈出一個選擇文件夾對話框
AnsiString SelectFolder(AnsiString Caption)
{
BROWSEINFO bi; //控制Browse對話框上屬性的結構體
LPITEMIDLIST ItemID;
char sDir[MAX_PATH]; //MAX_PATH:系統常量,指最大路徑長度
char FolderName[MAX_PATH];
memset(&bi, 0, sizeof(BROWSEINFO)); //清零
memset(sDir, 0, MAX_PATH);
bi.hwndOwner = Application->Handle; //父窗口句柄
bi.pszDisplayName = FolderName; //存放路徑的緩沖區
bi.lpszTitle = Caption.c_str(); //對話框標題
bi.ulFlags = BIF_RETURNONLYFSDIRS; //只顯示文件系統文件夾
ItemID = SHBrowseForFolder(&bi);
if(ItemID==NULL)
return "";
SHGetPathFromIDList(ItemID, sDir);
GlobalFreePtr(ItemID);
AnsiString PathName=String(sDir);
if(PathName.IsEmpty())
return "";
if(strcmp(PathName.AnsiLastChar(),"\\")!=0)
PathName+="\\"; //添加路徑符
return PathName;
}
//--------------------------------------------------------------------------
我們可作如下調用得到選擇的目錄名:
AnsiString DestPathName=SelectFolder("選擇導出梯度數據的目的目錄");
2、使用SelectDirectory函數。
C++Builder提供的函數SelectDirectory可實現目錄名的選擇,它顯示的是類似“打開”/“保存”的對話框,但其優點是可使用/不使用鍵盤輸入目錄名,並允許創建新目錄,缺點是界面為英文。其原形定義如下:
extern PACKAGE bool __fastcall SelectDirectory(AnsiString &Directory, TSelectDirOpts Options, int HelpCtx);
下面的例程SelectDir允許您選擇目錄:
#include < FileCtrl.hpp >
AnsiString SelectDir(AnsiString Dir)
{
if(SelectDirectory(Dir, TSelectDirOpts() << sdAllowCreate << sdPerformCreate << sdPrompt,0))
return Dir;
else return "";
}