菜单项的自绘
菜单项的自绘
步骤:
1.将需要自绘菜单项加上MF_OWNERDRAW,使用ModeifyMenu函数比较适合
2.使用WM_MEASUREITEM 设置菜单项宽度与高度
3.使用WM_DRAWITEM 绘制菜单项
- 获得菜单,菜单项加上MF_OWNERDRAW
CMenu*pMenu=pFrame->GetMenu();
ASSERT(pFrame!=NULL);
//ASSERT ()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。 如果表达式不为0,则继续执行后面的语句。 ... ASSERT 只有在Debug 版本中才有效,如果编译为Release 版本则被忽略
for(int i=0;i<5;i++)
pMenu->ModifyMenu(IDM_COLOR_RED+i,MF_OWNERDRAW,IDM_COLOR_RED+i);
return TRUE;
- 设置菜单项宽度与高度
void CMainFrame::OnMeasureItem(int nIDCtl,LPMEASUREITEMSTRUCT lpmis)
{
lpmis->itemWidth=::GetSystemMetrics(SM_CYMENU)*4;
lpmis->itemHeight=::GetSystemMetrics(SM_CYMENU);
}
- 绘制菜单项
绘制菜单项步骤
1.实现高亮选中项pBrush->CreateSolidBrush(::GetSysColor((lpdis->itemState & ODS_SELECTED) ? COLOR_HIGHLIGHT : COLOR_WINDOW));
2.绘制选中项边框dc.FrameRect(&(lpdis->rcItem), pBrush);
3.BitBlt绘制左边选中标志(√),右边矩形填充颜色
void CMainFrame::OnDrawItem(int nIDCtl,LPDRAWITEMSTRUCT lpdis)
{
BITMAP bm;
CBitmap bitmap;
bitmap.LoadOEMBitmap(OBM_CHECK);
bitmap.GetObject(sizeof(bm),&bm);//int GetObject(int nCount,LPVOID lpObject) const;
//CGdiObject::GetObject 用定义指定对象的数据填充缓冲区&bm
//nCount :Specifies the number of bytes to copy into the lpObject buffer.
//lpObject:Points to a user-supplied buffer that is to receive the information.
//https://docs.microsoft.com/en-us/cpp/mfc/reference/cgdiobject-class?view=msvc-170
CDC dc;
dc.Attach(lpdis->hDC);
CBrush* pBrush = new CBrush;
//高亮选中菜单项
pBrush->CreateSolidBrush(::GetSysColor(