如何有效地渲染双缓冲窗口而没有任何撕裂效应?

我想创建我自己的小窗口GUI系统,因为我使用的是GDI +。 我不能在这里发布代码,因为它有巨大的(c ++),但波纹管是我遵循的主要步骤...

  • 创建一个大小等于应用程序窗口的位图。
  • 对于所有鼠标和键盘事件更新自定义控制状态(例如,如果鼠标当前持有特定的控制等)
  • 对于WM_PAINT事件,将背景绘制为离屏位图,然后在其上绘制所有更新的控件,最后通过Graphics :: DrawImage(..)调用将整个屏外图像复制到前缓冲区。
  • 对于WM_SIZE / WM_SIZING,删除以前的离屏位图,并用新的窗口大小创建另一个。
  • 也有一些检查,以防止重复绘制的控制,即只有当它需要重绘换句话说,当控制的状态改变,只有它被绘等等

    该系统工作正常,但只有一个例外......当窗口正在调整大小某种撕裂效果出现。 现在我想说的是撕裂效应,我会试着解释一下......

    在拖动边框时,在裁剪边缘/边框处会有闪烁的间隙。就好像我的DrawImage()函数立即返回,并且在一个交换操作完成一半时另一个图像绘制启动。

    现在你可能会认为这是在许多其他应用程序中发生的常见工件,因为调整backbuffer的大小并不总是与调整窗口大小一样快,但在其他应用程序中我注意到的其他应用程序中,虽然窗口大小和客户端之间存在一段距离区域大小随着窗口的增大而变大在边缘附近没有任何东西闪烁(它通常只是白色的背景,沿着边界呈现为薄而均匀的条带)。 另外,在调整大小时,随窗口大小调整的动态控件也会变得不稳定。

    起初,在我看来,使用恒定的全屏尺寸屏幕外表面可以最大限度地减少伪影,但是当我尝试时,结果并不令人满意。 我还试图在调整大小时调用Sleep(),以便在另一次翻转开始之前翻转完成,但奇怪的是,即使这对我也不起作用!

    我听说Vista上的GDI没有硬件加速,这可能是问题吗?

    我还想知道像Qt这样的框架如何顺利地渲染无窗口的GUI,即使您将一个复杂的Qt GUI窗口设计得非常快,可以忽略不计的小工件。 据我所知Qt可以使用opengl进行GUI渲染,但这是第二种选择。

    如果我使用directx,那么实时调整大小更加困难,但另一方面,opengl似乎对调整大小没有任何问题,但我将失去GDI +的所有2d绘图功能。

    如果你们之前有过这样的事情,请引导我。 此外,如果您有任何我应该考虑的自定义用户界面设计指针,请为我提供链接。

    谢谢!

    我一直希望设计像Windows Media Player 11这样的界面,但是有人可以告诉我,对于一个c ++程序员来说有一个直接的解决方案(我想知道如何使用一些现有的框架等)。 子类化,所有者绘图,自定义绘图似乎没有给你这样的控制水平,我不知道用常用控件绘制半透明控制的方法,所以我认为这个问题值得特别关注。 再次感谢。


    它可能是导致它的WM_ERASEBKGND消息吗?

    看到这个问题:C ++中的GDI +双缓冲

    另外,如果您需要GUI的快速响应,我会建议针对GDI +。

    链接地址: http://www.djcxy.com/p/8875.html

    上一篇: How to efficiently render double buffered window without any tearing effect?

    下一篇: Image quality is not good