ogre與mfc結合

 

將view類直接當作ExampleApplication來用,不繼承
另外實現一個自己的ExampleFrameListener
 
重點在於configure裏面
mWindow = mRoot->initialise(false);這裏要用false,不使用autowindow
 
然後
unsigned int hWnd = (unsigned int)this->GetSafeHwnd(); 得到view窗口的句柄
NameValuePairList miscParams;
miscParams["externalWindowHandle"] = StringConverter::toString(hWnd);
RECT rc;
this->GetWindowRect( &rc );
mWindow = mRoot->createRenderWindow("OgreRenderWindow", rc.bottom-rc.top, rc.right - rc.left, false, &miscParams);
傳遞了externalWindowHandle參數以後,ogre就不會自己創建窗口,而直接使用這個窗口
 
另外一個需要注意的是,在listener中,創建輸入設備的時候,需要的是一個頂層窗口的句柄,所以需要
windowHnd = (size_t)::GetAncestor((HWND)windowHnd, GA_ROOT);
然後再用windowHnd去初始化輸入設備。
 
補充:
 
由於ogre本身沒有提供通過windows消息退出渲染循環的方式,所以如果僅僅在view的OnDestory中調用queueEndRendering會因爲窗口早已銷燬,而ogre還在運行而出錯,(見Root::StartRendering,處理消息的函數沒有任何返回值,無法使渲染循環退出)。
 
我的解決方法,創建一個單獨的線程來進行ogre的渲染,然後再view的OnDestory中使用WaitForSingleObject方法等待ogre線程的結束,然後再繼續銷燬窗口的操作。這樣做的好處是不必每次等mfc的update的時候再渲染,ogre在單獨的循環中,可以不必受到windows gui笨重的限制,fps可以達到幾百。
 
關於鼠標被捕獲,需要在listener中創建input設備時,(createInputSystem函數)增加參數w32_mouse = DISCL_FOREGROUND和 DISCL_NONEXCLUSIVE
發佈了21 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章