选择目录的两种方法
关键字:选择目录,SHBrowseForFolder,SHGetPathFromIDList,SelectDirectory
作者:佚名 更新:2002-11-01 浏览:4618
在我们的应用程序中经常需让用户选择目录,如杀毒软件中用户选择处理目录等。这就涉及目录的选择,我们可使用如下方法之一让用户选择目录:
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; //只显示文件系统文件夹
// 本文转自 C++Builder研究 - http://www.ccrun.com/article.asp?i=152&d=kn865g
br> 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 "";
}
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; //只显示文件系统文件夹
// 本文转自 C++Builder研究 - http://www.ccrun.com/article.asp?i=152&d=kn865g
br> 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 "";
}