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

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