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/窗口,重新运行即可。