2012-01-11 149 views
1

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

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

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

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

回答

3

我想,当我调整其大小

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

并且我还希望图形不能随窗口大小拉伸。

不可能(至少没有黑客)。假设您使用DirectX 9,则必须重新初始化设备以更改其分辨率,而且速度很慢。

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

换句话说,您将视口初始化为640x480并保留在此处,但如果用户将窗口大小调整为1024x768,则可将1024x768数量的东西包装到640x480视口中,然后将其拉伸以填充1024x768窗口。

这应该给人以“调整”视口的印象,但由于实际上它会缩放,所以图片质量会下降。这就是为什么在用户完成窗口大小调整之后,您可能最终要重新审视视口。这样,您可以先快速调整大小,然后再调整图片质量。