1

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

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

我需要摆脱这些。一种想法是将控件作为中间对话框的子级,该中间对话框是原始弹出对话框的子级。因此,当重新调整大小时,我只能重新定位对话框,而不是单独移动每个控件。(重新定位只发生在一个方向(xy),因此移动中间对话框就足够了。

由于它涉及一些编码工作,因此在此之前,我需要回答以下问题:

  • 这行得通吗?
  • 如果是,这种方法涉及的复杂性是什么?
  • 有没有更好的办法?

请帮忙!

4

2 回答 2

3

简单的修复是:

  • 最后创建慢速窗口,这样它就不会阻止简单控件的绘制
  • 打开 WS_EX_COMPOSITED 样式标志,以便 Windows 双缓冲整个窗口,包括其子窗口。谨防绘画文物
  • 关闭 WS_CLIPCHILDREN 样式标志,这样这些漏洞就不会那么明显了。使背景变白也可以达到同样的效果
  • 在 WM_ENTERSIZEMOVE 和 WM_EXITSIZEMOVE 之间保持慢速控件的绘制简单
  • 使用较少的控件,无需在简单的字符串或图像上烧毁昂贵的窗口
于 2011-08-05T08:51:07.600 回答
2

它可能会起作用,但您应该尝试以前不会改变您的控制层次结构的解决方案,因为它有其他微妙的后果(焦点、标签顺序、消息通知等)。

尝试以下一项或全部:

  • 使用 BeginDeferWindowPos/DeferWindowPos/EndDeferWindowPos 函数来移动孩子。
  • 在对话框中设置 WS_CLIPCHILDREN 样式标志。
  • 在对话框中设置 WS_EX_LAYERED 扩展样式标志。
于 2011-08-05T08:04:32.183 回答