如何在没有闪烁的情况下调整directx窗口的大小?

时间:2012-01-11 07:34:48

标签: directx resize flicker

我有一个简单的directx应用程序,它显示了一些预先变换的几何图形,我希望窗口在调整大小时不会闪烁,而且我希望图形不会随窗口大小拉伸。

我注意到拉伸问题,如果我在WM_SIZING中重置设备,那么图形的实际大小将保留。但每次调整窗口大小时重置设备似乎都是一项昂贵的操作。实际上我想用directx创建一些简单的GUI,但是调整窗口的大小似乎会删除前面的缓冲区数据,从而轻弹。我看到许多使用opengl的自定义gui应用程序允许调整大小,WPF应用程序允许调整大小。我该怎么做?

另外我想知道,如果我无法实现实时调整大小而没有闪烁和重新定位绘制元素的效果,那么WPF应用程序如何设法做到这一点?

另外我想问一下,如果您要使用directx设计GUI(非游戏)系统并希望实现调整大小支持,那么任何其他应用程序会做什么选择?

1 个答案:

答案 0 :(得分:3)

  

我希望窗口在调整大小时不会闪烁

不要处理WM_ERASEBACKGROUND和类似的消息。将所有绘画留给DirectX,不会有闪烁。任何闪烁基本上都是你(或你的控件)首先绘制一些东西,然后DirectX将它绘制在它上面。

  

我还希望图纸不会随窗口大小拉伸。

不可能(至少没有黑客)。假设你使用DirectX 9,你必须重新初始化设备以改变它的分辨率,这很慢。

我可以考虑一些变通方法,例如,尝试更改投影矩阵,以便在视口分辨率保持不变(无重新启动)时,通过视口看到的内容会反映窗口大小。

换句话说,您将视口初始化为640x480并保持不变,但如果用户将窗口大小调整为1024x768,则将640x768的内容量打包到640x480视口中,然后将其拉伸到填充1024x768窗口。

这应该给人一种“调整大小”视口的印象,但实际上它正在缩放,图像质量会下降。这就是为什么您可能希望在用户完成窗口大小调整后最终重新启动视口。这样,您可以先快速调整大小,然后再获得图片质量。