zoukankan      html  css  js  c++  java
  • 关于今天在公司重写的Menu

    在CDrawMenu类中重写了两个函数 DrawItem和MeasureItem。

    在MeasureItem中可以设置的有LPMEASUREITEMSTRUCT。

    typedef struct tagMEASUREITEMSTRUCT {
       UINT CtlType;
       UINT CtlID;
       UINT itemID;
       UINT itemWidth;
       UINT itemHeight;
       DWORD itemData
    } MEASUREITEMSTRUCT;

    对于CtlType这个参数,在这个函数里面不用设置,因为这个是ODT_MENU

    itemID是记录设置进来重绘的菜单项的ID号

    接下来的宽和高是设置该菜单的每个项的宽和高,并不是设置整体菜单的宽和高。

    最后一个参数是itemData这个是存放Menu的内容。如果在这里没有设置内容。则在DrawItem就没办法获取到该Menu项的值了。

    所以在对这个MeasureItem进行重写要当心,一不小心就无法获取到值。

    在DrawItem中

     1 抄自http://blog.163.com/Tigerhu_2004/blog/static/2031437120119189470256/
     2 void CNewMenu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
     3 {
     4  CRect rect=lpDrawItemStruct->rcItem;
     5  CDC dc;
     6  dc.Attach(lpDrawItemStruct->hDC);
     7  dc.FillSolidRect(rect,RGB(0,166,170));
     8  CFont Font;
     9  Font.CreatePointFont(125,"宋体");//创建字体
    10  dc.SelectObject(&Font);
    11  CString *pText=(CString *)lpDrawItemStruct->itemData;
    12  if(lpDrawItemStruct->itemState&ODS_SELECTED)
    13    dc.FillSolidRect(rect,RGB(80,89,202));//菜单被选中
    14  dc.SetTextColor(RGB(10,0,181));//设置文本颜色
    15  dc.DrawText(*pText,rect,DT_VCENTER|DT_LEFT|DT_SINGLELINE);
    16  dc.Detach();
    17 
    18 }
    View Code

    该楼主在写这段代码的时候也有一个地方是出错的就是CFont没有进行释放。

    CFont Font;
     Font.CreatePointFont(125,"宋体");//创建字体
     dc.SelectObject(&Font);

    在这之后应该要添加:font.DeleteObject()来释放创建的字体。否则在第二次调用这个函数的时候程序会崩(这里不是说该楼主的不是)

    在手动进行添加菜单的时候要设定MF_OWNERDRAW否则无法调用上述的两个函数,需要自己手动调用ModifyMenu才能够进行重绘。

    在某个地方创建

    CDrawMenu mainMenu;

    CDrawMenu subMenu;

    subMenu.CreatePopupMenu();

    subMenu.appendMenu(MF_STRING|MF_OWNERDRAW, 1, "sub1");

    subMenu.appendMenu(MF_STRING|MF_OWNERDRAW, 2, "sub2");

    subMenu.appendMenu(MF_STRING|MF_OWNERDRAW, 3, "sub3");

    mainMenu.CreatePopupMenu();

    mainMenu.appendMenu(MF_POPUP|MF_OWNERDRAW, (UINT_PTR)subMenu.m_hMenu, "mainMenu");

    mainMenu.TrackPopupMenu(TPM_RIGHTALLGN, 30, 30, this);

    在上面中,记得在每个appendMenu中加MF_OWNERDRAW,否则没加的项就无法调用自己重写的DrawItem和MeasureItem

  • 相关阅读:
    LeetCode 227. Basic Calculator II
    LeetCode 224. Basic Calculator
    LeetCode 103. Binary Tree Zigzag Level Order Traversal
    LeetCode 102. Binary Tree Level Order Traversal
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode 169. Majority Element
    LeetCode 145. Binary Tree Postorder Traversal
    LeetCode 94. Binary Tree Inorder Traversal
    LeetCode 144. Binary Tree Preorder Traversal
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/3375277.html
Copyright © 2011-2022 走看看