HOWTO自定义绘制一个MFC菜单的DocTemplate

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调用。

+0

我想MFC会动态地创建Doc(子)菜单。你可以尝试拦截WM_INITMENUPOPUP并从那里自定义绘制它们。 – VuVirt

+0

你的'CMainFrame'派生自哪一类?如果它是'CFrameWndEx' |'CMDIFrameWndEx',并且您正在使用'CMFCMenubar',那么您很可能无法按照您想要的方式工作,因为MFC Feature Pack会覆盖正常菜单的行为。 – sergiol

感谢您的评论。原来我在我的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。