問題: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可以居中了。