0 - start from 0

This series, we build project from start DX11 0

In this section, we create a new empty project, to achieve an empty window.

1. Create a new empty VC ++ project

2. Create a new file main.cpp

3. main.cpp code can be directly used paste.

 1 #include <Windows.h> //处理一些视觉特效,例如窗口,控件,枚举,样式
 2 
 3 //消息回调函数,在创建一个应用程序之前,必须先声明一个窗口过程的原型才能在窗口结构中使用它
 4 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 5 
 6 //WINAPI或stdcall意味着栈的清理工作由被调用函数来完成
 7 //hThis是应用程序当前实例的句柄;hPrev是应用程序上一个实例的句柄;
 8 //szCmdLine是应用程序的命令行,包括该程序的名称;iCmdShow控制如何显示窗口
 9 int WINAPI WinMain(HINSTANCE hThis, HINSTANCE hPrev, LPSTR szCmdLine, int iCmdShow)
10 {
11     UNREFERENCED_PARAMETER(hPrev); //告诉编译器不能使用某些参数,方便编译器进行一些额外的优化
12     UNREFERENCED_PARAMETER(szCmdLine);
13 
14     WNDCLASSEX wndEx = { 0 }; //实例化窗口结构
15     wndEx.cbClsExtra = 0; //实例化窗口类后分配的额外字节数
16     wndEx.cbSize = sizeof(wndEx); //窗口结构的大小(字节为单位)
17     wndEx.cbWndExtra = 0; //实例化窗口实例后分配的额外字节数
18     wndEx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); //窗口类背景画刷的句柄
19     wndEx.hCursor = LoadCursor(NULL, IDC_ARROW); //窗口类光标的句柄
20     wndEx.hIcon = LoadIcon(NULL, IDI_APPLICATION); //窗口类图标的句柄
21     wndEx.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //窗口类图标的句柄
22     wndEx.hInstance = hThis; //窗口过程的实例句柄
23     wndEx.lpfnWndProc = WndProc; //指向窗口过程的指针
24     wndEx.lpszClassName = TEXT("DX11WindowClass"); //指向以空字符结尾的字符串或原子的指针
25     wndEx.lpszMenuName = NULL; //指向以空字符结尾的字符串的指针,该字符串指定了窗口类菜单的资源名
26     wndEx.style = CS_HREDRAW | CS_VREDRAW;
27 
28     if (!RegisterClassEx(&wndEx))//注册窗口类
29     {
30         return -1;
31     }
32 
33     RECT rc = { 0, 0, 640, 480 };
34 
35     //创建窗口
36     HWND hWnd = CreateWindow(wndEx.lpszClassName, TEXT("Blank Win32 Window"), 
37         WS_OVERLAPPEDWINDOW, 0, 0, rc.right-rc.left, rc.bottom-rc.top, 
38         HWND_DESKTOP, NULL, hThis, 0);
39     if (!hWnd)
40     {
41         return -1;
42     }
43 
44     UpdateWindow(hWnd);
45     ShowWindow(hWnd, iCmdShow); //设置指定窗口的显示状态
46 
47 
48     //Demo Initialize
49     MSG msg = { 0 }; //显示窗口消息
50     while (msg.message != WM_QUIT)
51     {
52         if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
53         {
54             TranslateMessage(&msg);
55             DispatchMessage(&msg);
56         }
57         //Update
58         //Draw
59     }
60     //Demo Shutdown
61     DestroyWindow(hWnd);
62     UnregisterClass(wndEx.lpszClassName, hThis); //注销窗口类,释放该类占用的内存
63     return static_cast<int>(msg.wParam) ; //从应用程序消息队列中返回一个成功推出代码或最后一个消息代码
64 }
65 
66 //hWnd表示窗口标识,uMsg窗口消息代码(无符号整数),wParam和lParam传递应用程序定义的数据(64位长整型数)
67 //函数返回64位有符号长整型
68 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
69 {
70     PAINTSTRUCT ps;
71     HDC hDC;
72     switch (uMsg)
73     {
74     case WM_PAINT:
75     {
76         hDC = BeginPaint(hWnd, &ps);//响应画图
77         EndPaint(hWnd, &ps);
78         break;
79     }
80     case WM_CLOSE:
81     {
82         PostQuitMessage(0); //释放系统资源,并安全关闭该应用程序
83         break;
84     }
85     default:
86     {
87         //处理应用程序未处理的窗口信息,函数确保每个消息都被处理
88         return DefWindowProc(hWnd, uMsg, wParam, lParam); //默认窗口过程
89     }
90     }
91     return 0;
92 }

4. 运行即可见一个空窗口。(建议看一下代码中的注释,了解win窗口的生成过程)


 PS: 如果出现下图error错误(无法解析的外部符号_main),参照下面解决方案。

 解决方法:重新设置项目属性为Windows/窗口,重新运行即可。

Guess you like

Origin www.cnblogs.com/yocichen/p/12165897.html