BROWSEINFO bi;
ZeroMemory( &bi, sizeof( bi ) );
bi.ulFlags = BIF_EDITBOX | BIF_RETURNONLYFSDIRS;
bi.pidlRoot = NULL; 
LPITEMIDLIST targetLocation = SHBrowseForFolder( &bi );
if ( targetLocation != NULL ) 
{
TCHAR targetPath[ MAX_PATH ];
SHGetPathFromIDList( targetLocation, targetPath );
}BIF_RETURNONLYFSDIRS加了为什么选择我的电脑时候OK还是能按下的?谁给说说谢谢

解决方案 »

  1.   

    不会吧?你把BIF_EDITBOX属性去掉试试
      

  2.   

    恩,好使了,但是EDITBOX也没有了,怎么让他既有EDITBOX又能实现BIF_RETURNONLYFSDIRS功能?
      

  3.   


    这个需要自己写BrowseCallbackProc了
    static int CALLBACK BrowseCallbackProc(
    HWND hwnd, 
    UINT uMsg, 
    LPARAM lParam, 
    LPARAM lpData
    )
    {
        if(uMsg==BFFM_SELCHANGED||uMsg==BFFM_INITIALIZED)
        {
    CString strDir;
    if(!::SHGetPathFromIDList((LPITEMIDLIST)lParam, strDir.GetBuffer(MIN_BUFFER_SIZE)))
    {
    ::SendMessage(hwnd, BFFM_ENABLEOK , 0, 0);
    }
    else
    {
    //这里可以判断下是否选中软盘、光驱之类的
    TCHAR cDriver[MIN_BUFFER_SIZE];
    DWORD dw = GetLogicalDriveStrings(MIN_BUFFER_SIZE, cDriver);
    for(int i = 0; i < dw; i += 4)
    {
    TCHAR cNow[4] = {cDriver[i],':','\\'};
    CString str1 = cNow;
    if(strDir == str1)
    {
    int nDriveType = GetDriveType(cNow);
    if(nDriveType == DRIVE_CDROM || nDriveType == DRIVE_REMOVABLE)
    {
    ::SendMessage(hwnd, BFFM_ENABLEOK , 0, 0);
    }
    }
    }
    }
    strDir.ReleaseBuffer();
        }
    return 0;
    }然后在你定义BROWSEINFO的时候bi.lpfn = BrowseCallbackProc;
      

  4.   


    这个需要自己写BrowseCallbackProc了
    static int CALLBACK BrowseCallbackProc(
    HWND hwnd, 
    UINT uMsg, 
    LPARAM lParam, 
    LPARAM lpData
    )
    {
        if(uMsg==BFFM_SELCHANGED||uMsg==BFFM_INITIALIZED)
        {
    CString strDir;
    if(!::SHGetPathFromIDList((LPITEMIDLIST)lParam, strDir.GetBuffer(MIN_BUFFER_SIZE)))
    {
    ::SendMessage(hwnd, BFFM_ENABLEOK , 0, 0);
    }
    else
    {
    //这里可以判断下是否选中软盘、光驱之类的
    TCHAR cDriver[MIN_BUFFER_SIZE];
    DWORD dw = GetLogicalDriveStrings(MIN_BUFFER_SIZE, cDriver);
    for(int i = 0; i < dw; i += 4)
    {
    TCHAR cNow[4] = {cDriver[i],':','\\'};
    CString str1 = cNow;
    if(strDir == str1)
    {
    int nDriveType = GetDriveType(cNow);
    if(nDriveType == DRIVE_CDROM || nDriveType == DRIVE_REMOVABLE)
    {
    ::SendMessage(hwnd, BFFM_ENABLEOK , 0, 0);
    }
    }
    }
    }
    strDir.ReleaseBuffer();
        }
    return 0;
    }然后在你定义BROWSEINFO的时候bi.lpfn = BrowseCallbackProc;
      

  5.   


    nDriveType == DRIVE_REMOVABLE,移动硬盘和SD卡不是也被干掉了?
      

  6.   


    你可以测试下,移动硬盘貌似不会干掉,会干掉U盘
    你要的只是选中“我的电脑”时候,OK不能点
    这里你可以完全管软盘或光驱之类的,因为若选择了软盘或光驱,程序会有提示的