2012-03-27 32 views
5

我想创建我自己的小窗口GUI系统,为此我使用GDI +。我不能在这里发布代码,因为它有巨大的(C++)但波纹管是我遵循的主要步骤...如何高效渲染双缓冲窗口而不会产生撕裂效应?

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

另外还有一些检查,以防止控件重复绘制它需要换句话说重绘只有当当控制的状态被改变才把它是画e.t.c.即控件绘制

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

在边框/边框的边缘有一个闪烁的缝隙,因为我拖动边框。就好像我的DrawImage()函数立即返回,而一个交换操作已完成另一个图像绘制启动。

现在你可能会认为这是在许多其他应用程序中发生的常见工件,因为resizing backbuffer并不总是像调整窗口大小一样快,但在其他应用程序中我注意到的其他应用程序中,尽管在窗口大小和客户区大小随着窗口的增长而变大,在边缘附近没有任何东西闪烁(它通常只是白色的背景,沿着边界显示为薄的均匀带)。 另外,在调整大小的过程中,与窗口大小调整一起移动的动态控件会变得不平稳。

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

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

也不知框架,如Qt的是如何呈现窗户的GUI这么顺利,即使你大小一个复杂的Qt的GUI窗口非常快忽略的少量出现的神器。据我所知Qt可以使用opengl进行GUI渲染,但这是第二种选择。

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

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

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

+0

这是一个熟悉的问题:http://stackoverflow.com/questions/9786218/drawing-in-window-while-resizing-leaves-unpainted-border – 2012-03-27 15:39:12

+0

我自己经历过这种痛苦 - 我需要一个表单完整的alpha支持和可变的点击。我从来没有设法顺利地调整工作大小(并且花费了很长时间来制定所有其他的小问题,例如代理事件)。我很想知道你是否找到了一个体面的解决方案。 – Basic 2012-03-27 16:03:16

+0

但是其他框架如qt如何平滑调整大小呢?如果我没记错的话,gtk也使用无窗口的非本地自定义绘制控件。我相信存在一个解决方案,但令人惊讶的是,关于该主题的在线资源如此之少。很少有人会不同意有一个体面的自定义GUI是不值得的。 – smit 2012-03-27 17:45:07

回答

5

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

看到了这个问题:GDI+ double buffering in C++

另外,如果你需要从你的图形用户界面快速响应我会建议对GDI +。

+0

是的,我确实照顾过。 – smit 2012-03-27 17:51:20