当前位置:C++技术网 > 资讯 > Win7界面的和API实现的老界面文件夹选择对话框代码实现详细讲解

Win7界面的和API实现的老界面文件夹选择对话框代码实现详细讲解

更新时间:2015-06-26 21:18:34浏览次数:1+次

    使用CFolderPickerDialog类实现的文件夹选择对话框是Vista及Win7及以上系统的新样式,win7下面的界面如下:

win7文件夹选择对话框界面
    而使用Shell API实现的则是一下界面:
传统的SDK文件夹选择对话框界面
    CFolderPickerDialog类定义于头文件afxdlgs.h中,继承于CFileDialog类,是实现Vista、Win7的文件夹选择对话框的类。只适用于Vista及更高版本的操作系统。
    而使用Windows Shell API方式SHBrowseForFolder和SHGetPathFromIDList两个函数的组合实现的是以前版本的文件夹选择对话框。适用于所有的操作系统,且界面在每个系统可能有所不同。

    在VS2008中,我按照MSDN说明,包含了afxdlgs.h的头文件,但是却始终提示CFolderPickerDialog为不能识别的标识符。然而在VS2010确实可以识别的。然后我分别对VS2008和VS2010中的afxdlgs.h头文件进行跟踪,查看afxdlgs.h文件的内容,这才明白,为什么VS2008中不能识别CFolderPickerDialog。下面来看看VS2008和VS2010中的afxdlgs.h文件内容。我们不罗列里面的所有内容,下面我描述一下文件的内容。
    VS2008中,实现了一个CCommonDialog类,继承于CDialog。在afxdlgs.h文件中,实现的类CFileDialog、CFontDialog、CColorDialog、CPageSetupDialog、CPrintDialog、CFindReplaceDialog都是继承于CCommonDialog的,CPrintDialogEx继承于CCommonDialog,IPrintDialogCallback,IObjectWithSite。还有,CPropertyPage继承于CDialog,CPropertySheet继承于CWnd。以上就是所有内容。我们可以看出,实现的类中,并没有看到CFolderPickerDialog这个类,所以自然会提示不识别的标识符CFolderPickerDialog了。
    VS2010中,可以看到class CFolderPickerDialog : public CFileDialog{...}这个类似定义,因此在VS2010中就可以使用这个类,而在VS2008无法使用。所以,要实现Win7风格的文件夹选择对话框,就要使用VS2010或以上版本。
    Win7风格的文件夹选择对话框实现代码示例如下:

CFolderPickerDialog fpd;
fpd.DoModal();
m_Folder_Path.Format(_T("%s\\"),fpd.m_ofn.lpstrFile);
if (m_Folder_Path.IsEmpty())return;
    而使用Shell API实现的旧风格的文件夹选择对话框的代码如下:
TCHAR szPath[MAX_PATH];     //存放选择的目录路径 
ZeroMemory(szPath, sizeof(szPath));   

BROWSEINFO bi;   
bi.hwndOwner = m_hWnd;   
bi.pidlRoot = NULL;   
bi.pszDisplayName = szPath;   
bi.lpszTitle = _T("请选择要保存图片文件的目录:");   
bi.ulFlags = 0;   
bi.lpfn = NULL;   
bi.lParam = 0;   
bi.iImage = 0;   
//弹出选择目录对话框
LPITEMIDLIST lp = SHBrowseForFolder(&bi);   

if(lp && SHGetPathFromIDList(lp, szPath))   
{
    m_strSavePath= szPath;

    int len = m_strSavePath.GetLength();

    /* - 给路径结尾添加反斜杠同时添加一个子文件夹C++技术网 - */
    if(m_strSavePath[len-1]=='\\')//-选择根目录如C:\,已带末尾反斜杠
        m_strSavePath += _T("C++技术网\\");
    else// - 选择的文件夹,末尾没带反斜杠\,要自己加上
        m_strSavePath += _T("\\C++技术网\\");
}

    在Shell API中的实现,进行了文件夹结尾的反斜杠添加处理,CFolderPickerDialog类的实现就自己按照下面的添加上去吧。