By jingzhongrong
编程时的需要,我封装了一个类。由于BCB有些头文件中的结构定义与微软Windows.h中有些结构的定义相同,所以在使用的时候应该在文件最前的地方加上一句
#define NO_WIN32_LEAN_AND_MEAN
下面是类的头文件
#define NO_WIN32_LEAN_AND_MEAN
#ifndef CommonH
#define CommonH
#include <shlobj.h>
#include <vcl.h>
//---------------------------------------------------------------------------
class FolderBrowseDialog
{
// for user
// usage:
// declare:
// FolderBrowseDialog fd;
// set properties:
// fd.Title = "选择目录";
// fd.Execute(Application->Handle);
// result:
// fd.FolderName
// fd.FolderPath
private :
BROWSEINFO FInfo;
protected :
char FFolderName[260]; /**保存返回的目录名称*/
AnsiString FFolderPath; /**保存路径名*/
AnsiString __fastcall GetDialogTitle( void );
void __fastcall SetDialogTitle(AnsiString title);
AnsiString __fastcall GetFolderPath(void );
AnsiString __fastcall GetFolderName(void );
public :
/* *初始化调用句柄
@HwndOwner 调用者句柄
*/
FolderBrowseDialog(HWND HwndOwner);
FolderBrowseDialog(); //如果没有指定句柄,则需使用带参数的Execute函数
void __fastcall SetBrowseInfoFlags(UINT ulFlags); /**提供对FInfo的自定义*/
bool __fastcall Execute(void); //打开对话框
bool __fastcall Execute(HWND HwndOwner);
__property AnsiString Title={read=GetDialogTitle, write= SetDialogTitle};
__property AnsiString FolderName={read= GetFolderName};
__property AnsiString FolderPath={read= GetFolderPath};
};
#ifndef CommonH
#define CommonH
#include <shlobj.h>
#include <vcl.h>
//---------------------------------------------------------------------------
class FolderBrowseDialog
{
// for user
// usage:
// declare:
// FolderBrowseDialog fd;
// set properties:
// fd.Title = "选择目录";
// fd.Execute(Application->Handle);
// result:
// fd.FolderName
// fd.FolderPath
private :
BROWSEINFO FInfo;
protected :
char FFolderName[260]; /**保存返回的目录名称*/
AnsiString FFolderPath; /**保存路径名*/
AnsiString __fastcall GetDialogTitle( void );
void __fastcall SetDialogTitle(AnsiString title);
AnsiString __fastcall GetFolderPath(void );
AnsiString __fastcall GetFolderName(void );
public :
/* *初始化调用句柄
@HwndOwner 调用者句柄
*/
FolderBrowseDialog(HWND HwndOwner);
FolderBrowseDialog(); //如果没有指定句柄,则需使用带参数的Execute函数
void __fastcall SetBrowseInfoFlags(UINT ulFlags); /**提供对FInfo的自定义*/
bool __fastcall Execute(void); //打开对话框
bool __fastcall Execute(HWND HwndOwner);
__property AnsiString Title={read=GetDialogTitle, write= SetDialogTitle};
__property AnsiString FolderName={read= GetFolderName};
__property AnsiString FolderPath={read= GetFolderPath};
};
使用方法如下:
FolderBrowseDialog fd;
set properties:
fd.Title = "选择目录";
fd.Execute(Application->Handle);
获取结果
fd.FolderName
fd.FolderPath
下面是类的实现文件:
#include "Common.h" //上面头文件的名字
#define INFO_BUFFER_SIZE 32767
FolderBrowseDialog::FolderBrowseDialog(HWND HwndOwner)
{
memset( &FInfo,0,sizeof (BROWSEINFO));
memset(FFolderName,0,260 );
FInfo.hwndOwner = HwndOwner;
FInfo.pszDisplayName = FFolderName;
FInfo.lpszTitle = "请选择目录" ;
FInfo.ulFlags = BIF_RETURNONLYFSDIRS;
}
//---------------------------------------------------------------------------
FolderBrowseDialog::FolderBrowseDialog()
{
memset(&FInfo,0,sizeof (BROWSEINFO));
memset(FFolderName,0,260 );
FInfo.pszDisplayName = FFolderName;
FInfo.lpszTitle = "请选择目录" ;
FInfo.ulFlags = BIF_RETURNONLYFSDIRS;
}
//---------------------------------------------------------------------------
void __fastcall FolderBrowseDialog::SetBrowseInfoFlags(UINT ulFlags)
{
FInfo.ulFlags = ulFlags;
}
//---------------------------------------------------------------------------
bool __fastcall FolderBrowseDialog::Execute()
{
LPITEMIDLIST ItemID;
char SelectDir[INFO_BUFFER_SIZE];
memset(SelectDir,0 ,INFO_BUFFER_SIZE);
ItemID = SHBrowseForFolder(& FInfo);
if (ItemID)
{
SHGetPathFromIDList(ItemID,SelectDir);
GlobalFree(ItemID);
FFolderPath = AnsiString(SelectDir);
return true ;
}
else
{
return false ;
}
}
//---------------------------------------------------------------------------
bool __fastcall FolderBrowseDialog::Execute(HWND HwndOwner)
{
FInfo.hwndOwner = HwndOwner;
if (Execute())
{
return true ;
}
else
{
return false ;
}
}
//---------------------------------------------------------------------------
AnsiString __fastcall FolderBrowseDialog::GetDialogTitle()
{
return FInfo.lpszTitle;
}
//---------------------------------------------------------------------------
AnsiString __fastcall FolderBrowseDialog::GetFolderName()
{
return AnsiString(FFolderName);
}
//---------------------------------------------------------------------------
void __fastcall FolderBrowseDialog::SetDialogTitle(AnsiString title)
{
FInfo.lpszTitle = title.c_str();
}
//---------------------------------------------------------------------------
AnsiString __fastcall FolderBrowseDialog::GetFolderPath()
{
return FFolderPath;
}
// ---------------------------------------------------------------------------
#define INFO_BUFFER_SIZE 32767
FolderBrowseDialog::FolderBrowseDialog(HWND HwndOwner)
{
memset( &FInfo,0,sizeof (BROWSEINFO));
memset(FFolderName,0,260 );
FInfo.hwndOwner = HwndOwner;
FInfo.pszDisplayName = FFolderName;
FInfo.lpszTitle = "请选择目录" ;
FInfo.ulFlags = BIF_RETURNONLYFSDIRS;
}
//---------------------------------------------------------------------------
FolderBrowseDialog::FolderBrowseDialog()
{
memset(&FInfo,0,sizeof (BROWSEINFO));
memset(FFolderName,0,260 );
FInfo.pszDisplayName = FFolderName;
FInfo.lpszTitle = "请选择目录" ;
FInfo.ulFlags = BIF_RETURNONLYFSDIRS;
}
//---------------------------------------------------------------------------
void __fastcall FolderBrowseDialog::SetBrowseInfoFlags(UINT ulFlags)
{
FInfo.ulFlags = ulFlags;
}
//---------------------------------------------------------------------------
bool __fastcall FolderBrowseDialog::Execute()
{
LPITEMIDLIST ItemID;
char SelectDir[INFO_BUFFER_SIZE];
memset(SelectDir,0 ,INFO_BUFFER_SIZE);
ItemID = SHBrowseForFolder(& FInfo);
if (ItemID)
{
SHGetPathFromIDList(ItemID,SelectDir);
GlobalFree(ItemID);
FFolderPath = AnsiString(SelectDir);
return true ;
}
else
{
return false ;
}
}
//---------------------------------------------------------------------------
bool __fastcall FolderBrowseDialog::Execute(HWND HwndOwner)
{
FInfo.hwndOwner = HwndOwner;
if (Execute())
{
return true ;
}
else
{
return false ;
}
}
//---------------------------------------------------------------------------
AnsiString __fastcall FolderBrowseDialog::GetDialogTitle()
{
return FInfo.lpszTitle;
}
//---------------------------------------------------------------------------
AnsiString __fastcall FolderBrowseDialog::GetFolderName()
{
return AnsiString(FFolderName);
}
//---------------------------------------------------------------------------
void __fastcall FolderBrowseDialog::SetDialogTitle(AnsiString title)
{
FInfo.lpszTitle = title.c_str();
}
//---------------------------------------------------------------------------
AnsiString __fastcall FolderBrowseDialog::GetFolderPath()
{
return FFolderPath;
}
// ---------------------------------------------------------------------------
添加到工程中便可以使用了