写点什么

MFC|自绘 CStatic 刷新不及时问题

  • 2022 年 7 月 15 日
  • 本文字数:1000 字

    阅读完需:约 3 分钟

MFC|自绘CStatic刷新不及时问题

前几天更新了如何自定义绘制 CStatic 控件了。

有没有小伙伴尝试过显示效果的?如果有,肯定会出现文本刷新不及时的效果。

那么,这种情况一般是在什么时候出现呢?

很多时候,我们使用 CStatic 控件只想要显示文本,CStatic 的背景色几乎是透明的。但是使用自绘功能之后,这种效果就跟无法实现了一样,背景上总会残留上一次显示的文本样式,就如下图所示一般:

遇到这种显示状况时,真的是很崩溃,调试程序的时候并没有发现残留的上次文本,但是为啥会这样呢?

首先,出现这种情况的时候,一般是刷新不及时的问题。

在我们所有进行自绘的控件类中,都有一个叫做:ON_WM_ERASEBKGND 消息。该消息对应的相应函数是:

afx_msg BOOL OnEraseBkgnd(CDC* pDC);
BOOL UIStatic::OnEraseBkgnd(CDC* pDC){ return TRUE; return CStatic::OnEraseBkgnd(pDC);}
复制代码

根据展示代码,大家可以看得出来,未曾返回系统的 OnEraseBkgnd 消息,直接返回 return TRUE

在重绘时,不进行背景重绘,使用当前重绘类中的方式进行绘制。同时,使用这种方式也多数情况下应用于双缓存机制。

在我们 MFC 框架下,很多时候需要双缓存机制,为了避免闪烁的问题。所以这个函数,我们在自绘时也是必不可少的。

对于这种简单的静态显示文本控件,用得到双缓存机制吗?

如果想尝试的伙伴们可以试试,但是你会发现,设置了双缓存之后,控件的透明背景效果居然不生效了!

而且还让你无从下手!

这时候,你就需要改变下绘制模式了。

我们在绘制这些静态文本控件时,多数情况下不采取双缓存机制的,我们需要在 CStatic::SetWindowTextW 函数中做一些特殊处理。

因为我们是在更改文本时,导致的刷新不及时问题。

所以,为了避免这种情况,最简单的方式就是:获取当前控件区域的父窗口背景色,替换到该控件区域,每次在重新设置文本时,进行刷新。

这个功能比较绕,就连我当初做的时候,也是尝试了很多种方式才解决的。

那么,我们该如何设置呢?

因为 CStatic 控件肯定是属于某一个窗口的。那么我们一定会获取到当前控件的父窗口指针

CWnd *pParent = GetParent();   
复制代码

根据获取的父窗口指针,从而可以获取到父窗口的区域,并转换成当前控件的区域,直接进行刷新,强制给 CStatic 替换背景

CRect rc;GetWindowRect(rc);pParent->ScreenToClient(rc);pParent->InvalidateRect(rc,TRUE);pParent->UpdateWindow();
复制代码

这种方式就可以解决上述,给 CStatic 设置透明背景,不会产生刷新不及时的问题了!

我是中国好公民 st,一名 C++开发程序媛~

发布于: 刚刚阅读数: 4
用户头像

书山有路勤为径,学海无涯苦作舟 2022.07.01 加入

擅长语言:C++ 涉及语言:Python

评论

发布
暂无评论
MFC|自绘CStatic刷新不及时问题_c++_中国好公民st_InfoQ写作社区