HOWTO自定义绘制一个MFC菜单的DocTemplate
问题描述:
我intialize我的MFC应用程序的视图这一行:HOWTO自定义绘制一个MFC菜单的DocTemplate
CSingleDocTemplate pDocTemplate(
new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CMyDataView)
)
);
AddDocTemplate(pDocTemplate);
IDR_MAINFRAME是我的MainMenu标识符。 使这个菜单自定义绘制的最佳方式是什么?我已经有了一门来自CMenu的课程,它对于contextmenus来说非常棒。不同之处在于我自己创建了我的contextmenus,而这个菜单是由框架创建的。
要覆盖MainMenu的,我想:
customMenu.LoadMenu(IDR_MAINFRAME);
customMenu.ChangeToOwnerDraw(customMenu, *m_MenuProperties);
m_pMainWnd->SetMenu(&customMenu);
,但不知何故,第一个项目(这是弹出窗口)时,MeasureItem没有在customMenu类实例化解雇,导致在一个小广场上点击开启和不同按钮的文字相互重叠。
MENUITEMs按预期方式显示,但对于每个子菜单(以及subsub和sububsubmenus)的POPUP,样式错误(读取:MeasureItem未调用)。对于sub,subsub和sububsubmenus中的MENUITEMS,我从框架接收一个MeasureItem调用。
答
感谢您的评论。原来我在我的CMenu派生类中有一个错误。我使用了codeguru的代码示例。 在那里,ModifyMenu发送POPUP菜单的ID 0,而不是POPUP菜单的真实ID。 void CWnd::OnMeasureItem(...)
搜索要测量的菜单,但找不到任何东西(它看起来是0,因为ModifyMenu告诉他这样做,但实际的POPUP菜单有一些其他ID),并返回NULL。如果你在你的菜单中分离器,它会找到衡量一个菜单,因为隔板具有ID为0
的解决方案如下:
- 而不是发送0,发送
reinterpret_cast<UINT>(menu.GetSubMenu(i)->GetSafeHmenu())
作为ID (wincore.cpp中的AFX_STATIC CMenu* AFXAPI _AfxFindPopupMenuFromID(CMenu* pMenu, UINT nID)
以相同方式检查ID)。 - 另外,添加标志MF_POPUP。
我想MFC会动态地创建Doc(子)菜单。你可以尝试拦截WM_INITMENUPOPUP并从那里自定义绘制它们。 – VuVirt
你的'CMainFrame'派生自哪一类?如果它是'CFrameWndEx' |'CMDIFrameWndEx',并且您正在使用'CMFCMenubar',那么您很可能无法按照您想要的方式工作,因为MFC Feature Pack会覆盖正常菜单的行为。 – sergiol