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

你可能感兴趣的:(windows,mfc,input)