如何高效渲染双缓冲窗口,没有任何撕裂效果?

smi*_*mit 5 c++ user-interface gdi+ custom-controls

我想创建自己的小型无窗口GUI系统,因为我正在使用GDI +.我不能在这里发布代码因为它很大(c ++)但是下面是我遵循的主要步骤...

  1. 创建一个大小等于应用程序窗口的位图.
  2. 对于所有鼠标和键盘事件,更新自定义控件状态(例如,如果鼠标当前保持在特定控件上等)
  3. 对于WM_PAINT事件,将背景绘制到屏幕外位图,然后在其上绘制所有更新的控件,最后通过Graphics :: DrawImage(..)调用将整个屏幕外图像复制到前缓冲区.
  4. 对于WM_SIZE/WM_SIZING,删除先前的屏幕外位图,并创建另一个具有新窗口大小的位图.

还有一些检查可以防止重复绘制控件,即控件仅在需要重新绘制时绘制,换句话说当控件的状态发生变化时才会被绘制等等.

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

当我拖动边框时,在尺寸边缘/边框上有一个闪烁的间隙.就好像我的DrawImage()函数立即返回,而当一个交换操作完成一半时,另一个图像绘制开始.

现在您可能认为在许多其他应用程序中发生的常见工件是因为调整后台缓冲区并不总是像调整窗口大小一样快但是在其他应用程序中我注意到在其他应用程序中虽然窗口大小和客户端之间存在一条腿区域大小随着窗口的大小增加,边缘附近没有任何闪烁(它通常只是白色背景,沿着边界显示为细的均匀条带).此外,随着窗口调整大小而移动的动态控件在调整大小期间会变得不稳定.

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

我听说过vista上的GDI不是硬件加速的,这可能是问题吗?

另外我想知道像Qt这样的框架如何平滑地呈现无窗口GUI,即使你非常快速地调整复杂的Qt GUI窗口,也可以忽略不计出小工件.据我所知,Qt可以使用opengl进行GUI渲染,但这是第二种选择.

如果我使用directx那么实时调整大小就更难了,另一方面,opengl似乎很适合调整大小而没有任何问题但是我将放弃GDI +的所有2D绘图功能.

如果你们中有人做过这样的事情,请指导我.此外,如果你有任何指针,我应该考虑自定义用户界面设计,然后提供链接.

谢谢!

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

小智 5

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

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

此外,如果您需要从GUI快速响应,我会建议不要使用GDI +.