首页 > 解决方案 > winapi - DeferWindowPos 和 InvalidateRect

问题描述

我有一个允许显示子模式对话框的主窗口。该对话框窗口是使用 DialogBox 函数基于资源文件创建的。它包含一些控件和一个水平拆分器,它们在处理 WM_SIZE 和 WM_MOUSEMOVE 消息时会重新定位/调整大小。我使用 BeginDeferWindowPos、DeferWindowPos 和 EndDeferWindowPos 函数。看起来一切都被正确地重新粉刷了。我还应该在 EndDeferWindowPos 之后调用 InvalidateRect 吗?有没有必要的情况?我不处理 WM_PAINT 消息。

标签: winapi

解决方案


该函数的文档DeferWindowPos强烈建议,只要您没有在参数中SWP_NOREDRAW设置该位,就不需要在调用后调用:uFlagsInvalidateRectEndDeferWindowPos

SWP_NOREDRAW 0x0008
不重绘更改。如果设置了此标志,则不会发生任何类型的重新绘制。这适用于客户区、非客户区(包括标题栏和滚动条)以及由于窗口移动而未覆盖的父窗口的任何部分。设置此标志时,应用程序必须显式地使需要重绘的窗口和父窗口的任何部分无效或重绘。


推荐阅读