关于普通菜单的自绘,网上的例子很多,做的都还不错,但系统菜单的自绘例子缺很少,主要使用的都是HOOK,以A Revolutionary New Approach to Custom Drawn Menus(http://www.codeproject.com/KB/menus/skinmenu.aspx)这篇文章为代表。这篇文章的作者主要使用贴图去掉菜单的默认颜色实现的(使用TransparentBlt就可以搞定所有菜单的自绘,当然还有一些细节问题),我曾经也使用了他的这种方法去实现系统菜单的自绘,发现效果并不是很理想,会有一些颜色去除的不干净,仔细观察的话,原作者提供的Demo中也存在这样的问题,原作者做了一些细节方面的处理,问题不是太明显。
仔细观察了下一些比较流行的界面库(像SKin++等)、PPS、浩方软件等自绘的系统菜单不存在上述问题。网上还有一种比较流行的菜单自绘的方法:
名称:简简单单:三个函数实现框架菜单自绘
作者:无心_所爱
网址:http://www.vckbase.com/document/viewdoc/?id=1583
这篇文章的作者很大程度上简化了菜单的自绘,缺陷是没有实现系统菜单的自绘,第二次弹出系统菜单的时候才开始自绘,有时候一直都是默认的系统菜单,不稳定。问什么第一次弹出的时候没有自绘???那我要是在WM_INITMENU和WM_INITMENUPOPUP子前的消息中就修改系统菜单项可不可以?答案是可以的。我们在基于对话框的程序中默认的MFC会给我们添加一个About对话框的菜单项,是在WM_INITDIALOG消息中添加的,这说明这时系统菜单创建,我们可以在这修改系统菜单项的属性。在单文档的程序里可以在CMainFrame::OnCreate中修改系统菜单项的自绘属性。
修改之后响应对话框的WM_MEASUREITEM和WM_DRAWITEM消息就可以轻轻松松的自绘出稳定的系统菜单。