基于 DirectX11 的 MMDViewer 02-创建一个窗口

  项目的创建和配置:

  1、新建一个 Win32 空项目

  2、创建源码文件夹、库文件夹和资源文件夹

  3、在 VS2013(我使用的 IDE 是 vs2013)配置这些文件夹

  这里使用了 $(SolutionDir) 宏来指定上面创建的文件夹,因为使用的不是绝对路径,所以将项目拷贝到其他文件夹或电脑也可以正确读取。通过上面的设置,告诉程序去哪找到源码文件和库文件。

  创建窗口:

  创建窗口有几个固定的步骤,只要按照这些步骤来就好了,下面是创建的代码

HWND Create()
{
    /* 设计窗口类 */
    WNDCLASS wndclass;
    memset(&wndclass, 0, sizeof(WNDCLASSA));

    wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    wndclass.lpfnWndProc = ( WNDPROC ) WindowProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = ( HINSTANCE ) GetModuleHandle(0);
    wndclass.hIcon = 0;
    wndclass.hCursor = 0;
    wndclass.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));
    wndclass.lpszMenuName = 0;
    wndclass.lpszClassName = L"MMDViewer";

    /* 注册窗口类 */
    RegisterClass(&wndclass);

    /* 不能改变窗口大小 */
    int style = WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX;

    /* 根据客户区大小计算窗口大小 */
    RECT rect = { 0, 0, 800, 600 };
    AdjustWindowRect(&rect, style, 0);

    /* 居中显示计算窗口位置和大小 */
    int w = rect.right - rect.left;
    int h = rect.bottom - rect.top;
    int x = (GetSystemMetrics(SM_CXSCREEN) - w) / 2;
    int y = (GetSystemMetrics(SM_CYSCREEN) - h) / 2;

    /* 创建窗口 */
    HWND hwnd = CreateWindow(L"MMDViewer", L"MMDViewer", style, x, y, w, h, NULL, 0, ( HINSTANCE ) GetModuleHandle(0), 0);

    /* 显示窗口 */
    ShowWindow(hwnd, SW_SHOWNORMAL);
    UpdateWindow(hwnd);

    return hwnd;
}

  该函数返回新建的窗口句柄,需要注意的是,这里重新计算了窗口的大小。如果按 800x600 创建窗口,则窗口客户区的大小就会小于 800x600,因为客户区才是真正渲染的区域,所以希望客户区的大小就是 800x600,而窗口的大小需要重新计算。使用的函数是 AdjustWindowRect(),它能过返回窗口的需要大小。

  还有就是窗口事件处理函数,这里添加了可以使窗口关闭的代码:

LRESULT CALLBACK WindowProc(HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch ( msg )
    {
    case WM_CLOSE:
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_PAINT:
        RECT rect;
        if ( GetUpdateRect(wnd, &rect, FALSE) )
        {
            ValidateRect(wnd, &rect);
        }
        break;
    }
    return DefWindowProc(wnd, msg, wParam, lParam);
}

  最后就是事件循环,它在主函数中:

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    HWND hwnd = Create();

    /* 主事件循环 */
    MSG msg = { 0 };
    while ( WM_QUIT != msg.message )
    {
        if ( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return ( int ) msg.wParam;
}

  编译程序,成功运行后就会弹出一个窗口:

  源码下载:MMDViewer 02.zip

原文地址:https://www.cnblogs.com/ForEmail5/p/8150422.html

时间: 2024-10-29 20:52:13

基于 DirectX11 的 MMDViewer 02-创建一个窗口的相关文章

pywin32创建一个窗口

import win32con,win32gui class MyWindow(): def __init__(self): #注册一个窗口类 wc = win32gui.WNDCLASS() wc.lpszClassName = 'MyWindow' wc.hbrBackground = win32con.COLOR_BTNFACE+1 #这里颜色用法有点特殊,必须+1才能得到正确的颜色 wc.lpfnWndProc = self.wndProc #可以用一个函数,也可以用一个字典 class

基于 DirectX11 的 MMDViewer 03-渲染管线(1)

准备工作: 开始搭建框架之前,你需要确保已经进行了 D3D 开发环境的搭建,相关教程可以阅读这篇文章.不了解 DirectX11 的人,这个作者有关 DirectX11 的教程最好阅读一下,虽然文章不多,但都很详细,有了基础以后在进行深一步的扩展. 和 OpenGL 一样,在渲染出图形之前,都需要经过很多步骤(窗口配置.图形上下文的创建.顶点数据配置.着色器的配置.变换矩阵配置等等),不是一两行代码就可以了.而 DirectX11 则更为复杂,其中如果发生一点错误,将导致图形渲染失败,但你难以检

基于 DirectX11 的 MMDViewer 04-渲染目标视图和多视口

这篇文章主要介绍渲染管线输出部分的内容:交换链和渲染目标对象,并且介绍多视口渲染方法. 交换链: 要创建交换链,必须先设置交换链描述.交换链描述定义了将由交换链使用的渲染缓冲区的大小和数量.它还将窗口与交换链相关联,从而确定最终图像的显示位置.交换链描述还定义了该应用的消除锯齿(如果有的话)的质量以及在展示过程中后端缓冲区的翻转方式. UINT create_device_flags = 0; #ifdef _DEBUG create_device_flags |= D3D11_CREATE_D

MFC创建一个窗口五大步

.窗口的创建步骤: 1.设计一个窗口类: WNDCLASS结构体参数: (1)       UINT style:窗口类的类型, (2)       WNDPROC lpfnWndProc:窗口的过程,接收一个指针,在程序中会将一个回调函数赋给他,有系统自动调用 (3)       int cbClsExtra:追加一定字节的额外存储空间,附加内存空间,常设置为0 (4)       int cbWndExtra:窗口的附加内存,常置为0 (5)       HINSTANCE hInstanc

创建一个窗口

用函数CreateWindow()或CreateWindowEx()来创建窗口(或任何其他类似于窗口的对象,如控件).创建窗口时必须提供窗口类的文本名称,这个窗口类名称为之前想系统申请的类名称,用于表示窗口类.下面是CreateWindowEx()的函数原型: CreateWindowEx( DWORD dwExStyle,//窗口的扩展风格,是一种高级功能,一般都为NULL LPCTSTR lpClassName,//指向注册类名的字符串指针 LPCTSTR lpWindowName,//指向

Linux OpenGL 实践篇-2 创建一个窗口

OpenGL 作为一个图形接口,并没有包含窗口的相关内容,但OpenGL使用必须依赖窗口,即必须在窗口中绘制.这就要求我们必须了解一种窗口系统,但不同的操作系统提供的创建窗口的API都不相同,如果我们在学习OpenGL时要去学习一整套的窗口系统,这将带来很多的不便,所以出现了GLUT.GLUT全称OpenGL Utility Toolkit,是一套和窗口系统无关的软件包,为我们提供了窗口创建,用户输入输出处理等功能.优点是:简小,精悍.注意GLUT并不是一个功能特别全面的窗口系统工具包,所以构建

DirectX11 学习笔记3 - 创建一个立方体 和 坐标轴

这个程序再进一步的将上一个程序 面向对象化. 把模型类独立出来.更加像一个框架. 在此中遇到了一个很逗比的问题,弄了一晚上,看了好几遍其他列子才找到.就是有些函数一定要放在Render里面实时更新,而不是只放到初始化InitModel里面 因为当要渲染多个物体的时候,缓冲区的内容是要随设备变化的. 话不多说直接上代码 主程序main #include "D3DBase.h" #include "Axis.h" #include "Cube.h"

DirectX11 学习笔记3 - 创建一个立方体 和 轴

该方案将在进一步的程序 面向对象. 独立的模型类.更像是一个框架. 其中以超过遇到了一个非常有趣的问题,.获得一晚.我读了好几遍,以找到其他的列子.必须放在某些功能Render里面实时更新,而不是仅仅进入初始化InitModel里边 染多个物体的时候,缓冲区的内容是要随设备变化的. 话不多说直接上代码 主程序main #include "D3DBase.h" #include "Axis.h" #include "Cube.h" class D3

C语言创建一个窗口提示

打开Vs2012[我的是2012] /* X下面这些东西并没有什么用... 就不改了用2013 2015都一样 当然 devC++ 还有最原始的那个vc6.0也都是可以的. 编译环境遇到了相关问题网上搜索一下就可以解决的.最重要的是相信自己是可以解决的. 我就遇到了PDB加载不了的状况. 解决方案:http://jingyan.baidu.com/article/90bc8fc87fbafff653640ca6.html [开始用的 DEVC++] */ 二.新建项目 三. 下一步点选空项目: