C++ 在Win32上,我可以在一段时间内禁用窗口的绘制吗?

C++ 在Win32上,我可以在一段时间内禁用窗口的绘制吗?,c++,windows,winapi,wm-paint,C++,Windows,Winapi,Wm Paint,当我更改对话框的布局时,是否有一个函数可以将窗口重新绘制冻结一段时间?Windows绘制的方式是系统发布窗口的消息,指示您绘制。如果愿意,可以选择在修改布局时忽略这些消息,然后在完成修改布局后强制绘制循环 然而,我在Windows上编写UI的经验是,通常不需要采取这些步骤。由于您负责泵送消息队列,如果在修改布局的过程中正在刷新窗口,那么您必须采取导致消息队列被泵送的动作。 简单地说,在修改布局时停止排队,你的问题就会消失。你应该一下子重新定位;使用et al.如果发现确实需要执行此操作,则应发送

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

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

然而,我在Windows上编写UI的经验是,通常不需要采取这些步骤。由于您负责泵送消息队列,如果在修改布局的过程中正在刷新窗口,那么您必须采取导致消息队列被泵送的动作。
简单地说,在修改布局时停止排队,你的问题就会消失。

你应该一下子重新定位;使用et al.

如果发现确实需要执行此操作,则应发送窗口a,并将
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);

有关更多信息,请参阅。

我严重怀疑您是否需要这样做。您是否尝试过,并确定在调整对话框布局时,实际上收到了大量的
WM\u PAINT
消息?除非没有其他消息可供处理,否则Windows不会向窗口过程发送
WM_-PAINT
消息。@Cody我确信您知道这一点,但Windows不会发送
WM_-PAINT
消息,而是发布消息。这是一个非常重要的区别。@Cody Gray,谢谢,我需要这样做,因为应用程序是用SkinCrafter进行蒙皮的,而且因为我们的属性页有问题,我基本上有几个图片按钮,它们的作用类似于选项卡,当用户按下其中一个按钮时,我会通过显示/隐藏/移动所有小部件来切换到该选项卡。@satuon:Ugh。这是你的问题。你在使用可怕的垃圾,比如剥皮库。事情看起来和工作方式都不完全符合预期,这一点也不奇怪。@cody gray对子窗口有效,还是我也需要将这些消息发送到每个子窗口?@satuon:是的,它对子窗口有效,只要你发送消息就行。它们与父函数分开重新绘制。当我将此代码添加到布局函数时,出现了一个小问题,任务栏图标没有显示(我在Windows 7上),但我已通过确保在第一次调用函数时(在第一次显示对话框之前)未使用WM_SETREDRAW消息来修复了此问题。