如何防止SHBrowseForFolder()创建多个实例?

时间:2015-03-26 10:09:32

标签: visual-studio-2010 mfc

我正在开发一个应用程序,我添加了一个调用SHBrowseForFolder()函数的按钮(CButton)。但问题是该按钮仍然处于活动状态,并且还允许我单击我的父窗口。我也可以反复点击那个按钮和多个浏览窗口。

我想知道有什么方法可以在DoModal()方式中使用SHBrowseForFolder(),这样控件就不会返回父窗口,直到用户点击文件夹浏览窗口的Ok / Cancel按钮为止?点击一次或类似之后,我不想禁用该按钮。

我正在使用Visual Studio 2010。 提前致谢。

1 个答案:

答案 0 :(得分:2)

当然可以:

void CUtility::BrowseFolder(CWnd* pParentWnd, const CString& sTitle, CEdit& Edit)
{
  LPMALLOC pMalloc = NULL;
  ::SHGetMalloc(&pMalloc);

  TCHAR pBuffer[MAX_PATH] = {0};

  LPITEMIDLIST pidlRoot = NULL;

  BROWSEINFO bi;
  bi.hwndOwner = pParentWnd->m_hWnd;
  bi.pidlRoot = NULL;
  bi.pszDisplayName = pBuffer;
  bi.lpszTitle = sTitle;
  bi.ulFlags = BIF_USENEWUI;
  bi.lpfn = NULL;

  if((pidlRoot = ::SHBrowseForFolder(&bi)) == NULL)
    return;

  if(::SHGetPathFromIDList(pidlRoot, pBuffer))
    Edit.SetWindowText(pBuffer);

  if(pidlRoot)
    pMalloc->Free(pidlRoot);
}