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);
}

 

程序运行结果,窗口背景为黑色

 

 

posted @ 2016-01-19 14:35  zhangbaochong  阅读(12882)  评论(3编辑  收藏  举报