您当前的位置: 首页 > 

浅谈MFC控件重绘

蔚1 发布时间:2020-04-23 23:30:29 ,浏览量:3

MFC 是基于 WIN32 API 的一套应用程序开发框架,底层是 C++ 语言,其在 Windows 平台上的开发效率和系统运行速度可以说非常具有优势,目前有许多企业内部的 PC 端系统仍然使用 MFC 开发,然而比较诟病的地方就是 MFC 自带的基础控件不够美观,常常需要我们对控件进行重绘,但是这方面的资料却很少且不完整,今天这场 Chat,我就准备带大家入门 MFC 基础控件的重绘。

在本场 Chat 中,会讲到如下内容:

  1. 控件重绘的原理是什么
  2. MFC 常用的几个基础控件自绘例子
  3. 通用 MFC 皮肤库的实现思路

适合人群:有 MFC 基础,对控件重绘感兴趣的技术人员

1. MFC 控件的重绘原理

MFC 的基础控件有很多,常见的就是按钮、列表、标签、输入框等,通常一个应用程序的界面都是由这些小小的控件组合在一起形成了最终的用户界面。系统为每一个基础控件都绘制了一个默认的外观,让我们看个例子: 基础登录框大家可以看到,这是一个基础的 MFC 的对话框,上面有 2 个按钮,2 个标签,2 个输入框,也就组合成了大家熟悉的登录界面。这个界面确实非常"朴素",可能不太符合当下的审美需求,那如果要美化这个界面,要怎么做呢?通常有两种做法:

第一种,找美工设计界面,然后给你切图,直接贴图到程序界面上,就是做网站一样,这种做法的好处是程序实现上相对容易,但是美工的工作量大,比如一个按钮就可能有 4 种状态,如果是 10 个不同的按钮,那就是 40 张图,如果按钮大小还不一样,那又会针对各个尺寸出图,灵活性不够,而且最后的程序资源会非常大。

第二种,也就是我们今天讲的重绘控件,相当于你不用系统默认的控件外观了,而是自己实现控件的外观绘制,定制出符合自己需求的外观,这种方法的优点是灵活,资源占用小,能自适应控件尺寸,方便进行换肤。缺点是程序员需要深入理解控件重绘的过程,以及掌握 GDI,GDI+的绘制函数,才能实现相关效果。

OK,说了这么多,让我们先来了解下 MFC 都是在什么地方绘制控件的外观的。

首先我们需要知道几个重要的跟绘制相关的 WINDOWS 消息和对应的消息处理函数WMPAINT ==> OnPaintWMNCPAINT ==> OnNcPaintWMDRAWITEM ==> OnDrawItemWMERASEBKGND ==> OnEraseBackgroundWM_CTRCOLOR ==> OnCtrlColor

MFC 大部分控件都继承自 CWnd 类,当一个 Windows 窗口需要重新绘制的时候,系统就会向该窗口投递 WMPAINT 消息,窗口通过 WMPAINT 的消息响应函数 OnPaint 实现客户区域绘制过程。

对于窗口的非客户区域,比如窗口的标题栏的绘制,就不是通过 WMPAINT 消息,而是响应 WMNCPAINT 消息,在 OnNcPaint 里面进行绘制的。

那么 WMDRAWITEM 又是什么消息呢?当一个控件具有 OWNER DRAW 的属性并且需要重绘的时候,那么其父窗口就会响应 WMDRAWITEM 消息,调用 OnDrawItem 函数,在这个函数里面调用子控件的 DrawItem 函数,完成子控件的重绘。

接下来看:WMERASEBKGND,这个消息是用来擦除背景的,就好比你在一个画板上画画的时候,你先得把已经画好得内容擦掉,换一个干净的背景。在响应 OnPaint 的时候,都会先触发 WMERASEBKGND,我们可以在其响应函数 OnEraseBackground 里面准备好我们需要的背景。

WM_CTRCOLOR 是子控件将要绘制的时候,向父窗口发送的消息,父窗口可以在这个消息里面设置子控件 DC,前景色、背景色、画刷等等,也可以把这个消息反射给子控件自己处理。

让我们用一张图总结一下:重绘过程图理解了上面的窗口和界面的绘制过程和消息以后,我们就找到了重绘控件的方法。对于支持 OWNERDRAW 属性的控件,我们一般会通过重载控件的 DrawItem 函数来进行控件外观的重

关注
打赏
1688896170
查看更多评论

蔚1

暂无认证

  • 3浏览

    0关注

    4645博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0927s