龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

VC中单文档框架删除菜单的调试经历(4)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
在LoadMenu的时候出错了,所以执行PostNcDestroy()函数了。找到了错误所在,怎么修改代码呢? 仔细阅读,发现Create()函数是在CFrameWnd类中,而CMainFrame类的父类就
 在LoadMenu的时候出错了,所以执行PostNcDestroy()函数了。找到了错误所在,怎么修改代码呢?

  仔细阅读,发现Create()函数是在CFrameWnd类中,而CMainFrame类的父类就是CFrameWnd类,再一查,发现了CFrameWnd::Create()是虚函数,所以只要我们在CMainFrame中实现Create(),并将其中加载菜单的相关代码去掉应该就可以了,修改代码如下:

BOOL CMainFrame::Create(LPCTSTR lpszClassName,
                    LPCTSTR lpszWindowName,
                    DWORD dwStyle /*= WS_OVERLAPPEDWINDOW*/,
                    const RECT& rect/* = rectDefault*/,
                    CWnd* pParentWnd /*= NULL*/,        // != NULL for popups
                    LPCTSTR lpszMenuName/* = NULL*/,
                    DWORD dwExStyle/* = 0*/,
                    CCreateContext* pContext/* = NULL*/)
{
    HMENU hMenu = NULL;
    if (lpszMenuName != NULL)
    {
    }
    m_strTitle = lpszWindowName;    // save title for later
    if (!CreateEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle,
        rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
        pParentWnd->GetSafeHwnd(), hMenu, (LPVOID)pContext))
    {
        TRACE(traceAppMsg, 0, "Warning: failed to create CFrameWnd. ");
        if (hMenu != NULL)
            DestroyMenu(hMenu);
        return FALSE;
    }
}
  编译,运行,成功了。

  以前写代码总是查上网,翻书,看帮助查资料,现在才发现源代码也是很好的资料。上网,翻阅书籍查资料固然不错,但是那是学习别人已有的知识,自己解决问题的能力没什么大的提高。通过研究源代码,我们可以在没有任何书籍,文档的情况下解决问题。这是我第一次深入跟踪到MFC源代码内部进行调试,希望对像我一样的初学者有帮助。

精彩图集

赞助商链接