所有者绘制菜单

时间:2014-07-03 13:51:19

标签: c++ mfc

我想覆盖从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不会触发断言。

我做错了什么?

0 个答案:

没有答案