聲明:本系列教程代碼有部分來自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); }
程序運行結果,窗口背景為黑色