声明:本系列教程代码有部分来自dx11龙书及dx11游戏编程入门两本书,后面不再说明
首先,在vs2013中创建一个空的解决方案Dx11Demo,以后的工程都会放在这个解决方案下面。然后创建一个win32项目,勾选空项目,确定
在源文件中添加一个c++ Source File main.cpp
创建一个windows应用程序需要以下几步:
WinMain函数的定义;
创建一个窗口;
进行消息循环;
编写窗口过程函数.
要创建一个窗口,必须有一个WinMain函数,可以在MSDN中查看原型
int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // pointer to command line int nCmdShow // show state of window );
第一个参数hInstance表示该程序当前运行的实例的句柄,当程序在Windows下运行时,它唯一标识运行中的实例(只有运行中的程序实例,才有实例句柄)。一个应用程序可以运行多个实例,每运行一个实例,系统都会给该实例分配一个句柄值,并通过hInstance参数传递给WinMain函数。
第二个参数hPrevInstance表示当前实例的前一个实例的句柄。在Win32环境下,这个参数总是NULL,在Win32环境下,这个参数不再起作用。
第三个参数lpCmdLine是一个以空终止的字符串,指定传递给应用程序的命令行参数。例如:在C盘下有一个text.txt文件,当我们用鼠标双击这个文件时将启动记事本程序,此时系统会将C:/text.txt作为命令行参数传递给记事本程序的WinMain函数,记事本程序在得到这个文件的全路径名后,就在窗口中显示该文件的内容。
第四个参数nCmdShow指定程序的窗口应该如何显示,例如最大化、最小化、隐藏等。
第二个参数hPrevInstance表示当前实例的前一个实例的句柄。在Win32环境下,这个参数总是NULL,在Win32环境下,这个参数不再起作用。
第三个参数lpCmdLine是一个以空终止的字符串,指定传递给应用程序的命令行参数。例如:在C盘下有一个text.txt文件,当我们用鼠标双击这个文件时将启动记事本程序,此时系统会将C:/text.txt作为命令行参数传递给记事本程序的WinMain函数,记事本程序在得到这个文件的全路径名后,就在窗口中显示该文件的内容。
第四个参数nCmdShow指定程序的窗口应该如何显示,例如最大化、最小化、隐藏等。
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)是窗口的回调函数。
下面是整个程序的代码:
/********************* Directx11学习笔记【1】 最简单的windows程序HelloWin 2016.01 by zhangbaochong **********************/ #include <windows.h> LPCWSTR g_name;//窗口类的名字 HINSTANCE g_instance;//应用程序实例句柄 HWND g_hwnd;//窗口句柄 bool Initialize();//初始化函数 void Run();//处理消息循环 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) { if(Initialize()) Run(); return 0; } bool Initialize() { g_instance = GetModuleHandle(NULL);//得到程序实例句柄 g_name = L"Hello Win"; WNDCLASSEX wnd; wnd.cbClsExtra = 0; wnd.cbSize = sizeof(WNDCLASSEX); wnd.cbWndExtra = 0; wnd.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wnd.hCursor = LoadCursor(NULL,IDC_ARROW); wnd.hIcon = LoadIcon(NULL, IDI_WINLOGO); wnd.hIconSm = wnd.hIcon; wnd.hInstance = g_instance; wnd.lpfnWndProc = WndProc; wnd.lpszClassName = g_name; wnd.lpszMenuName = g_name; wnd.style = CS_HREDRAW | CS_VREDRAW; //注册窗口类 if (!RegisterClassEx(&wnd)) { MessageBox(NULL, L"注册窗口失败!", L"Hello Win", 0); return false; } //创建窗口 g_hwnd = CreateWindowEx(WS_EX_APPWINDOW, g_name, g_name, WS_OVERLAPPEDWINDOW,300, 200, 800, 600, NULL, NULL, g_instance, NULL); //显示窗口设置其为焦点 ShowWindow(g_hwnd, SW_SHOW); SetForegroundWindow(g_hwnd); SetFocus(g_hwnd); //隐藏鼠标 SetCursor(false); return true; } //相应调度windows消息及调用渲染函数 void Run() { MSG msg; //初始化消息结构 ZeroMemory(&msg, sizeof(MSG)); while (msg.message != WM_QUIT) { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { //DoSomething } } } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wPararm, LPARAM lParam) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); return 0; break; } return DefWindowProc(hwnd, msg, wPararm, lParam); }
程序运行结果,窗口背景为黑色