Windows下WTL与MFC使用Invalidate()闪烁问题解决

本文介绍在WTL或MFC程序中使用按钮控件时遇到的闪烁问题及其解决方案。通过使用RedrawWindow()函数来实现按钮的即时重绘,从而有效避免了按钮在更新时出现的闪烁现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在WTL或MFC的程序中使用了按钮控件,
在触发点击事件向按钮上面赋值时总是会出现闪烁的情况;

GetDlgItem(IDC_BUTTON_TEST).SetWindowText((LPCTSTR)strTest);
GetDlgItem(IDC_BUTTON_TEST).Invalidate();

Calling the Invalidate method does not force a synchronous paint; to force a synchronous paint, call the Update method after calling the Invalidate method. When this method is called with no parameters, the entire client area is added to the update region.

查询后得知, 此 Invalidate()函数是 “使整个窗口客户区无效, 并进行更新显示的函数”,

调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。

所以,调用该函数后,对应的窗口控件无效;并且在下一次进行重绘;

我们希望它能尽快重绘,以致于不在过长时间后进行闪烁;

所以,可以在无效化窗口区域后利用RedrawWindow()进行立即重绘,解决闪烁问题;

这样的话,代码可以:

GetDlgItem(IDC_BUTTON_TEST).SetWindowText((LPCTSTR)strTest);
GetDlgItem(IDC_BUTTON_TEST).Invalidate();
RedrawControl(GetDlgItem(IDC_BUTTON_TEST));

这样,可以有效解决按钮闪烁问题;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值