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