在Win32上,我可以禁用一段时间的窗口绘画吗?

时间:2011-02-15 09:02:27

标签: c++ windows winapi wm-paint

是否有一个函数会冻结窗口重新绘制一段时间,而我会更改对话框的布局?

3 个答案:

答案 0 :(得分:15)

如果您发现确实需要执行此操作,则应将窗口WM_SETREDRAW message发送至wParam设置为FALSE。这表示在更改内容后不应重绘窗口。

如果要重新启用绘图,请发送另一条WM_SETREDRAW消息,这次将wParam设置为TRUE。

示例代码:

// Disable window updates
SendMessage(hWnd, WM_SETREDRAW, FALSE, 0);

// Perform your layout here
// ...

// Re-enable window updates
SendMessage(hWnd, WM_SETREDRAW, TRUE, 0);

有关详细信息,Raymond Chen's blog article on the subject非常精彩。

答案 1 :(得分:4)

你应该一举重新定位;使用BeginDeferWindowPos等人

答案 2 :(得分:2)

Windows绘制的方式是系统发布指示您绘制的窗口WM_PAINT消息。如果您愿意,可以选择忽略这些消息,同时修改布局,然后在完成布局修改后强制执行绘制循环。

但是,我在Windows上编写UI的经验是,您通常不需要采取这些步骤。由于您负责抽取消息队列,如果在修改布局的过程中刷新窗口,那么您必须采取导致消息队列被抽取的操作。

简单地说,在修改布局时停止抽取队列,你的问题就会消失。