在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 }
该楼主在写这段代码的时候也有一个地方是出错的就是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