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
就可以了。这很有魅力,谢谢!