MFC 菜单自绘

背景:由于项目要求将现有MFC MDI框架的程序作一次界面优化,首要的就是系统菜单的优化。具体要求有菜单项尺寸、菜单背景色,菜单栏背景色等。工作期间深刻体会到了MFC做界面的痛苦,这里把这期间所使用到的自绘的相关知识作个梳理总结,希望对大家有个参考价值。


一、要想自绘菜单,首要的就是子类化菜单类,拥有自己的自定义菜单类。

也有大神子类化CWnd。。。这应该属于高度定制了,表示驾驭不了,还是看子类化的吧。 关于自绘菜单类很多大神有分享,由于自己水平有限,也只能是拿来主义。

1.总结起来,这个类通常必需要重写的方法有

1.1、BOOL CMyMenu::OnDrawItem(int nIDCtl,DRAWITEMSTRUCT*pDIS)

该方法用于自绘制每一菜单项,在菜单显示,刷新时调用。通常做法是根据菜单项属性,判断属于哪一类菜单,再决定如何绘制,一般分为顶层菜单项,一般菜单项、分隔符、系统菜单等。

1.2、BOOL CMyMenu:OnMeasureItem(int nIDCtl,MEASUREITEMSTRUCT*pMIS)

该方法用于设置菜单项的尺寸,在菜单创建时调用。如可以简单地设置,菜单项宽高为

2.重写了最重要的两个类,就有了绘制菜单的基础工具,但是还需要我们添加具体的绘制方法 ,如绘制顶层菜单的方法,绘制一般菜单、绘制分割符、绘制系统菜单图标、绘制背景等。

3.有了以上方法,我们绘制菜单的工具算是齐备了,但是还少一些东西,那就是菜单的原料了,比如配色,字体,图标等属性。

另外:这些类中比较重要的是有一套绘制逻辑,比如如何匹配要加载的图标,根据菜单属性分类绘制顶层菜单,一般菜单等不同菜单项的逻辑等。不过大牛已经有现成的给我了,大家可以参考资源中的不同实现方法。

参考代码1:http://download.csdn.net/detail/u010679316/9552044
参考代码2:http://download.csdn.net/download/exceed_me/2750768


二、在MFC中使用自定义菜单类

1.在应用菜单窗口中,如CMainFrame添加消息映射:

2.然后重写它们对应的函数:

3.创建自定义菜单类实例,将其与主窗口绑定
m_CustomMenu.Attach(this->GetMenu()->GetSafeHmenu());
或者 SetMenu(m_CustomMenu);

这样,自绘菜单基本上就算完成了


三、相关细节的处理

虽然有前人铺路,但是完全拿来用做项目的应用总是不现实的,总有些效果还需要自己来调。。。
现在来看,比较容易做到的是改变菜单项的背景,字体的颜色和字号,菜单贴图等。但是整体看来,菜单效果并不理想,主要在以下几个方面:

1.菜单栏背景的绘制

网上的例程中,有些只做了顶层每个菜单项的背景设置,而菜单右侧仍然是系统默认的丑陋的背景色;
如图:

这里写图片描述
另外:这个设置还意外地解决了弹出菜单默认的粗边框的问题:如图我们可以看到示例程序中,如果不执行上述代码,只是将每个菜单项的背景设置为了黑色,弹出菜单项会显示一个比较丑的粗的白色边框,这个边框颜色应该是系统默认色。
这里写图片描述
其实,如果我们将绘制菜单项的背景色和上述代码中背景画刷的颜色设为不同颜色就会看到,菜单绘制的具体过程。如果背景画刷为红色,可以看到:
这里写图片描述
于是思考有没有相应API可以在代码中改变菜单栏高度,方法如下:

这样就将菜单栏高度改为50,不过是将系统中所有软件的菜单栏都改为了50。

来源:Snake-Scorpio

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2016年5月14日
下一篇 2016年5月14日

相关推荐