• 关于今天在公司重写的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

  • 相关阅读:
    修改nuget包默认存放路径,避免增加C盘的负担
    .Net Core 3.0 (一):安装Vs2019
    .NET Core 学习资料
    SQLSERVER查询整个数据库中某个特定值所在的表和字段的方法
    MySql 时间查询
    如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响?
    SqlServer 获取工作日(周六、周日休息,周六日不休息,周六不休息)
    SQL Server 删除数据库中表数据
    SQL Server 删除数据库所有表和所有存储过程
    摘要
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/3375277.html
Copyright © 2020-2023  润新知