许可优化
产品
解决方案
服务支持
关于
软件库
当前位置:服务支持 >  软件文章 >  《基于 DirectX11 的 3D 图形程序设计案例教程》学习一 HelloWorld

《基于 DirectX11 的 3D 图形程序设计案例教程》学习一 HelloWorld

阅读数 6
点赞 0
article_banner

源程序:

/*************************************************************************
    > File Name: HelloWorld.cpp
    > Author: YLD10
    > Mail: yl1315348050@yahoo.com
    > Created Time: 2018.5.28 23:31
    > Describe: Win32 Application HelloWorld.
                《基于 DirectX11 的 3D 图形程序设计案例教程》
                2.2 节程序例子 Hello World
 ************************************************************************/

// 这个头文件包含 Win32 API 的基本元素所需要的结构
#include <windows.h>

// 一个窗口的句柄,这是一个全局变量,后面会用到
HWND MainWindowHandle = 0;

/* 
 * 声明初始化窗口的 InitWindowsApp 函数的函数体
 */
bool InitWindowsApp(HINSTANCE instanceHandle, int show);

/*
 * 声明用于封装消息循环的 Run 函数的函数体
 */
int Run();

/*
 * 声明回调函数 WnProc 的函数体
 */
LRESULT CALLBACK WndProc(HWND hWnd,
                         UINT msg,
                         WPARAM wParam,
                         LPARAM lParam);

/*
 * hInstance:是当前实例的句柄,所谓实例就是指应用程序本身
 * hPreInstance:不使用该参数,Win32 该参数始终为 NULL
 * pCmdLine:用于运行程序的命令行参数字符串
 * nShowCmd:指定窗口的显示方式
 */
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPreInstance,
                   PSTR pCmdLine,
                   int nShowCmd)
{
// 调用窗口初始化函数,如果调用成功则进入消息循环,否则弹出一个对话框
    if (!InitWindowsApp(hInstance, nShowCmd))
    {
        ::MessageBox(0, L"Init - Failed", L"Error", MB_OK);

        return 0;
    }

    return Run();
}

/*
* 声明初始化窗口的 InitWindowsApp 函数的函数体
*/
bool InitWindowsApp(HINSTANCE instanceHandle, int show)
{
    WNDCLASS wc;
    wc.style        = CS_HREDRAW | CS_VREDRAW;
                    // 这就是一个窗口类 WNDCLASS 的对象定义窗口的样式,
                    // 这两个标记表明当窗口的水平或垂直尺寸发生变化时,
                    // 窗口将被重绘
    wc.lpfnWndProc   = WndProc;  // 这里指定回调函数的指针,与上方回调函数同名
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = instanceHandle;  // 当前应用程序实例的句柄,由 WinMain 传入
    wc.hIcon         = ::LoadIcon(0, IDI_APPLICATION);  // 指定图标
    wc.hCursor       = ::LoadCursor(0, IDC_ARROW);      // 指定光标
    wc.hbrBackground = static_cast<HBRUSH>(::GetStockObject(WHITE_BRUSH));
    wc.lpszMenuName  = 0;               // 指定有无菜单,0 为无菜单   
    wc.lpszClassName = L"Hello";        // 指向窗口名的指针

    if (!::RegisterClass(&wc))
    {
        ::MessageBox(0, L"RegisterClass - Failed", 0, 0);

        return false;
    }

    // 这是第一次用到 MainWindowHandle,用户创建窗口
    MainWindowHandle = ::CreateWindow(
                        L"Hello",       // 第一个 “Hello” 必须和 wc.lpszClassName 相同
                        L"Hello",       // 第二个 “Hello” 是窗口的显示名称
                        WS_OVERLAPPEDWINDOW,            // 指定这个窗口时重叠式窗口
                        CW_USEDEFAULT,  // 表示窗口的横坐标为默认值
                        CW_USEDEFAULT,  // 表示窗口的纵坐标为默认值
                        CW_USEDEFAULT,  // 表示窗口的宽为默认值
                        CW_USEDEFAULT,  // 表示窗口的高为默认值
                        0,
                        0,
                        instanceHandle,
                        0);

    // 如果窗口的创建失败 MainWindowHandle 将会为 0,则报错并返回
    if (!MainWindowHandle)
    {
        ::MessageBox(0, L"CreateWindow - Failed", 0, 0);

        return false;
    }

    // 显示窗口,用窗口句柄 MainWindoeHandle 来指定需要显示的窗口
    ::ShowWindow(MainWindowHandle, show);

    //更新窗口,用窗口句柄 MainWindowHandle 来指定需要更新的窗口
    ::UpdateWindow(MainWindowHandle);

    return true;
}

/*
* 声明用于封装消息循环的 Run 函数的函数体
*/
int Run()
{
    MSG msg;
    ::ZeroMemory(&msg, sizeof(msg));    // ZeroMemory 用 0 填充一块内存区域

    // GetMessage() 不断地从消息队列中检索消息,然后填充到 MSG 结构的成员
    while (::GetMessage(&msg, 0, 0, 0))
    {
        ::TranslateMessage(&msg);       // 将消息 msg 的虚拟键转换为字符信息
        ::DispatchMessage(&msg);        // 最终将消息传送到指定的窗口过程中,
                                        // 本程序中就是将消息传给回调函数 WndProc 中
    }

    return msg.wParam;
}

/*
* 声明回调函数 WnProc 的函数体
*/
LRESULT CALLBACK WndProc(HWND windowHandle,
                         UINT msg,
                         WPARAM wParam,
                         LPARAM IParam)
{
    // 根据参数 msg 的键值判断捕捉到的消息的类型
    switch (msg)
    {
    // 如果按下鼠标左键则弹出消息框,这里 WM_LBUTTONDOWN 是鼠标左键的键值
    case WM_LBUTTONDOWN:
        // L"Hello, World" 是消息框中显示的内容
        // L"Hello" 是所在父窗口的指针
        // MB_OK 表示消息框显示 “确定” 按钮
        ::MessageBox(0, L"Hello, World", L"Hello", MB_OK);

        return 0;

    // 如果按下键盘任意一个键
    case WM_KEYDOWN:
        // 如果是 ESC 键则关闭窗口
        if (wParam == VK_ESCAPE)
        {
            ::DestroyWindow(MainWindowHandle);
        }

        return 0;

    // 如果是关闭窗口的消息,则用 PostQuitMessage() 来退出消息循环
    case WM_DESTROY:
        ::PostQuitMessage(0);

        return 0;
    }

    // 用 DefWindowProc 处理一些默认的消息,比如窗口的最大化、最小化、调整尺寸等
    return ::DefWindowProc(windowHandle,
                           msg,
                           wParam,
                           IParam);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177

运行结果:

运行结果

项目工程:https://github.com/YLD10/VisualStudio_Projects/tree/master/DirectX11_3D/HelloWorld


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删
相关文章
QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空