不使用HOOK实现系统菜单的自绘

简介: 关于普通菜单的自绘,网上的例子很多,做的都还不错,但系统菜单的自绘例子缺很少,主要使用的都是HOOK,以A Revolutionary New Approach to Custom  Drawn Menus(http://www.codeproject.com/KB/menus/skinmenu.aspx)这篇文章为代表。

关于普通菜单的自绘,网上的例子很多,做的都还不错,但系统菜单的自绘例子缺很少,主要使用的都是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消息就可以轻轻松松的自绘出稳定的系统菜单。

 

目录
相关文章
|
4月前
|
设计模式 前端开发 搜索推荐
C++ Qt开发:PushButton按钮组件
QPushButton 是 Qt 框架中用于创建按钮的组件类,是 `QWidget` 的子类。按钮是用户界面中最常见的交互元素之一,用于触发特定的操作或事件。该组件具有丰富的属性和方法,使其在不同的应用场景中能够灵活运用。
43 0
|
8月前
CTK框架 - 将菜单按钮写到插件中
之前我们在的两个插件Core和About,在Core和About中加入了界面,并且Core中插入了一个菜单,点击之后弹出About界面。 我们现在来用之前的知识把菜单改成注册的,并且点击之后弹出About界面。 我这里的思路是使用事件或者是在Core中加注册的服务来注册菜单。之后点击菜单的时候发送事件。
64 0
【Flutter】Flutter 手势交互 ( 点击事件处理 | 点击 onTap | 双击 | 长按 onLongPress | 点击取消 | 按下 onTapDown | 抬起 onTapUp )(一)
【Flutter】Flutter 手势交互 ( 点击事件处理 | 点击 onTap | 双击 | 长按 onLongPress | 点击取消 | 按下 onTapDown | 抬起 onTapUp )(一)
410 0
|
Dart 开发者
【Flutter】Flutter 手势交互 ( 点击事件处理 | 点击 onTap | 双击 | 长按 onLongPress | 点击取消 | 按下 onTapDown | 抬起 onTapUp )(二)
【Flutter】Flutter 手势交互 ( 点击事件处理 | 点击 onTap | 双击 | 长按 onLongPress | 点击取消 | 按下 onTapDown | 抬起 onTapUp )(二)
387 0
【Flutter】Flutter 手势交互 ( 点击事件处理 | 点击 onTap | 双击 | 长按 onLongPress | 点击取消 | 按下 onTapDown | 抬起 onTapUp )(二)
|
开发工具 C语言
Qt编写自定义控件11-设备防区按钮控件
一、前言 在很多项目应用中,需要根据数据动态生成对象显示在地图上,比如地图标注,同时还需要可拖动对象到指定位置显示,能有多种状态指示,安防领域一般用来表示防区或者设备,可以直接显示防区号,有多种状态颜色指示,例如布防、撤防、旁路、报警、离线、在线等状态,可以作为一个通用的设备按钮对象使用。
815 0
|
测试技术
MFC中为菜单或按钮添加快捷键功能
1、新建一快捷键资源,ACCELERATOR,关联相应的ID号,下图所示中,其中,第一个ID为自定义快捷键ID,按CTRL+R,此时响应该ID以应的消息响应函数, 第二个ID为菜单ID,此时按CTRL+V,调出ID_NETWORK_PING菜单对应的响应函数。
1312 0
|
前端开发 C# 数据格式
WPF MVVM模式中,通过命令实现窗体拖动、跳转以及显隐控制
原文:WPF MVVM模式中,通过命令实现窗体拖动、跳转以及显隐控制 在WPF中使用MVVM模式,可以让我们的程序实现界面与功能的分离,方便开发,易于维护。但是,很多初学者会在使用MVVM的过程中遇到一个显而易见且无法回避的问题,那就是不同的窗体之间如何跳转?很多人在介绍MVVM的使用时,都没有明显提到该如何解决这一问题,不知是因为觉得太简单了还是其他原因。
2505 0
|
XML Android开发 数据格式
Android开发技巧——实现可复用的ActionSheet菜单
在上一篇《Android开发技巧——使用Dialog实现仿QQ的ActionSheet菜单》中,讲了这种菜单的实现过程,接下来将把它改成一个可复用的控件库。 本文原创,转载请注明出处: http://blog.
1213 0