关于自绘菜单
我自己实现一个菜单类CMyMenu,从CMenu继承,并重载了DrawItem和MeasureItem两个虚函数。
然后给CMainFrame类加成员CMyMenu m_MyMenu;
在CMainFram::OnCreate()中加入如下代码:
m_MyMenu.CreateMenu();
CMyMenu m_PopupMenu;
m_PopupMenu.CreatePopupMenu();
m_PopupMenu.AppendMenu(MF_OWNERDRAW | MF_STRING,23450,"New");
m_PopupMenu.AppendMenu(MF_OWNERDRAW | MF_STRING,23451,"Open");
m_MyMenu.AppendMenu(MF_POPUP,(UINT)m_PopupMenu.m_hMenu,"File");
m_PopupMenu.Detach();
SetMenu(&m_MyMenu);
这样便创建了菜单来替代自带的菜单。
但是菜单没有却没有按我的实现来自绘。原因是CMyMenu::DrawItem和CMyMenu::Measure函数没有被调用。但是MSDN明明说CMenu::DrawItem和CMenu::Measure是框架自动调用的阿。
这是CWnd::OnDrawItem的实现代码:
void CWnd::OnDrawItem(int /*nIDCtl*/, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if (lpDrawItemStruct->CtlType == ODT_MENU)
{
CMenu* pMenu = CMenu::FromHandlePermanent(
(HMENU)lpDrawItemStruct->hwndItem);
if (pMenu != NULL)
{
pMenu->DrawItem(lpDrawItemStruct);
return; // eat it
}
}
else
{
// reflect notification to child window control
if (ReflectLastMsg(lpDrawItemStruct->hwndItem))
return; // eat it
}
// not handled - do default
Default();
}
从这里也可以看出系统的确应该调用派生类的函数阿,可是为什么我的代码不行呢?
各位大虾请给出答案。