*【声明】本文是入门级学习教程,参考自http://www.rastertek.com/dx11s2tut04.html
环境设置
- 新建一个空项目–win32控制台应用程序。
VS2019创建一个win32控制台程序。
然后在顶部栏上的“解决方案平台”下拉列表中将看到值“ x86”,选择该值并选择“ x64”。这会将您的项目设置为64位,而不是默认的32位。
现在,从菜单中单击“查看”,然后选择“属性管理器”。接下来,在屏幕左侧的属性管理器窗口中,单击项目名称(我的名称为Engine)左侧的箭头。这将显示您拥有的解决方案配置。选择“调试| x64”文件夹,然后双击“ Microsoft.Cpp.x64.user”。
在弹出的窗口中,从左侧菜单中选择“ VC ++目录”。然后将显示项目使用的目录。
现在,从目录列表中选择“包含目录”,然后单击右侧显示的向下箭头。从弹出的选择中选择“编辑”。
单击顶部的文件夹图标(如果将鼠标悬停在其上,则称为“换行”),然后单击右侧显示的“ …”。
导航到Windows 10 SDK的include文件夹,不同的版本命名不同,但是在我的系统上是:C:\ Program Files(x86)\ Windows Kits \ 10 \ Include \ 10.0.10240.0 \ um
接下来单击“选择文件夹”,然后单击“确定”。
现在,我们还需要做同样的事情来为共享头添加包含。遵循相同的过程并添加:C:\ Program Files(x86)\ Windows Kits \ 10 \ Include \ 10.0.10240.0 \ shared
还需要库目录,因此现在从目录列表中选择“库目录”,然后单击右侧显示的向下箭头。从弹出的选择中选择“编辑”。
单击顶部的文件夹图标(如果将鼠标悬停在其上,则称为“换行”),然后单击右侧显示的“ …”。
导航到Windows 10 SDK库文件夹,不同版本的名称不同,但是在我的系统上,64位库位于此处:C:\ Program Files(x86)\ Windows Kits \ 10 \ Lib \ 10.0.10240.0 \ um \ x64
接下来单击“选择文件夹”,然后单击“确定”。
最后,单击“属性页”窗口右下方的“应用”按钮。
现在单击“确定”关闭窗口,您的设置将完成。从菜单中单击“查看”,然后单击“解决方案资源管理器”以返回您的代码。现在,所有DirectX项目都应该可以正常编译,并且“无法打开包含文件:‘d3d12.h’:没有这样的文件或目录”的错误应该消失。另请注意,这些设置将自动应用于“发行版” |“发行版”。x64解决方案配置,因此您无需在此处进行设置。同样,它对于所有新项目都应永久保留,并且不再需要重新设置。
搭建框架和窗口
框架将从四个项目开始。它将具有WinMain函数来处理应用程序的入口点。它还将具有一个系统类,该类封装将在WinMain函数中调用的整个应用程序。在系统类内部,我们将具有一个用于处理用户输入的输入类和一个用于处理DirectX图形代码的图形类。这是框架设置的图:
//mian.cpp
// Filename: main.cpp
#include "systemclass.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pScmdline, int iCmdshow)
{
SystemClass* System;
bool result;
// 创建系统对象。
System = new SystemClass;
if (!System)
{
return 0;
}
//初始化并运行系统对象。
result = System->Initialize();
if (result)
{
System->Run();
}
// 关闭并释放系统对象。
System->Shutdown();
delete System;
System = 0;
return 0;
}
//systemclass.h
#pragma once
#ifndef _SYSTEMCLASS_H_
#define _SYSTEMCLASS_H_
//这里我们定义了WIN32_LEAN_AND_MEAN。我们这样做是为了加快构建过程,
//它通过排除一些较少使用的api来减少Win32头文件的大小。
///
// PRE-PROCESSING DIRECTIVES 预处理指令//
///
#define WIN32_LEAN_AND_MEAN
//windows.h包含在内,以便我们可以调用要创建的函数
//销毁窗口,并能够使用其他有用的win32功能.
//
// INCLUDES 包含文件//
//
#include <windows.h>
//我们已经在框架中包含了其他两个类的头文件
//这样我们就可以在system类中使用它们了。
///
// MY CLASS INCLUDES 自己新建类的包含头文件//
///
#include "inputclass.h"
#include "graphicsclass.h"
//类的定义相当简单。
//我们看到了在这里定义的WinMain中调用的Initialize、Shutdown和Run函数。
//还有一些私有函数将在这些函数中调用。
//我们还在类中放入了一个MessageHandler函数
//处理在应用程序运行时发送给它的windows系统消息。
//最后我们有一些私有变量m_Inputand m_Graphics
//它是指向处理图形和输入的两个对象的指针。
// Class name: SystemClass
class SystemClass
{
public:
SystemClass();
SystemClass(const SystemClass&);
~SystemClass();
bool Initialize();
void Shutdown();
void Run();
LRESULT CALLBACK MessageHandler(HWND, UINT, WPARAM, LPARAM);
private:
bool Frame();
void InitializeWindows(int&, int&);
void ShutdownWindows();
private:
LPCWSTR m_applicationName;
HINSTANCE m_hinstance;
HWND m_hwnd;
InputClass* m_Input;
GraphicsClass* m_Graphics;
};
/
// FUNCTION PROTOTYPES 函数原型//
/
static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
/
// GLOBALS 全局变量//
/
static SystemClass* ApplicationHandle = 0;
#endif
//WndProc函数和应用程序句柄指针也包含在这个类文件中
//这样我们就可以将windows系统消息重定向到MessageHandler函数中
//在系统类内部。
systemclass.cpp
// Filename: systemclass.cpp
#include "systemclass.h"
/