WTL-Menu自绘

本文介绍了如何使用WTL库实现Windows菜单的自定义绘制。通过修改菜单为OwnerDraw风格,在WM_CONTEXTMENU、WM_INITMENUPOPUP、WM_MEASUREITEM和WM_DRAWITEM消息中进行处理,实现了包括调整菜单宽高、自定义菜单项图片等功能。示例代码展示了如何在WM_DRAWITEM消息中使用GDI函数绘制菜单项,并提供了完整的源码工程链接。
摘要由CSDN通过智能技术生成

  windows下控件很多,但常用的其实没几个。我们先从菜单说起。

效果预览

  先看最终效果,有个直观感受。

  这个是最普通的二级菜单,每个菜单项画了一张图片。

图一


  我们经常看到下面这种菜单:左边是个小图标,右边是文字,这样的效果我们也可以做出来,见图三:


图二

  唯一不同的是……我们的图片和菜单项……个头儿都很大……


图三

  

  上边都是单列的,能不能多列呢?能!在资源编辑器中把要选择一个菜单项,设置其“Break”属性为"Column",那么这个菜单项的下一项将另起一列。代码里也能修改这个属性。效果见图四:


图四


菜单的基本概念

  有几个基本概念,后面会用上,请大家耐心看完。请看图:

图五

  红框所在位置叫MenuBar,直译过来就是“菜单栏”。MainMenu、Menu2、SubMenuA这些叫MenuItem,直译就是“菜单项”

  蓝框里的是被弹出来的叫SubMenu,直译就是“子菜单”,就是大家日常看到的、直接使用的东西。

 

菜单自绘

步骤:

  1.  在WM_CONTEXTMENU消息响应里,用LoadMenu载入菜单栏,用GetSubMenu载入要显示的子菜单,用TrackPopupMenu(或TrackPopupMenuEx)弹出菜单

  2.  在WM_INITMENUPOPUP中修改各MenuItem为OwnerDraw风格

  3.  在WM_MEASUREITEM中按个人需要修改MenuItem宽、高

  4.  在WM_DRAWITEM中使用DRAWITEMSTRUCT结构体中的hDc和rcItem,结合GDI函数,绘制MenuItem

  接下来,我们将以对话框程序,右键弹出菜单的形式,讲解菜单自绘方法。

WM_CONTEXT中弹出弹出菜单

首先新建一个基于对话框的WTL项目,关于WTL开发环境的配置、向导的安装请自行google

然后在资源编辑器中新增一个菜单,为了演示的丰富一些,

非客户区自绘wtl版本指的是在Windows模板库(WTL)基础上通过自主绘制非客户区来定制界面的版本。 WTL是一个开源的C++模板库,用于简化Windows桌面应用程序的开发。它相较于MFC更轻量级,更容易学习和使用。WTL提供了一系列的模板类和宏,可以快速开发具有Windows UI风格的应用程序。 在WTL中,非客户区(Non-Client Area)是指窗口边框以及标题栏、菜单栏、状态栏等装饰性的部分。传统上,这部分通常由操作系统负责绘制和管理。但是对于一些特殊需求,比如自定义的窗口样式、非矩形窗口等,我们需要对非客户区进行自主绘制。 非客户区自绘wtl版本即是基于WTL框架,在需要自定义非客户区的情况下,通过手动绘制实现。这种方式需要重载WTL框架中的非客户区绘制相关的函数,比如`OnNcPaint()`、`OnNcCalcSize()`等,来处理非客户区的绘制逻辑。 非客户区自绘wtl版本的好处在于可以完全控制非客户区的外观。可以根据自己的需要,实现各种特殊的样式和效果,如渐变色、图案填充、自定义按钮等。这样可以使应用程序更加美观和独特,增强用户体验。 但是非客户区自绘wtl版本也存在一些挑战。首先,自绘非客户区需要较高的绘制技术和图形处理能力。其次,自绘非客户区还会涉及到一些与系统相关的问题,如窗口移动、窗口关闭等操作的处理。因此,需要对WTL框架有较深入的理解和熟练的编程技巧。 总之,非客户区自绘wtl版本是在WTL框架基础上,通过自主绘制实现自定义非客户区的一种方式。它可以让我们灵活控制非客户区的外观,提升应用程序的美观程度和用户体验。然而,也需要考虑到相关的技术和系统问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值