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

posted @ 2013-10-17 23:49  CY_K_YC  阅读(597)  评论(0编辑  收藏  举报