1
14
你不能在调整大小时阻止绘画,但你可以(小心)阻止 重漆 这就是闪烁的来源。首先是比特比特比特。 有两种方法可以阻止bitblt事件。
如果您拥有顶级窗口的类,那么只需使用
如果您不拥有该类,但具有控制消息处理的能力(大多数对话框都是这样)。默认处理
因此,如果您可以截获wm_ccalcSize,则可以在调用defwindowproc后强制返回这些值以执行其他正常处理。
你可以听
当绘制对话框的背景时,需要 不 在任何一扇小窗户后面刷油漆。确保对话框中有WS-ClipChildren解决了这个问题,所以您已经处理了这个问题。 移动子窗口时,请确保使用 BeginDeferWindowPos /enddefwindowpos,这样所有重新绘制都会同时进行。否则,当每个窗口在每次setwindowpos调用上重绘其非工作区时,您将得到一束闪烁。 |
2
4
如果我能正确理解这个问题,那就是问题所在。 Raymond addressed today . |
3
1
对于某些控件,可以使用wm_print message将控件绘制到DC中。但这并不能真正解决您的主要问题,即您希望窗口在调整大小时不绘制任何内容,而是允许您完成所有操作。 答案是,只要你有孩子的窗户,你就不能做你想做的事。 我最终在自己的代码中解决这个问题的方法是切换到使用 Windowless Controls . 因为它们没有自己的窗口,所以它们总是与父窗口同时绘制(并绘制到同一个DC中)。这允许我使用简单的双缓冲来完全消除闪烁。当我需要的时候,我甚至可以把孩子们的画抑制得很小 不 在父级的draw例程中调用它们的draw例程。 这是我所知道的在调整大小操作期间完全消除闪烁和撕裂的唯一方法。 |
4
1
这是一个2018年的更新,因为我刚刚经历了和你一样的挑战。
问题中的“最终解决方案”以及相关答案,其中提到了
有人提到
但是,即使我们假设可以说服Windows10不要这样做
Windows 10(也可能是Windows 8)添加了 另一个 在旧的XP/Vista/7旧版旧版molestation之上的客户端区域molestation层。 在Windows10下,应用程序不会直接绘制到帧缓冲区,而是绘制到Aero窗口管理器(dwm.exe)合成的屏幕外缓冲区。
事实证明,DWM有时会决定通过在客户机区域绘制自己的内容来“帮助”您(有点像
所以为了避免客户区的骚扰,我们仍然需要
我正与同样的问题作斗争,并创建了一个总结性的问题/答案,它汇集了10年来关于这个主题的文章,并提供了一些新的见解(太长了,无法将内容粘贴到这个问题中)。从WindowsVista开始,上面提到的bitblt不再是唯一的问题。享受: |
5
0
如果你能找到插电源的地方,
但请记住,这是一个黑客,一个相当丑陋的黑客。调整大小时,您的窗口看起来很糟糕。如果您遇到的问题是在调整大小期间闪烁,那么最好的方法是诊断闪烁,而不是通过阻塞绘制来隐藏闪烁。
要查找的一件事是重绘命令,它们在调整大小期间被频繁调用。如果您R窗口的控件正在调用
|
6
0
有各种各样的方法,但我发现通常唯一可以使用的方法是双重缓冲:绘制到屏幕外的缓冲区,然后将整个缓冲区快速切换到屏幕上。 在VistaAero和更高版本中,这是免费的,所以你的痛苦可能会很短暂。 我不知道在XP下Windows和系统控件的一般双缓冲实现,但是,这里有一些事情需要探讨:
Keith Rule's CMemDC
对于双缓冲任何你用gdi绘制的东西
|
7
0
只有一种方法可以有效地诊断重绘问题-远程调试。 获取第二台电脑。在上面安装msvsmon。添加将生成产品复制到远程PC的生成后步骤或实用程序项目。 现在,您应该能够在wm_paint处理程序、wm_大小处理程序等中放置断点,并在执行大小和重绘时通过对话框代码进行跟踪。如果从MS符号服务器下载符号,您将能够看到完整的调用堆栈。 一些放置得很好的断点——在wm_paint、wm_eragebkgnd处理程序中,您应该很清楚为什么窗口在wm_大小循环的早期被同步重新绘制。 系统中有许多窗口由带有分层子控件的父窗口组成-资源管理器窗口与列表视图、树视图预览面板等非常复杂。资源管理器在调整大小时没有闪烁问题,因此很可能不闪烁地调整父窗口的大小:-您需要做的是捕获重新喷漆,弄清楚是什么原因造成的,好吧,确保原因被排除。 |
8
0
什么似乎有效:
这是非常接近完美的,在我的测试Windows7与Aero。 |
cyber101 · vc++未声明的标识符,尽管其已声明 6 年前 |
areum · 如何在列表控件中创建右键单击菜单? 6 年前 |
Rafal · 如何在MFC中的CWnd中显示CFormView? 6 年前 |
Anton Savelyev · 在发布版本中删除类指针会导致内存问题 7 年前 |
xtkwfn · 如何查找目录[已关闭]下的所有文件夹 7 年前 |
Andrew Truckle · 在WPARAM中组合5个值 7 年前 |
user3070144 · 通过全局接口表封送ActiveX 7 年前 |