我想覆盖从CMenu
派生的类的渲染。该课程目前看起来像这样:
class CMyMenu : public CMenu {
public:
CMyMenu() {}
virtual ~CMyMenu() {}
protected:
afx_msg void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) {
}
afx_msg void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) {
lpMeasureItemStruct->itemWidth = 32;
lpMeasureItemStruct->itemHeight = 32;
}
};
如果我然后创建一个这样的菜单:
menu->CreatePopupMenu();
menu->AppendMenu(MF_ENABLED | MF_STRING, IDC_HELLO, L"Hello");
菜单有效,我得到了一行" Hello"在里面。但是,如果我尝试将其更改为所有者绘制按钮,而是执行:
menu->CreatePopupMenu();
menu->AppendMenu(MF_ENABLED | MF_OWNER_DRAWN, IDC_HELLO);
我在执行::TrackPopupMenu
时得到一个断言:
Debug Assertion Failed!
Program: C:\Windows\system32\mfc120ud.dll
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\winmenu.cpp
Line: 67
如果我查看winmenu.cpp
源代码,错误似乎就在这一行:
void CMenu::AssertValid() const
{
CObject::AssertValid();
ASSERT(m_hMenu == NULL || ::IsMenu(m_hMenu)); <---------- THIS FIRES
}
然而,在调用AssertValid
之前在我的菜单上手动调用::TrackPopupMenu
不会触发断言。
我做错了什么?