在Windows编程中,重绘窗口会触发WM_PAINT消息。以下是一些常见情况: 窗口被覆盖或部分覆盖:当一个窗口被其他窗口遮挡,然后又重新显示时,操作系统会要求重绘被遮挡的部分。 窗口尺寸改变:当用户调整窗口大小时,系统会发送WM_PAINT消息来更新内容以适应新的尺寸。 调用InvalidateRect或InvalidateRgn:通过编程手动请求重绘,可...
这时操作系统自然不会认为有重画的必要,但程序却必须重画,这时就得人工发送WM_PAINT消息了。注意不要傻乎乎地直接用SendMessage或PostMessage发送WM_PAINT,后面会解释原因。 由于重画很费时间和资源,并且也不是应用程序的“主业”,因此系统也知道要尽量减少重画的次数。系统只在应用程序的消息队列为空的时候才发送WM_PA...
类似于PostMessage(WM_PAINT),需要处理到WM_PAINT消息时才真正重绘。以为您Invalidate之后还有其他的语句正在执行,程序没有机会去处理WM_PAINT消息,但当函数执行完毕后,消息处理才得以进行。 Invalidate只是放一个WM_PAINT消息在队列里,不做别的,所以只有当当前函数返回后,进入消息循环,取出WM_PAINT,才执行 原文链接:h...
只是放一个WM_PAINT消息在队列里,类似于PostMessage(WM_PAINT),只有当前函数返回后,进入消息循环,取出WM_PAINT,才执行PAINT,所以不管Invalidate放哪里,都是最后的。 如果希望立即刷新无效区域,可以在调用InvalidateRect之后调用UpdateWindow,如果客户区的任一部分无效,则UpdateWindow将导致Windows用WM_PAINT消息调用窗口过程(...
个人总结:完全没有必要通过sendmessage或者postmessage来发送paint消息。想要异步刷新调用InvalidateRect/InvalidateRgn,想要同步刷新调用UpdateWindow/RedrawWindow。需要注明的是同步调用并不是就一定是用当前线程来调用窗口的消息处理函数。
WM_PAINT 消息 窗口收到 WM_PAINT 消息时,应重绘自身,将此消息发送到窗口前,WM 确保它已被选定。 非透明窗口 (默认!)必须重绘其整个无效区域。 最简单的方式是重新着色窗口的整个区域。 WM 的裁剪机制确保了仅重绘无效区域。为 了加速绘制过程,仅重绘无效区域非常有用。另外,透明窗口不必重绘整个无效区域;它可...
一般来讲,系统总是将消息Post在消息队列的末尾。这样保证窗口以先进先出的顺序接受消息。然而,WM_PAINT是一个例外,同一个窗口的多个 WM_PAINT被合并成一个 WM_PAINT 消息, 合并所有的无效区域到一个无效区域。合并WM_PAIN的目的是为了减少刷新窗口的次数。
The system sends an internal WM_PAINT message only once. After an internal WM_PAINT message is returned fromGetMessageorPeekMessageor is sent to a window byUpdateWindow, the system does not post or send further WM_PAINT messages until the window is invalidated. ...
// WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) ...
类似于PostMessage(WM_PAINT),需要处理到WM_PAINT消息时才真正重绘。以为您Invalidate之后还有其他的语句正在执行,程序没有机会去处理WM_PAINT消息,但当函数执行完毕后,消息处理才得以进行。 Invalidate只是放一个WM_PAINT消息在队列里,不做别的,所以只有当当前函数返回后,进入消息循环,取出WM_PAINT,才执行PAINT,所以...