在之前的代码中,我们使用了大量的代码去绘制了一个三角形。对于我们来说实在是有点麻烦了,如果每次都需要写这么多的代码的话无疑是很容易让人写崩溃的。在此和之后的几篇文章,我们将会对之前使用的基本功能进行封装。
此篇所看教程来自: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) { |
点击启动,成功应该是一个黑色的窗口:
