WEB开发网
开发学院软件开发VC 完美实现真彩自绘菜单 阅读

完美实现真彩自绘菜单

 2008-01-19 20:23:56 来源:WEB开发网   
核心提示: 2、MFC框架调用GetMenu()->DrawItem()就相当于调用了CMenuEx::DrawItem()来实现自绘菜单控件的自绘操作(不懂??,这正是C++的虚拟的妙用,完美实现真彩自绘菜单(2),指向派生类对象的基类指针可以调用派生类的虚拟函数,多么伟大的发明,(很令我失望,这也是促使我自己动手

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
  {
    ......
  }
  ......
}    

  • 当菜单项中含有子菜单(submenu),而不含有分割条的时候,子菜单项的高度不可调。原因为原CMenuEx程序中将分割条的原COMMAND ID(0)改为菜单项的COMMADN ID(-1), 以欺骗MFC框架调用CMenuEx::MeasureItem()来计算子菜单项(submenu)的高度。(很令我失望,这也是促使我自己动手重写该类的原因之一。不信看程序,看图)

    上一页  1 2 3 4  下一页
  • Tags:完美 实现 真彩

    编辑录入:爽爽 [复制链接] [打 印]
    赞助商链接