避免在调整大小时移动控件的对话框上闪烁
Avoid Flickering on a dialog that moves its controls on resize
我有一个弹出对话框(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扩展样式标志。
相关文章:
- 如何在Qbutton的帮助下更改Q对话框的宽度
- 当对话框被接受时,如何用参数调用槽
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 如何多次询问来自QML对话框的输入?
- 选择文件对话框错误
- 自定义对话框(源自QDialog)不会关闭(Android)
- 如何在 MFC 对话框中使用 OnDraw
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- 从资源视图访问对话框时出现问题
- 如何检测窗口当前是否正在运行模式对话框?
- "最小化"按钮不会出现在 MFC 对话框中
- 如何获取QNetworkConfiguration UserChoice对话框?
- 表单显示对话框函数错误,并且不执行下面的语句
- 如何在 VC6 中的对话框中将图标设置为按钮
- C++/Win32 构造函数不使用从对话框获取的字符串初始化变量
- 在 Win32 应用中,如果未选择文件夹并且用户单击"确定",则文件夹选择对话框将关闭
- 在主窗口之前显示登录对话框并隐藏主窗口按钮
- 对话框窗体快速闪烁,但之后未正确绘制
- windows mfc对话框闪烁在无效
- 避免在调整大小时移动控件的对话框上闪烁