BCB6下SelectDirectory窗口居中問題的解決方案

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章