问题:SelectDirectory在BCB6里不居中,总显示在右下位置
尝试解决方案一:SelectDirectory是重载函数,所以尝试用其他参数格式的SelectDirectory
两种参数类型:
bool __fastcall SelectDirectory(const AnsiString Caption,const WideString root,AnsiString &Directory);
bool __fastcall SelectDirectory(AnsiString &Directory,TSelectDirOpts Options,int HelpCtx);
第一个,也就是我用的,不居中显示,所以弃用
第二个,我也试了,确实是居中的,但是界面太丑
所以第一次尝试失败。
尝试解决方案二:查了资料说可以通过BROWSEINFO来做
下面附上我查过资料后写的代码:
AnsiString SelectDirectory(AnsiString Caption)
{
BROWSEINFO BI;
LPITEMLIST TtemID;
TCHAR DIR[MAX_PATH];
TCHAR FolderName[MAX_PATH];
memset(&BI,0,sizeof(BROWSEINFO));
memset(Dir,0,MAX_PATH);
memset(FolderName,0,MAX_PATH);
BI.HwnderOwner = Application->Handle;
BI.pszDisplayName = FolderName;
BI.lpszTitle = Caption.c_str();
BI.ulFlags = BIF_RETURNONLYFSDIRS;
ItemID = SHBrowseForFolder(&BI);
if(ItemID == NULL)
{
return "";
}
SHGetPathFromIDList(ItemID,Dir);
GlobalFreePtr(ItemID);
AnsiString PathName = String(Dir);
if(PathName == NULL || PathName.IsEmpty())
{
return "";
}
if(strcmp(PathName.AnsiLasrChar(),"\\") == 0)
{
PathName = PathName.SubString(1,PathName.Length()-1);
}
return PathName;
}
代码写好,很happy,满心欢喜,以为搞定,可是还是和第一个解决方案里的第一个SelectDirectory一样效果,不居中。最后才知道原理第一个SelectDirectory就是调用的系统函数,深深觉得自己被坑了,反正我这个没做好,如果有大侠做好了,可以分享一下,万分感谢。
现在没办法了,就想到了一个折衷的方法,就是用OpenDialog来模拟实现了,首先设置OpenDialog的Options的ofNoValidate设为true,
Filter 设置为“*.*|*.*”,FileName设为*.*
这样便可获得文件路径,但是会包含文件名,只需截取掉即可。
问题解决,虽然不是很完美。
据说C++ Builder 2007以后SelectDirectory可以居中了。