选择目录的两种方法

 

选择目录的两种方法

关键字:选择目录,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 "";

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值