MFC|自绘 CStatic 刷新不及时问题
前几天更新了如何自定义绘制 CStatic 控件了。
有没有小伙伴尝试过显示效果的?如果有,肯定会出现文本刷新不及时的效果。
那么,这种情况一般是在什么时候出现呢?
很多时候,我们使用 CStatic 控件只想要显示文本,CStatic 的背景色几乎是透明的。但是使用自绘功能之后,这种效果就跟无法实现了一样,背景上总会残留上一次显示的文本样式,就如下图所示一般:
遇到这种显示状况时,真的是很崩溃,调试程序的时候并没有发现残留的上次文本,但是为啥会这样呢?
首先,出现这种情况的时候,一般是刷新不及时的问题。
在我们所有进行自绘的控件类中,都有一个叫做:ON_WM_ERASEBKGND 消息。该消息对应的相应函数是:
根据展示代码,大家可以看得出来,未曾返回系统的 OnEraseBkgnd 消息,直接返回 return TRUE
在重绘时,不进行背景重绘,使用当前重绘类中的方式进行绘制。同时,使用这种方式也多数情况下应用于双缓存机制。
在我们 MFC 框架下,很多时候需要双缓存机制,为了避免闪烁的问题。所以这个函数,我们在自绘时也是必不可少的。
对于这种简单的静态显示文本控件,用得到双缓存机制吗?
如果想尝试的伙伴们可以试试,但是你会发现,设置了双缓存之后,控件的透明背景效果居然不生效了!
而且还让你无从下手!
这时候,你就需要改变下绘制模式了。
我们在绘制这些静态文本控件时,多数情况下不采取双缓存机制的,我们需要在 CStatic::SetWindowTextW 函数中做一些特殊处理。
因为我们是在更改文本时,导致的刷新不及时问题。
所以,为了避免这种情况,最简单的方式就是:获取当前控件区域的父窗口背景色,替换到该控件区域,每次在重新设置文本时,进行刷新。
这个功能比较绕,就连我当初做的时候,也是尝试了很多种方式才解决的。
那么,我们该如何设置呢?
因为 CStatic 控件肯定是属于某一个窗口的。那么我们一定会获取到当前控件的父窗口指针
根据获取的父窗口指针,从而可以获取到父窗口的区域,并转换成当前控件的区域,直接进行刷新,强制给 CStatic 替换背景
这种方式就可以解决上述,给 CStatic 设置透明背景,不会产生刷新不及时的问题了!
我是中国好公民 st,一名 C++开发程序媛~
版权声明: 本文为 InfoQ 作者【中国好公民st】的原创文章。
原文链接:【http://xie.infoq.cn/article/7adfc4f9c0acba743ae7505fa】。文章转载请联系作者。
评论