在MFC中使用DXUT(Direct3D)框架
源代码 (注:testMFCDXUT例子可能能在VS2008上编译通过,但testSDIDXUT_VS2008SP1是在VS2008SP1新建的工程)
本文使用的是Microsoft DirectX SDK (August 2009) ,VS2008SP1和XPSP3环境.
配置Microsoft DirectX SDK (August 2009)环境
安装完成后需要设置头文件路径和库文件路径.
工具-->选项-->项目和解决方案-->VC++目录
包含文件:
1.C:/Program Files/Microsoft DirectX SDK (August 2009)/Include
2.$(ProjectDir)DXUT/Core
3.$(ProjectDir)DXUT/Optional
库文件:
1.C:/Program Files/Microsoft DirectX SDK (August 2009)/Lib/x86
包含文件的2和3是项目目录下的DXUT源代码目录,这样包含头文件的时候不需要指定路径.
注:要是不怕麻烦的话可以不用设置2和3项包含文件,在附加包含目录中设置
项目-->属性-->配置属性-->C/C++-->常规-->附加包含目录
./DXUT/Core;./DXUT/Optional
为了在MFC中使用DXUT,创建了两个类CDXUTWindow和CDXUTD3D9Device
CDXUTWindow类是MFC的窗口派生类,下面是一些函数和参数的作用
CDXUTD3D9Device是DXUT框架的中需要用户实现的D3D9接口类,CDXUTD3D9Device只用有个对外给CDXUTWindow::DXUTWindowInit()调用的CDXUTD3D9Device::DXUTWindowInit接口.其他都是DXUT框架的接口.
使用步骤:
1.新建MFC工程,这里选择对话框程序
2.从C:/Program Files/Microsoft DirectX SDK (August 2009)/Samples/C++拷贝DXUT文件夹到刚新建的项目目录.
3.拷贝本文中的CDXUTWindow,CDXUTD3D9Device的支持文件和修改的部分DXUT框架文件(DXUT.cpp和DXUT.h)
4.添加CDXUTWindow,CDXUTD3D9Device和DXUT框架的核心文件(刚才拷贝的项目目录下DXUT/Core下的所有*.cpp和*.h)到项目中.
5.取消预编译头文件:项目-->属性-->配置属性-->C/C++-->预编译头文件-->创建/使用编译头文件-->不使用预编译头
6.子类化 CDXUTWindow:拖一个CStatic控件,该控件ID,绑定到CDXUTWindow类上.(也可以用CWnd::Create创建)
到此,程序已经能编译运行了,运行你就能看到DXUT那个熟悉的蓝色背景画面了.
下图是在单文档视图类程序中移植的DXUT框架的CustomUI示例.
如果不喜欢用定时器来调用DXUT渲染函数这种方式,仍然可以在MFC中仿DXUT的渲染消息泵,方法如下
1.1在文档视图类程序的CWinApp::OnIdle直接调用CDXUTWindow::OnKickIdle();
1.2 对话框程序中WM_KICKIDLE消息处理函数中return CDXUTWindow::OnKickIdle();
(注:这里的WM_KICKIDLE消息过程和响应自定义消息一样,就是消息不同而已)
关于WM_CHAR消息和WM_LBUTTONDOWN为什么不响应,可以设置CDXUTWindow::m_bNoWmKeyDown来决定是否传递,但是会有"当当当"的按键声.
有些消息需要从父窗口转发给DXUT控件类的话只能用PostMessage,不能用SendMessage.
CDXUTWindow源代码