C++ 所有者绘制的CMenu
我想覆盖从C++ 所有者绘制的CMenu,c++,mfc,C++,Mfc,我想覆盖从CMenu派生的类的呈现。该类当前看起来如下所示: class CMyMenu : public CMenu { public: CMyMenu() {} virtual ~CMyMenu() {} protected: afx_msg void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { } afx_msg void MeasureItem(LPMEASUREITEMSTRUCT lpMeasur
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");
如果我随后创建如下菜单:
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");
菜单正常,我只看到一行“你好”。但是,如果我尝试通过执行以下操作将其更改为所有者绘制的按钮:
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
}
void CMenu::AssertValid()常量
{
CObject::AssertValid();
ASSERT(m|hMenu==NULL | |::IsMenu(m|hMenu));虽然这不是你问题的答案,但似乎调用CMenu::TrackPopupMenu
而不是全局::TrackPopupMenu
就可以了。这很有魅力,谢谢!