none
VS2012中重载CFileDialog的问题 RRS feed

  • 问题

  • 本人在C++开发中遇到一个关于重载CFileDialog的问题,请大家帮助。
    我在CFileDialog 上自定义了两个Radio button 用于让用户选择,以便程序决定SAVE出的文件的某些特性。所以我重载了CFileDialog, 并使用了m_ofn.lpfnHook。代码如下:

    CMyFileDlg::CMyFileDlg(LPCTSTR lpszFileName, LPCTSTR lpszFilter, LPCTSTR lpszDefExt,
    BOOL bOpenFileDialog, DWORD dwFlags, CWnd* pParentWnd)
    :CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd, 0, false) //TRUE
    {
    m_ofn.Flags |= OFN_EXPLORER | OFN_ENABLEHOOK | OFN_ENABLETEMPLATE
    |OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT;
    m_ofn.lpstrTitle = DEFAULT_DIALOG_CAPTION;
    m_ofn.hInstance = AfxGetInstanceHandle();
    m_ofn.lpstrFilter = DEFAULT_FILE_FILTER;
    m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_ADDED_RADIO_BTN_DLG);
    m_ofn.lpfnHook = (LPOFNHOOKPROC)ComDlgPreviewProc;
    m_strDefaultPath = getDefaultPath();
    m_ofn.lpstrInitialDir = m_strDefaultPath;
    }

    直到VS2010上这段代码都能正常运行。到了VS2012上,正常编译运行后发现整个对话框不能弹出了。试着将bVistaStyle 设成 TRUE, CFileDialog可以弹出,但是我自己定义的那两个radio button不见了。查阅MSDN后发现当bVistaStyle 设成 TRUE,即VISTA模式下是不支持m_ofn.lpfnHook 等用法的。所以还是想用回 bVistaStyle=FALSE, 能告诉我为什么在这种情况下dialog不出来吗?
    在VS2010和VS2012上分别debug 了一下,发现2010 在dlgfile.cpp的754行是nResult = ::AfxCtxGetSaveFileName(&m_ofn); 而2012的相应位置 dlgfile.cpp的773行是nResult = GetSaveFileName(&m_ofn);
    难道非得用IFileOpenDialog等COM接口形式重新实现这些Dialog吗?希望大家给出中肯意见,谢谢!
    2014年9月3日 11:03

答案