2009-06-30 43 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風格與全局功能一起編碼」。它太糟糕了。