转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2496
长期以来,KlayGE一直是单独执行的,窗口上的UI也都是自己画。很多人都提到这么做给编辑器等应用造成了困难。所以如果适度修改KlayGE的窗口系统,使得KlayGE可以嵌入其他的GUI框架,比如MFC、QT、WPF等,有些时候会方便得多。
第一个尝试做这件事情,并且取得成功的在这里。他通过修改Window类,支持从外部传入HWND,让KlayGE复用外部建立的窗口。这么做能顺利地把KlayGE嵌入MFC等框架中。同时,作者也指出了单独这么改仍不能达到完美的程度,“并且由于KlayGE没有开放单独绘制一桢这样的函数,所以直接关闭程序会有内存泄漏和异常。以后再研究研究,试着把相关功能提取一下,做成和Ogre一样的,那样就可以在OnIdle()和OnPaint()时渲染一桢,在OnDestory()时清理资源。”
于是,我尝试除了改Window类之外,还进一步修改App3DFramework。原先的消息循环放在了渲染引擎里,通过StartRendering来调用。但实际上不同的渲染引擎插件,消息循环部分是一样的。或者说,消息循环取决于平台,而不取决于渲染引擎。所以这里做的第一件事情是把消息循环挪到App3DFramework中。渲染引擎之需要提供一个Refresh函数,负责渲染本身。同时,这个函数也可以在OnIdle的时候调用,也就解决了嵌入的问题。
就这样,用了很少的改动,就完成了嵌入。
Comments