避免在调整大小时移动控件的对话框上闪烁

Avoid Flickering on a dialog that moves its controls on resize

本文关键字:对话框 闪烁 移动控件 小时 调整      更新时间:2023-10-16

我有一个弹出对话框(CDialog),处理WM_CTLCOLOR消息颜色自己。它有一些控件(如位图按钮)使用OwnerDraw绘制自己。它也有一个控件,显示一个图像的大小占到对话框的70%。

当用户重新调整对话框的大小时,对话框中的一些控件应该重新定位(而不是重新调整大小)它还涉及到在对话框内重新调整图像的大小。由于图像的大小调整使整个过程变慢,单个控件的重新定位导致视觉效果闪烁。

我需要摆脱这些。一个想法是把控件作为中间对话框的子控件,中间对话框是原始弹出对话框的子控件。所以,当有一个大小调整,我可以重新定位对话框,而不是单独移动每个控件。(重新定位只发生在一个方向(x y),所以移动中间对话框应该足够了。

因为它涉及一些编码工作,所以在这样做之前,我需要回答以下问题:

  • 这能行吗?
  • 如果是,这个方法的复杂度是多少?
  • 有更好的方法吗?

请帮忙!

修复方法如下:

  • 最后创建慢速窗口,这样它就不会阻碍简单控件的绘制
  • 打开WS_EX_COMPOSITED样式标志,以便Windows双缓冲整个窗口,包括它的子窗口。小心绘画文物
  • 关闭WS_CLIPCHILDREN样式标志,使漏洞不那么明显。将背景设置为白色将完成相同的
  • 在WM_ENTERSIZEMOVE和WM_EXITSIZEMOVE
  • 之间保持缓慢控件的绘制简单
  • 使用更少的控件,在一个简单的字符串或图像上消耗一个昂贵的窗口是不必要的

这可能会起作用,但你应该尝试之前不改变控件层次结构的解决方案,因为它有其他微妙的后果(焦点,选项卡顺序,消息通知等)。

尝试以下一个或全部:

  • 使用BeginDeferWindowPos/DeferWindowPos/EndDeferWindowPos函数来移动子节点
  • 在对话框中设置WS_CLIPCHILDREN样式标志。
  • 在对话框中设置WS_EX_LAYERED扩展样式标志。