MFC自绘制菜单那些事

1、最近,项目里面需要用到自绘的MFC菜单。
2、但是出现问题:自绘制的菜单有边框。
就像这样子:
在这里插入图片描述
参考资料:https://www.cnblogs.com/doudongchun/p/3699700.html
去除边框后,酱紫:
在这里插入图片描述
3、一波未平一波又起,使用钩子去除了边框,但是二级菜单却很难选中。
在这里插入图片描述
参考资料:https://bbs.csdn.net/topics/392491276

解决后效果:
在这里插入图片描述
4、出现问题。
下级菜单的区域没有重叠区,导致二级菜单很难被选中。使用钩子,但是不要像以前一样直接对菜单大小进行裁剪,因为裁剪只保证菜单向一个方向偏移,这样的结果就是弹出二级菜单在一级菜单右边时候没问题,但是弹出二级菜单在一级菜单左边就会发现一级二级菜单之间存在明显间隙。这间隙是不可逆的(至少我是没找着恢复的方法)。存在间隙也就会造成二级菜单不容易选中。
就像酱紫:
在这里插入图片描述
5、最后解决。
新的方法:
第一步:获取到弹出的菜单窗口,偏移目标菜单窗口。
第二步:创建矩形区域,注意要比原窗口要小。因为我们的菜单窗体已经在上一步向左边和上边偏移了,会导致左边和上边的border看不见,但是右边和下面的border依旧存在。在这里创建矩形区域,设置新的窗口区域,目的就是去除右边和下边的边。
这方法不会造成二级菜单在弹出后,产生间隙,不容易选中。
在这里插入图片描述
关键代码修改:

 LPWINDOWPOS lpPos = (LPWINDOWPOS)lParam;
	CRect rc;
	GetWindowRect(lpPos->hwnd, &rc);
	OffsetRect(&rc, -rc.left - 2, -rc.top - 2);
	HRGN hRgn = CreateRoundRectRgn(0, 0, rc.right - 4, rc.bottom - 4);
	SetWindowRgn(lpPos->hwnd, hRgn, TRUE);

	lResult = CallWindowProc(oldWndProc, hWnd, message, wParam, lParam);
    return 0;

6、最终版本。
在这里插入图片描述
奉上下载链接:https://download.csdn.net/download/struggling_jeff/11454539

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值