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

  • 相关阅读:
    如何查看linux端口被哪个进程占用
    Beego 结合 GORM 操作 Mysql 数据库
    Linux Go proxy 设置
    working directory is not part of a module
    依赖注入 gin项目的目录结构说明
    详解django中使用定时任务的方法
    input 原声上传文件 file转化为binary对象发送给后台
    vue篇之事件总线(EventBus)
    小程序路由遇到的问题(eventChannel.emit is not a function报错)
    小程序组件(弹窗组件以及插槽使用)
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/3375277.html
Copyright © 2011-2022 走看看