MFC使用button选择文件(夹)的实现

1.打开文件

	CFileDialog ObjFile(TRUE, NULL, NULL, OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY,
_T("图片文件(*.png; *.jpg; *.jpeg; *.bmp)|*.png; *.jpg; *.jpeg; *.bmp|所有文件(*.*)|*.*||"), NULL);
	if (IDOK == ObjFile.DoModal())
	{
		m_strImgPath = ObjFile.GetPathName();
        }

在界面上使用这个按钮时, 会出现主界面的的标题栏变灰,也就是失焦,解决办法:

  • 如果使用VS2008以上的版本就会有这个问题,这里最直接的处理办法:

       将界面的CDialogEx全部替换成CDialog就解决(主观认为是扩展窗口类的小bug)

  • 如果需要用到扩展类的一些特性,也可以用下面的方式替代:
       CFileDialog ObjFile(TRUE, NULL, NULL, OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY,
                                         NULL, theApp.GetMainWnd()->GetWindow (GW_HWNDPREV));
       if (IDOK == ObjFile.DoModal())
       { 
            ...
            SetFocus();
        }

 

2.打开文件夹

	CString strDirPath;
	BROWSEINFO stDirInfo;
	::ZeroMemory(&stDirInfo, sizeof(stDirInfo));

	stDirInfo.pidlRoot = 0;
	stDirInfo.lpszTitle = _T("选择文件存储路径:");
	stDirInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_EDITBOX | BIF_DONTGOBELOWDOMAIN;
	stDirInfo.lpfn = nullptr;

	LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&stDirInfo);
	if (nullptr != lpidlBrowse)
	{
		if (::SHGetPathFromIDList(lpidlBrowse, strDirPath.GetBuffer(MAX_PATH)))
		{
		    //获得文件夹路径strDirPath,由程式作者实现功能
                }
		::CoTaskMemFree(lpidlBrowse);
	}

 

你可能感兴趣的:(MFC)