#include <d3d9.h>#pragma comment(lib, "d3d9.lib")PDIRECT3D9 g_D3D = nullptr; // D3D对象
PDIRECT3DDEVICE9 g_D3DDevice = nullptr; // D3D设备对象bool InitializeD3D(HWND hWnd); // 初始化D3D
void ShutdownD3D(); // 退出窗口之前释放D3D对象和D3D设备对象
void RenderScene(); // 渲染场景// windows的消息处理函数
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{switch (msg){case WM_DESTROY:PostQuitMessage(0);return 0;break;default:break;}// windows消息的默认处理函数return DefWindowProc(hWnd, msg, wParam, lParam);
}void MyCreateWindow(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{// 声明一个窗口类 包含创建一个窗口所需要的相关数据信息WNDCLASSEX wc = {sizeof(WNDCLASSEX), // 窗口类的内存空间大小(字节)CS_CLASSDC, // 窗口风格MsgProc, // 处理消息的函数指针0, // 类额外信息0, // 窗口额外信息hInstance, // 句柄,可以看作是窗口的身份标识nullptr, // 图标样式nullptr, // 鼠标样式nullptr, // 背景画刷 也可以设置为一个颜色值 调用UnregisterClass后由系统删除nullptr, // 菜单"AppClass", // 窗口类名 nullptr // 窗口小图标};// 注册窗口类RegisterClassEx(&wc);// 创建窗口HWND hWnd = CreateWindow("AppClass", // 窗口类名"Window Title", // 窗口标题WS_OVERLAPPEDWINDOW, // 窗口风格 (可重叠)100, // 窗口左上角在屏幕坐标中的X值100, // 窗口左上角在屏幕坐标中的Y值640, // 窗口宽度480, // 窗口高度GetDesktopWindow(), // 窗口父类nullptr, // 菜单hInstance, // 句柄nullptr);if (InitializeD3D(hWnd)){// 设置指定窗口为显示状态ShowWindow(hWnd, SW_SHOWDEFAULT);// 发送绘制消息给窗口UpdateWindow(hWnd);MSG msg;ZeroMemory(&msg, sizeof(msg));while (msg.message != WM_QUIT){if (PeekMessage(&msg, // 存储消息的结构体指针nullptr, // 窗口消息和线程消息都会被处理 0, // 消息过滤最小值; 为0时返回所有可用信息0, // 消息过滤最大值; 为0时返回所有可用信息PM_REMOVE // 指定消息如何处理; 消息在处理完后从队列中移除)){TranslateMessage(&msg); // 变换虚拟键消息到字符消息,字符消息被发送到调用线程的消息队列DispatchMessage(&msg); // 派发消息到窗口过程}else{// 渲染场景RenderScene();}    }}// 释放D3D对象和D3D设备对象资源ShutdownD3D();// 注销窗口类,释放窗口所占用资源UnregisterClass("AppClass", wc.hInstance);
}int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{MyCreateWindow(hInstance, hPrevInstance, lpCmdLine, nShowCmd);return 0;
}bool InitializeD3D(HWND hWnd)
{// 显示模式 (以像素为单位的屏幕宽高,刷新频率,surface formt)D3DDISPLAYMODE displayMode;// 创建D3D对象 获取主显卡硬件信息  最先被创建,最后被释放g_D3D = Direct3DCreate9(D3D_SDK_VERSION);if (g_D3D == nullptr){return false;}// 获取显示模式if (FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT/*查询主显卡*/, &displayMode))){return false;}// D3D 显示参数D3DPRESENT_PARAMETERS d3dpp;ZeroMemory(&d3dpp, sizeof(d3dpp));d3dpp.Windowed = true; // 是否窗口化d3dpp.BackBufferFormat = displayMode.Format;  // D3DFMT_X8R8G8B8  表示为32位RGB像素格式 每种颜色用一个字节表示d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 帧缓冲区交换方式; 可能是COPY可能是FLIP,由设备来确定适合当前情况的方式// 创建D3D设备对象 ---- 代表显卡if (FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice))){return false;}return true;
}void ShutdownD3D()
{if (g_D3DDevice != nullptr){g_D3DDevice->Release();}if (g_D3D != nullptr){g_D3D->Release(); // 最行创建, 最后释放}
}void RenderScene()
{g_D3DDevice->Clear(0, nullptr, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);g_D3DDevice->BeginScene();// 3D图形数据g_D3DDevice->EndScene();// 显示backbuffer内容到屏幕g_D3DDevice->Present(nullptr, nullptr, nullptr, nullptr);
}

DirectX 创建一个窗口相关推荐

  1. 用SDL创建一个窗口

     原文来自:http://www.aaroncox.net/tutorials/2dtutorials/sdlwindow.html 注意:这里我们想当然你已经知道怎么在你的IDE集成开发环境里配 ...

  2. 【java】创建一个窗口,统计输入内容

    创建一个窗口,统计输入内容 package p1; import javax.swing.JOptionPane;public class Java_1 {public static void mai ...

  3. Windows API 编程起始——创建一个窗口

    最初了解Windows api编程呢,就是先创建出一个最简洁的窗口,就如我们学习C/C++时的"Helloword"一样,这是进入windows编程大门的重要一个步,下面就开始吧. ...

  4. Windows编程---使用C/C++语言创建一个窗口

    序言 记得刚学习C语言的时候,我还只能写出在"小黑框"里面运行的控制台程序.后来我了解到这种控制台程序属于命令行界面(CLI,Command-Line Interface),而我们 ...

  5. 利用GLFW创建一个窗口

    利用GLFW创建一个窗口 创建窗口前的准备工作 GLFW初始化 设置界面属性 界面相关属性 缓冲区相关属性 上下文相关属性 各个属性的默认值和取值范围 创建窗口 显示窗口 完整代码 窗口事件交互 完整 ...

  6. Vulkan学习--5.创建一个窗口表面和交换链

    • 创建一个窗口,窗口表面和交换链 1.检测交换链是否支持 2.启用交换链扩展 3.选择适当的表面格式 4.查找最佳的可用呈现模式 5.设置交换范围 6.创建窗口表面 7.创建交换链 8.查询交换链支 ...

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

    OpenGL 作为一个图形接口,并没有包含窗口的相关内容,但OpenGL使用必须依赖窗口,即必须在窗口中绘制.这就要求我们必须了解一种窗口系统,但不同的操作系统提供的创建窗口的API都不相同,如果我们 ...

  8. DirectX创建Windows窗口

    过程: WinMain 窗口类 -> 注册窗口类 创建窗口 -> 显示和更新窗口 消息循环 -> 窗口过程 #include <Windows.h>#define WIN ...

  9. 创建一个窗口,在窗口中心位置添加一个选项卡窗格,窗口采用边框布局,选项卡窗格添加两个面板,一个空面板,一个类似于千鸟格的面板。

    ​//在Java的GUI设计中,如果要想实现在一个窗体中多个界面并且能在这些界面内可以随意切换,那选项卡面板绝对是最佳的选择,下面将具体介绍JTabbedPane的使用方法 //pane是Java中的 ...

最新文章

  1. endnote能自动翻译吗_人工智能能翻译古文吗?跟小编点评专业翻译PK人工智能翻译...
  2. ESP8266访问网站-urequest get方法
  3. Monte Carlo仿真方法的基本思想及其特点
  4. 关于 pip install mysqlclent安装失败 ERROR: No matching distribution found for mysqlclient 的解决方案
  5. python的datetime举例_Python datetime.timedelta()用法及代码示例
  6. 第四次作业-四则运算
  7. Hbase 高级特性Bloom filter
  8. 需求分析挑战之旅(疯狂的订餐系统)(8)——最后的疯狂
  9. 鸿蒙系统被烧毁,华为鸿蒙操作系统再次被质疑 国产是原罪
  10. Gitee 轻量级 PR ——参与开源贡献,原来就是举手之劳的事
  11. VC++ (四)动态内存
  12. CCF201609-2 火车购票(100分)
  13. mysql workbench 建表时PK, NN, UQ, BIN, UN, ZF, AI
  14. 计算机组成原理-王道习题1
  15. 并发测试工具(ubuntu 16.04)
  16. Flask 上传自定义头像_1 使用Flask Uploads
  17. python微信自动发朋友圈_Python自制微信机器人:群发消息、自动接收好友
  18. 模指数运算之python实现
  19. elasticsearch学习六:学习 全文搜索引擎 elasticsearch的语法,使用kibana进行模拟测试(持续更新学习)
  20. C#Form窗体模仿PhotoShop软件,高仿真原PS界面,实现PS对图片基本操作、拍照等,计算机图形学相关

热门文章

  1. 我把面试 ThreadLocal 能问的,都写了
  2. 【python算法练习】
  3. [DAX] SWITCH函数
  4. 对称加密与非对称加密的优缺点及非对称加密的使用前提
  5. ISAKMP Profile技术应用
  6. EXCEL调用ChatGPT
  7. JavaScript动态生成元素绑定事件时的一些问题、解决与思考
  8. CSS3 之高级动画(5)CSS3铅笔玻璃瓶
  9. 向google申请白名单
  10. 智能仓储系统哪家公司做的比较好?求推荐排名不错的智能仓储公司?