D3DApp
是一个框架类,用于创建主窗口,创建 Direct3D
对象,并处理主循环逻辑。
源文件
${CODE}/d3dApp.h
${CODE}/d3dApp.cpp
类方法详解
HINSTANCE D3DApp::AppInst()
返回当前应用的实例句柄。该值在 D3DApp
的构造函数中传入并保存。一般在创建唯一的 D3DApp
实例时,将 WinMain
函数的 hInstance
传入。
HWND D3DApp::MainWnd()
返回主窗口的句柄。主窗口在 D3DApp::InitMainWindow
方法中创建。
float AspectRatio()
返回窗口客户区的宽、高比。一般用于计算投影矩阵。
bool D3DApp::InitMainWindow()
定义窗口类、注册窗口类,创建并显示主窗口。
bool D3DApp::InitDirect3D()
创建 Direct3D
的 Device
、 SwapChain
并调用 OnResize()
创建深度缓存(Depth Stencil Buffer
),设置渲染目标(Render Target
),并设置视口(Viewport
)。
void D3DApp::CalculateFrameStats()
计算并在主窗口标题栏上显示 FPS
和每帧时间。
bool Init()
初始化框架。调用 InitMainWindow
和 InitDirect3D
方法。
LRESULT D3DApp::MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
窗口消息处理函数。该函数为虚函数,可以在子类中覆盖。子类应当在覆盖后,在处理完自己所需消息后,再次调用 D3DApp::MsgProc
函数,让基类继续处理其他消息。
void UpdateScene(float dt)
纯虚函数,必须在子类中定义。参数为两帧之间的时间间隔,用于计算场景的变化。
void DrawScene()
纯虚函数,必须在子类中定义。调用 Direct3D
API ,绘制场景。
void Run()
处理消息循环。在没有消息的时候,处理计时器,调用 UpdateScene
方法,及 DrawScene
方法。如果计时器暂停,休眠 0.1
秒。默认情况下,当主窗口失去焦点时,计时器暂停。
D3DApp()
初始化主窗口标题,窗口客户区大小,及 Direct3D
驱动类型等参数。
~D3DApp()
释放资源,主要是 Direct3D
相关的资源和对象。
要点
窗口的消息处理函数,不能是类的成员函数。因为类的成员函数隐含一个 this
指针,与窗口消息处理函数的原型不匹配。为了解决这个问题,添加了一个全局函数 MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
,用于主窗口的消息处理函数。该函数通过唯一的 D3DApp* gd3dApp
全局指针,将消息处理函数的参数转发给唯一的框架类,实现了通过类的成员函数,实现窗口消息处理函数的功能。