在之前的代码中,我们使用了大量的代码去绘制了一个三角形。对于我们来说实在是有点麻烦了,如果每次都需要写这么多的代码的话无疑是很容易让人写崩溃的。在此和之后的几篇文章,我们将会对之前使用的基本功能进行封装。
此篇所看教程来自:DirectX 11 Tutorials 。
首先,我们以一个 CSystem 类为总类(我们的代码中类以 C 开头,Class 的意思)。CSystem 类将直接用在我们的 main 方法里,它会封装一些最基本的功能,包括我们所必须的 windows 窗口的创建。来看看我们的 CSystem 类声明:
1 | class CSystem |
在这个类中封装了不少的变量和函数,我们会依次的解释他们,首先在构造方法中我们初始化那几个 private
变量(稍后我们会介绍每一个变量的作用)。
1 | CSystem::CSystem(): mApplicationName_(nullptr), mHinstance_(nullptr), mHwnd_(nullptr),mInput_(0),mGraphics_(0) { |
在这个类中,我们封装了 Initialize
方法,这个方法会调用 InitializeWindows
为我们创建一个窗口,并使用 private
属性 mHwnd
来作为句柄。来看看这两个方法具体的实现:
1 | bool CSystem::Initialize() { |
在 CSystem::Initialize()
中,我们只是简单的调用了 InitializeWindows();
(事实上并不止这些,但是现在我们只有这一个类,功能也极其简单)。
接下来看 InitializeWindows();
方法:
1 | void CSystem::InitializeWindows(int& screenWidth, int& screenHeight) |
请注意我们在 InitializeWindows
方法里初始化了窗口,但是在设置窗口类的 lpfnWndProc
属性的时候,我们虽然在 CSystem 类里定义了一个 MessageHandler
,但是却无法将他直接用在这里(),所以我们还需要创建一个额外的(不在类里边的 WndProc
方法)。
1 | // 在 CSystem.h 中定义一个 CSystem 对象和一个 WndProc 方法 |
而在 MessageHandler
方法里,我们只是简单的返回了 Windows 默认的消息函数。
1 | LRESULT CSystem::MessageHandler(const HWND hwnd, const UINT umsg, const WPARAM wparam, const LPARAM lparam) { |
初始化方法结束后,我们使用 CSystem::Run();
来启动窗口:
1 | void CSystem::Run() const { |
Run();
方法里我们则是简单的封装了消息循环。当然,这里将是之后添加内容的主要地方。
最后,我们还有 Shutdown();
和 ShutdownWindows();
尚未介绍,和初始化一样,public
的 Shutdown();
也只是简单的调用了 ShutdownWindows();
。
1 | void CSystem::Shutdown() { |
在 CSystem::ShutdownWindows()
中则是什么都没有做(暂时不需要)。
1 | void CSystem::ShutdownWindows() { |
这样,我们只是简单的将窗口的初始化封装到了类中,可以现在来试试效果:
1 | int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , INT nCmdShow) { |
点击启动,成功应该是一个黑色的窗口: