Directx11學習筆記【一】 最簡單的windows程序HelloWin


聲明:本系列教程代碼有部分來自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指定程序的窗口應該如何顯示,例如最大化、最小化、隱藏等。
 
 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);
}

 

程序運行結果,窗口背景為黑色

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM