我一直在嘗試與在2009年3月的DirectX SDK Direct3D應用程序的DXUT函數使用DXUTSetWindow。它們似乎有許多有用的功能,包括自動檢測DirecX10或DirectX9以及窗口管理功能,這些功能可以繞過Direct3D通常所需的許多繁瑣的窗口管理任務。但是,當我使用DXUTSetWindow函數讓Direct3D繪製到已經創建的窗口時,我遇到了問題。在這種情況下,它是應用程序主窗口CFrameWndEx
的視圖子窗口。在MFC的Direct3D應用程序
如果我設置bHandleMessages
參數設置爲true,一切調整大小,並重置沒有對我進行任何干預。但是,當我嘗試關閉程序時(並立即退出,所以我甚至無法查看造成崩潰的原因),應用程序崩潰,並伴隨一堆內存泄漏。如果我將bHandleMessages
設置爲false,則不會調整大小,但我不會在出口時發生崩潰或內存泄漏。
它看起來像DXUTMainLoop正在尋找一個WM_QUIT
消息來退出,然後清理所有的Direct3D對象,這是從來沒有收到的子窗口。我試過沒有成功如下:
- 重寫
CFrameWndEx
的OnClose
功能和手動發送WM_QUIT
消息,孩子。 - 將
DXUTMainLoop
調用放在工作線程上。 - 覆蓋
CFrameWndEx::DefWindowProc
並使用DXUTStaticWndProc函數(即如果使用的是DX37文檔,如果使用DXUTSetWindow
,則忽略在任何示例中顯示)。 - 設置使用
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對象,設備設置/重置和手動渲染嗎?