基本概念

定时器:每隔一定时间执行一次的任务。

API

SetTimer的函数原型:

UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc ) ;

其中

hWnd是和timer关联的窗口句柄,此窗口必须为调用SetTimer的线程所有;如果hWnd为NULL,没有窗口和timer相关联并且nIDEvent参数被忽略

nIDEvent是timer的标识,为非零值;如果hWnd为NULL则被忽略;如果hWnd非NULL而且与timer相关联的窗口已经存在一个为此标识的timer,则此次SetTimer调用将用新的timer代替原来的timer。timer标识和窗口相关,两个不同的窗口可以拥有nIDEvent相同的tiemr

uElapse是以毫秒指定的计时间隔值,范围为1毫秒到4,294,967,295毫秒(将近50天),这个值指示Windows每隔多久时间给程序发送WM_TIMER消息。

lpTimerFunc是一个回调函数的指针,俗称TimerFunc;如果lpTimerFunc为NULL,系统将向应用程序队列发送WM_TIMER消息;如果lpTimerFunc指定了一个值,DefWindowProc将在处理WM_TIMER消息时调用这个lpTimerFunc所指向的回调函数,因此即使使用TimerProc代替处理WM_TIMER也需要向窗口分发消息。

返回值:如果hWnd为NULL,返回值为新建立的timer的ID,如果hWnd非NULL,返回一个非0整数,如果SetTimer调用失败则返回0

KillTimer的函数原型:

BOOL KillTimer( HWND hWnd, UINT_PTR uIDEvent ) ;

InvalidateRect的函数原型:

BOOL InvalidateRect(

HWND hWnd, // handle of window withchanged update region 窗口句柄。

CONST RECT *lpRect, // address ofrectangle coordinates rect结构体的指针。

BOOL bErase // erase-background flag 是否要发送WM_ERASEBKGND消息从而擦除原来的背景

);

作用:使得Client的一个矩形区域变得无效,rect结构体可以自己编辑,也可以使用GetClientRcet()来填充(这里的矩形大小Client的大小),

最主要的是第三个参数,第三个参数决定了是否发送WM_ERASEBKGND消息,从而决定了是否擦除Client原有的图形。

关于WM_TIMER消息

wParam为计时器的ID;

如果需要设定多个计时器,那么对每个计时器都使用不同的计时器ID。

wParam的值将随传递到窗口过程中的WM_TIMER消息的不同而不同。

lParam为指向TimerProc的指针,如果调用SetTimer时没有指定TimerProc(参数值为NULL),则lParam为0(即NULL)。 
可以通过在窗口过程中提供一个WM_TIMER case处理这个消息,或者,默认窗口过程会调用SetTimer中指定的TimerProc来处理

解决方案

例:每隔一秒(1000毫秒)执行一次,但每次的情况不同,所以用一个BOOL类型的变量来标识,如果为TRUE就在WM_PAINT事件中把窗口的客户区域填充为红色,如果为FALSE就不填充。如此,就可以使得窗口呈现出一闪一闪的效果。

// Timer的回调函数
VOID CALLBACK TimerProc(_In_  HWND hwnd,_In_  UINT uMsg,_In_  UINT_PTR idEvent,_In_  DWORD dwTime
)
{isBorderDrawed = !isBorderDrawed;RECT rect;GetClientRect(hwnd,&rect);InvalidateRect(hwnd, &rect, TRUE);
}
        /* 处理WM_PAINT消息 */case WM_PAINT:hdc = BeginPaint(hWnd, &ps);// TODO: 在此添加任意绘图代码...// 获取窗口边框矩形RECT rect;GetClientRect(hWnd, &rect);if (isBorderDrawed){HBRUSH hb = CreateSolidBrush(RGB(255,0,0));FillRect(hdc,&rect, hb);SelectObject(hdc,hb);}EndPaint(hWnd, &ps);break;

运行结果

参考文章

https://shentuzhigang.blog.csdn.net/article/details/105288759

https://blog.csdn.net/u012104827/article/details/105278079/

https://blog.csdn.net/tcjiaan/article/details/8916626

https://blog.csdn.net/u011580175/article/details/56354223

Visual C++——定时刷新重绘窗口[WM_PAINT消息]解决方案相关推荐

  1. WinFom解决最小化最大化后重绘窗口造成闪烁的问题

    WinFom解决最小化最大化后重绘窗口造成闪烁的问题 参考文章: (1)WinFom解决最小化最大化后重绘窗口造成闪烁的问题 (2)https://www.cnblogs.com/swobble/p/ ...

  2. 关于多画面窗口切换的刷新重绘问题

    这段时间一直在开发电视转发和文件播放的服务器软件,基于PC端的. 之前在做多画面切换的时候,发现存在一个BUG,当多画面窗口切换的时候,存在窗口画面留有影子的问题,留有之前窗口的边框,看上去像重叠一样 ...

  3. 双缓冲法解决重绘和闪屏问题

    重绘导致原因:UpdateData.Invalidate.InvalidateRect和UpdateWindow函数. 1. UpdateData重绘控件函数 UpdateData(TRUE)--刷新 ...

  4. VC的MFC中重绘函数的使用总结(整理)

    原文网址:http://www.cnblogs.com/x8023z/archive/2008/12/09/mfc33.html 在刷新窗口时经常要调用重绘函数 MFC提供了三个函数用于窗口重绘 In ...

  5. [Win32]重绘的基本概念以及简单的文本输出文本输出

    1. 客户区的完整概念: 即应用程序窗口中没有被标题栏.边框.菜单栏.工具栏.状态栏和滚动条占据的中间的一片区域,用户可以在这片区域内绘制任意信息 注意!我们不能假定它有特定的尺寸或者是它的尺寸不会发 ...

  6. Windows核心编程_重绘ListBox样式(仿QQListBox)

    今天教大家如何重绘ListBox,其中涉及到的相关知识点也一一解释了 效果图: 是不是和QQ的列表框非常相似?那么这里就一步一步教大家如何使用Win32SDK来完成这项工作! 创建Win32窗口 #i ...

  7. ucGUI 重绘分析(一)

    几个特殊的窗口 1.1第一个窗口-桌面窗口WM__FirstWin 第一个窗口在GUI_Init() 调用WM_CreateWindowAsChild-> _AddToLinList(hWin) ...

  8. Qt重绘 - 雷达扫描(附源码)

    雷达简介      雷达,是英文Radar的音译,源于radio detection and ranging的缩写,意思为"无线电探测和测距",即用无线电的方法发现目标并测定它们的 ...

  9. 窗口发送消息参数详解

    窗口发送消息参数详解 //    窗口.发送消息    函数功能: 将指定的消息发送到一个窗口,同win32 api 里面的SendMessage等同的效果 中文函数原型: 发送消息(hwnd,msg ...

最新文章

  1. MEMS传感器的未来在哪?
  2. Access处理DISTINCT的Bug?
  3. 继续C#开发or转做产品
  4. php 流媒体源码,BeMusic v2.3.6 – 音乐流媒体分享平台PHP源码
  5. 移动设备真机调试本地程序的Node.js【无需连wifi】
  6. STM32F103按键操作的另一种实现——状态机
  7. Google Adwords/SEO关键字策略之Google Webmaster Tool数据方法
  8. 深入理解Magento – 第一章 – Magento强大的配置系统
  9. 1197: [HNOI2006]花仙子的魔法
  10. Python 爬虫-BeautifulSoup
  11. mpu6050 重力加速度_2021年高考物理一轮复习学与练 重力、弹力 、摩擦力 高中物理知识总结大全...
  12. 获取FileUpload上传的文件大小
  13. 自动化测试qq空间登录
  14. 程序“媛”公号,越来越少了,这次推荐俩,轻拍!
  15. 微信 小程序 python 商城_微信小程序——商城篇
  16. C++模板——template
  17. 12.关于uniapp小程序设置页面背景色无效的问题及解决方案
  18. Ethereum开发
  19. cucumber 如何中途退出 scenario
  20. 大陆出现首例iPhone 8电池爆裂事件;小米被指责盗用视频素材丨价值早报

热门文章

  1. 开学几天了,还没有进入状态,继续努力
  2. 网页实现人脸识别PHP,奇思妙想-用HTML5进行人脸识别
  3. springboot返回modelandview 找不到视图_SpringBoot错误处理机制及原理
  4. android classloader的功能和工作模式,Android中ClassLoader和java中ClassLoader有什么关系和不同...
  5. php遍历文件夹下文件内容_php遍历文件夹下所有文件的代码示例
  6. android控件常用的属性,android?常用的控件属性
  7. 二、Git多人开发:不同人修改了不同文件如何处理
  8. 直播 | WWW 2021论文解读:基于隐私保护的模型联邦个性化
  9. SIGIR 2021 | 推荐系统中的自监督图表征学习
  10. 直播 | SemEval-2020自由文本关系抽取冠军方案解读(附NLP竞赛常用技巧总结)