完美实现真彩自绘菜单
2008-01-19 20:23:56 来源:WEB开发网2、MFC框架调用GetMenu()->DrawItem()就相当于调用了CMenuEx::DrawItem()来实现自绘菜单控件的自绘操作(不懂??,这正是C++的虚拟的妙用,指向派生类对象的基类指针可以调用派生类的虚拟函数,多么伟大的发明,谁想出来的???)。与子菜单是否为弹出菜单(popupmenu)没有什么关系。以下是摘自WINCORE.CPP的一段程序,也就是WM_MEASUREITEM消息的默认流向的地方,相信大家会从中看出一些端倪。 void CWnd::OnMeasureItem(int /*nIDCtl*/, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
if (lpMeasureItemStruct->CtlType == ODT_MENU)
{
......
// 如果没有主菜单
if (pThreadState->m_hTrackingWindow == m_hWnd)
{
......
}
else
{
// 如果有主菜单
pMenu = GetMenu(); // 找到窗体的主菜单,注意,pMenu的是CMenu* 类型
}
// 在当前菜单中寻找ID匹配的菜单项
pMenu = _AfxFindPopupMenuFromID(pMenu, lpMeasureItemStruct->itemID);
if (pMenu != NULL)
// 如果找到,就调用MeasureItem()
// 这就是所谓的基类指针指向派生类对象,可以调用派生类虚拟函数的情况了
pMenu->MeasureItem(lpMeasureItemStruct);
else
TRACE1("Warning: unknown WM_MEASUREITEM for menu item 0x%04X.\n",
lpMeasureItemStruct->itemID);
}
else
{
......
}
......
}
更多精彩
赞助商链接