自定义菜单项与CListBox项的以及图标按钮

菜单项的自绘

菜单项的自绘

步骤:
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(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值