zoukankan      html  css  js  c++  java
  • 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);
    }

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

     
  • 相关阅读:
    潭州课堂25班:Ph201805201 第九课 函数作用域和匿名函数 (课堂笔记)
    潭州课堂25班:Ph201805201 第八课:函数基础和函数参数 (课堂笔记)
    潭州课堂25班:Ph201805201 第七课:控制流程 (课堂笔记)
    潭州课堂25班:Ph201805201 第六课:散列类型,运算符优先级和逻辑运算 (课堂笔记)
    公开课 之 心蓝 计算器 (课堂笔记)
    公开课 之 tony 电子时钟 (课堂笔记)
    潭州课堂25班:Ph201805201 第五课:格式化输出和深浅复制 (课堂笔记)
    潭州课堂25班:Ph201805201 第四课:Linux的命令以及VIM的使用 (课堂笔记)
    潭州课堂25班:Ph201805201 第三课:序列类型的方法 (课堂笔记)
    微信支付方式
  • 原文地址:https://www.cnblogs.com/zhangbaochong/p/5142186.html
Copyright © 2011-2022 走看看