世界杯门票_托马斯穆勒世界杯进球数 - noh16.com

世界杯门票_托马斯穆勒世界杯进球数 - noh16.com

shape
  • Home
  • 夏奇拉世界杯
  • 如何让窗口重画——Invalidate()、SendMessage(WM_PAINT)和UpdateWindow()

如何让窗口重画——Invalidate()、SendMessage(WM_PAINT)和UpdateWindow()

  • 2025-08-23 12:39:58
  • admin

如何让窗口重画——Invalidate()、SendMessage(WM_PAINT)和UpdateWindow()

最新推荐文章于 2021-08-16 14:05:49 发布

原创

最新推荐文章于 2021-08-16 14:05:49 发布

·

1.1w 阅读

·

1

·

5

·

CC 4.0 BY-SA版权

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

文章标签:

#windows

#null

Windows编程

同时被 2 个专栏收录

22 篇文章

订阅专栏

C++基础

15 篇文章

订阅专栏

本文详细探讨了在CWnd对象中触发窗口重画的各种方法及其内部机制,包括Invalidate()、UpdateWindow()及WM_PAINT消息的作用过程。通过具体实例说明了不同函数调用时机对窗口重画的影响。

摘要生成于

C知道

,由 DeepSeek-R1 满血版支持,

前往体验 >

昨天晚上讨论的问题,还有另外一个很重要的部分——如何让窗口重画。

这里注意这样几点(这里讨论的函数都是CWnd对象的成员函数):

@1.Invalidate()函数只是标记窗口区域需要重画,但不意味着窗口会被直接重画。它只会在下一个WM_PAINT消息被接收到时,调用OnPaint()才被重画。

@2.当窗口的“消息队列中没有其他消息”且“窗口需要被重画的区域不为空时”,Windows系统会自动向窗口发送WM_PAINT消息,引发窗口的重画(这解释了为什么有时我们不需要自己调用SendMessage(WM_PAINT);)

@3.当窗口区域在被Invalidate()掉后,并且在WM_PAINT消息接收到之前,我们仍然可以调用ValidateRect(NULL)来取消掉这次窗口重画。

@4.当你需要让窗口在Invalidate()后立即重画,标准的做法应该是Invalidate()之后马上调用UpdateWindow(),这样窗口会立即把自己重画一次。

@5.UpdateWindow()的实现方式,仍然是对窗口的Client area发送一个WM_PAINT消息,这个机制也可以用SendMessage(WM_PAINT)做到。

http://kcclub.kingsoft.com/forum.php?mod=attachment&aid=NjU2fDZhYWQ3OTI0fDEzMzE3MDU3ODh8OTM%3D

附件程序是对上述说法的演示程序,程序中在OnPaint()函数中添加了代码,用TextOut函数输出OnPaint被调用了多少次。

注意最后两个按钮产生效果的区别。为什么会这样?

<<<
Previous Post
英特尔® 酷睿™ i7-4700MQ 处理器

Copyright © 2088 世界杯门票_托马斯穆勒世界杯进球数 - noh16.com All Rights Reserved.

友情链接