2009-06-30 75 views
1

我一直在尝试与在2009年3月的DirectX SDK Direct3D应用程序的DXUT函数使用DXUTSetWindow。它们似乎有许多有用的功能,包括自动检测DirecX10或DirectX9以及窗口管理功能,这些功能可以绕过Direct3D通常所需的许多繁琐的窗口管理任务。但是,当我使用DXUTSetWindow函数让Direct3D绘制到已经创建的窗口时,我遇到了问题。在这种情况下,它是应用程序主窗口CFrameWndEx的视图子窗口。在MFC的Direct3D应用程序

如果我设置bHandleMessages参数设置为true,一切调整大小,并重置没有对我进行任何干预。但是,当我尝试关闭程序时(并立即退出,所以我甚至无法查看造成崩溃的原因),应用程序崩溃,并伴随一堆内存泄漏。如果我将bHandleMessages设置为false,则不会调整大小,但我不会在出口时发生崩溃或内存泄漏。

它看起来像DXUTMainLoop正在寻找一个WM_QUIT消息来退出,然后清理所有的Direct3D对象,这是从来没有收到的子窗口。我试过没有成功如下:

  1. 重写CFrameWndExOnClose功能和手动发送WM_QUIT消息,孩子。
  2. DXUTMainLoop调用放在工作线程上。
  3. 覆盖CFrameWndEx::DefWindowProc并使用DXUTStaticWndProc函数(即如果使用的是DX37文档,如果使用DXUTSetWindow,则忽略在任何示例中显示)。
  4. 设置使用CFrameWndEx的手柄上的窗口,并创建子窗口单独的交换链。看起来,DXUT会将DXUTSetWindow中使用的句柄熄灭,而不管在OnD3D9FrameRender回调中是否执行了任何操作。

更新:重写子窗口的DefWindowPro c和调用从子窗口的DefWindowProc,我能得到没有崩溃,内存泄漏运行,调整,处理设备丢失的应用程序,并退出DXUTStaticWndProc后。这是通过使用bHandleMessages设置为false完成的。然而,这会导致一个新的问题:

Direct3D的绘图表面比子窗口的面积小几个像素,离开周围绘制表面的视频噪声的边界。这在bHandleMessages为真时不会发生,即使它在相同的DXUTStaticWndProc函数中在相同的HWND上运行。

更新2:所以它看起来像像素的问题现在已经解决了。使用从第一次更新到这一问题的方案,我发现我需要只调用CWnd::DefWindowProc在子窗口的覆盖DefWindowProc只有DXUTStaticWndProc没有返回0,所以下面的代码似乎解决它:

LRESULT ChildView::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam){ 

    LRESULT lr = DXUTStaticWndProc(this->GetSafeHwnd(), message, wParam, lParam); 
    if(lr != 0) { 
     return CWnd::DefWindowProcW(message, wParam, lParam); 
    } 

    return lr; 
} 

我的另一个问题仍然存在,是否值得使用DXUT库?使用DirectX我能做些什么限制了我多少?我应该回到管理所有Direct3D对象,设备设置/重置和手动渲染吗?

回答

0

在我看来,在DXUT库是垃圾。我只是从你的代码中窃取你需要的任何代码,并直接将它插入到你的应用程序中,并且宽松地应用重构。整个DXUT哲学似乎是“即使2009年,人们认为对象很难,所以我们将设置1988年的后备机器,并将所有C风格与全局功能一起编码”。它太糟糕了。