D3D初学入门一(配置开发环境及绘制D3D窗口)

2023-11-09

  最近一直接触的都是C#的东东,好久没写C++代码了,怕手生忘记了,打算写写C++的代码。写什么好呢?想来想去,以前的工作学过接触了些OpenGL,那我就学习一下D3D吧。原以为D3D的中文入门资料会很多的,结果找了半天也没找到合适的。哎,随便将就着学吧。

  既然是来兴趣学一下,我可不想去下个超大的DirectX安装包,所以首先,当然得找到lib库和头文件啦,我在GameRes游戏开发资源网上找到了,只有3.2M,呵呵,够小吧。地址如下:

  DirectX9.0C SDK library

  下载下来解压后,假设解压到d:/codelib/dx9csdk下吧, 首先得把INC和lib目录加到VC的搜索路径上去。

  我用VS2005, 选择菜单Tools - Option - Projects and Solutions - VC++ Directories

  如图:

  

  然后,接下来就可以开始写代码了。

  我们采用Win32API来创建窗口,为了重用代码,创建窗口使用了我博客里介绍的一个类KWindow,请见:

  一个基于Win32的完全面向对象的窗口类

  我们新建一个类,叫做KD3DWindow把,从KWindow继承。

  其UML图如下所示:

  KWindow的内容请看我博客上的前一篇文章吧。

  KD3DWindow.h的内容如下所示:

  1. #include "KWindow.h"
  2. #include <D3D8.H>
  3. #pragma comment(lib, "D3d8.lib")   //链接库
  4. class KD3DWindow : public KWindow
  5. {
  6. private:
  7.     void OnKeyDown(WPARAM wParam, LPARAM lParam);
  8.     void OnDraw(HDC hDC);
  9.     void GetWndClassEx(WNDCLASSEX & wc);
  10.     
  11.     //D3D相关
  12.     void Render();
  13.     void Cleanup();
  14.     HRESULT InitD3D( HWND hWnd );
  15. public:   
  16.     KD3DWindow();
  17.     ~KD3DWindow();
  18.        virtual bool CreateEx(DWORD dwExStyle,
  19.         LPCTSTR lpszClass, LPCTSTR lpszName, DWORD dwStyle,
  20.         int x, int y, int nWidth, int nHeight, HWND hParent,
  21.         HMENU hMenu, HINSTANCE hInst);
  22. private:
  23.     LPDIRECT3D8             g_pD3D      ; // 用来创建D3D设备
  24.     LPDIRECT3DDEVICE8       g_pd3dDevice ; // D3D设备
  25. };

  KD3DWindow.cpp内容如下:

  1. // KD3DWindow.cpp: implementation of the KD3DWindow class.
  2. //
  3. //
  4. #include "stdafx.h"
  5. #include "KD3DWindow.h"
  6. //
  7. // Construction/Destruction
  8. //
  9. #include <windows.h>
  10. #include <assert.h>
  11. #include <tchar.h>
  12. #include "KWindow.h"
  13. const TCHAR szHint[]    = _T("Press ESC to quit.");
  14. void KD3DWindow::GetWndClassEx( WNDCLASSEX & wc )
  15. {
  16.     memset(& wc, 0, sizeof(wc));
  17.     
  18.     wc.cbSize        = sizeof(WNDCLASSEX);
  19.     wc.style         = 0;
  20.     wc.lpfnWndProc   = WindowProc;
  21.     wc.cbClsExtra    = 0;
  22.     wc.cbWndExtra    = 0;
  23.     wc.hInstance     = NULL;
  24.     wc.hIcon         = NULL;
  25.     wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  26.     wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  27.     wc.lpszMenuName  = NULL;
  28.     wc.lpszClassName = NULL;
  29.     wc.hIconSm       = NULL;
  30. }
  31. void KD3DWindow::OnDraw( HDC hDC )
  32. {
  33.     //先用D3D设备渲染
  34.     Render();
  35.     //用Windows API在屏幕上绘图
  36.     TextOut(hDC, 0, 0, szHint, lstrlen(szHint));
  37. }
  38. void KD3DWindow::OnKeyDown( WPARAM wParam, LPARAM lParam )
  39. {
  40.     if (wParam==VK_ESCAPE )
  41.     {
  42.         PostMessage(m_hWnd, WM_CLOSE, 0, 0);
  43.     }
  44. }
  45. // 初始化D3D
  46. HRESULT KD3DWindow::InitD3D( HWND hWnd )
  47. {
  48.     //如果还没有窗口,返回失败啦
  49.     if( m_hWnd == NULL)
  50.         return E_FAIL;
  51.     // 创建D3D对象
  52.     if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )
  53.         return E_FAIL;
  54.     // 获取当前的显示模式
  55.     D3DDISPLAYMODE d3ddm;
  56.     if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
  57.         return E_FAIL;
  58.     D3DPRESENT_PARAMETERS d3dpp; 
  59.     ZeroMemory( &d3dpp, sizeof(d3dpp) );
  60.     d3dpp.Windowed = TRUE;              // 窗口模式
  61.     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;   // 设置交换模式
  62.     d3dpp.BackBufferFormat = d3ddm.Format;      // 设置背景缓冲区格式为当前左面格式
  63.     // 创建D3D设备
  64.     // 第一个参数:使用默认的显卡
  65.     // 第二个参数:请求使用硬件抽象层(HAL)
  66.     // 第三个参数:窗口句柄
  67.     // 第四个参数:使用软件处理顶点
  68.     // 第五个参数:创建的参数
  69.     // 第六个参数:创建的D3D设备指针
  70.     if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, 
  71.                       D3DDEVTYPE_HAL, 
  72.                       hWnd,
  73.                       D3DCREATE_SOFTWARE_VERTEXPROCESSING,
  74.                       &d3dpp, 
  75.                       &g_pd3dDevice ) ) )
  76.     {
  77.         return E_FAIL;
  78.     }
  79.     return S_OK;
  80. }
  81. // 释放D3D
  82. void KD3DWindow::Cleanup()
  83. {
  84.     if( g_pd3dDevice != NULL) 
  85.         g_pd3dDevice->Release();
  86.     if( g_pD3D != NULL)
  87.         g_pD3D->Release();
  88. }
  89. // 渲染
  90. void KD3DWindow::Render()
  91. {
  92.     if( NULL == g_pd3dDevice )
  93.         return;
  94.     // 清除背景为兰色
  95.     g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
  96.     // 绘制场景
  97.     g_pd3dDevice->BeginScene();
  98.     // 这里绘制你需要的东西
  99.     // 结束绘制
  100.     g_pd3dDevice->EndScene();
  101.     // 显示到屏幕上
  102.     g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
  103. }
  104. KD3DWindow::KD3DWindow()
  105. {
  106. }
  107. KD3DWindow::~KD3DWindow()
  108. {
  109.     Cleanup();
  110. }
  111. bool KD3DWindow::CreateEx(DWORD dwExStyle,
  112.         LPCTSTR lpszClass, LPCTSTR lpszName, DWORD dwStyle,
  113.         int x, int y, int nWidth, int nHeight, HWND hParent,
  114.         HMENU hMenu, HINSTANCE hInst)
  115. {
  116.     //创建窗口
  117.     bool bRet = KWindow::CreateEx(dwExStyle,lpszClass,lpszName,dwStyle,x,y,nWidth,nHeight,hParent,hMenu,hInst);
  118.     //初始化D3D设备
  119.     if( InitD3D(m_hWnd) != S_OK)
  120.         bRet = false;
  121.     return bRet;
  122. }

  代码关键地方都有注释,也很好理解的。

  然后就是主函数如何调用了,请看:

  1. int APIENTRY WinMain(HINSTANCE hInstance,
  2.                      HINSTANCE hPrevInstance,
  3.                      LPSTR     lpCmdLine,
  4.                      int       nCmdShow)
  5. {
  6.     // TODO: Place code here.
  7.     KD3DWindow win;
  8.     //KHelloWindow win; 
  9.     win.CreateEx(0, _T("Hello"), _T("Hello"), WS_OVERLAPPEDWINDOW, GetSystemMetrics(SM_CXSCREEN)/4, GetSystemMetrics(SM_CYSCREEN)/4,
  10.         GetSystemMetrics(SM_CXSCREEN)/2,
  11.         GetSystemMetrics(SM_CYSCREEN)/2,
  12.         NULL, NULL, hInstance);
  13.     win.ShowWindow(nCmdShow);
  14.     win.UpdateWindow();
  15.     return win.MessageLoop();
  16. }

  编译运行后,可以看到程序既有D3D渲染的背景场景,也有Win32 GDI绘制的文字。如下所示:

本文来自
http://blog.csdn.net/zxcred

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

D3D初学入门一(配置开发环境及绘制D3D窗口) 的相关文章

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • SQL - != 'NULL' 的解释

    我的SSMS代码如下 Select top 50 From FilteredContact Where statuscode 1 and emailaddress1 NULL and telephone1 NULL and address1
  • 重载<<的返回值

    include
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 浏览器的渲染机制、提升页面性能、错误监控上报

    js运行机制 微任务队列 事件循环 单线程 错误监控 CSRF防范 css盒模型 Dom事件 原型链
  • 接口测试工具-apipost

    apiost Postman Swagger Mock 功能特色 实现多人实时协作 接口自动化测试 选择接口 组成流程 执行流程 基于接口创建在线文档可分享 官网 Apipost API 文档 调试 Mock 测试一体化协作平台 API列表
  • 02.07_两个链表相交

    给你两个单链表的头节点 headA 和 headB 请你找出并返回两个单链表相交的起始节点 如果两个链表没有交点 返回 null 解法一 如果两个链表有相交 那么从后面看一定是相同的 所以只需要把长的移动到和短的链表一样的长度开始遍历即可
  • 低成本副业:开发小程序商城攻略

    随着互联网的普及和电子商务的兴起 越来越多的人选择做点副业 其中开发小程序商城是一个不错的选择 相比传统的实体店 小程序商城的成本更低 而且门槛更低 可以让更多的人参与到副业中来 那么 如何开发自己的小程序商城呢 下面为大家介绍步骤和技巧
  • STM32中遇到的问题--关于串口的一些常见问题

    在单片机的开发过程中 最常用的外设就是串口了 是用来进行bug纠错 log输出的常用工具 也是用来与外部通讯的常见协议之一 但是在使用串口的过程中难免会遇到一些问题 下面就我在工作遇到的一些问题做了一些记录 与大家分享 其实也是为了自己在以
  • [云原生专题-39]:K8S - 核心概念 - 存储抽象- pod配置文件的挂载ConfigMap

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122856681 目录 前言 第1章
  • 安卓逆向入门指南:应用分析与反编译

    安卓逆向入门指南 应用分析与反编译 概述 简要介绍安卓逆向工程的基本概念和背景 解释逆向工程的目的和重要性 以及在安全审计和应用研究中的应用 应用分析 安卓应用文件结构的解析 介绍APK文件的结构 包括AndroidManifest xml
  • c#中new 后面大括号

    C new一个对象的时候 后面的参数不是用小括号吗 下面的大括号是怎么回事 不是数据为什么会用大括号 BarcodeWriter barcodeWriter new BarcodeWriter Format ZXing BarcodeFor
  • jmap、jstat、jinfo、jstack命令详解

    jmap jmap histo pid gt log txt 此命令可以用来查看内存信息 实例个数以及占用内存大小 num 序号 instances 实例数量 bytes 占用空间大小 class name 类名称 C is a char
  • Windows中.exe程序的启动过程和C/C++运行时库<转载>

    很是受益 Windows中 exe程序的启动过程和C C 运行时库 lt 转载 gt Windows系统中 exe后缀的文件一般可以双击运行 编程时 编译出来的最终结果一般也表现为一个exe程序和其他的为程序执行提供支持的dll 我们双击一
  • Unity3d-简单AR游戏

    Unity3d 简单AR游戏 一 图片识别与建模 Vufria模块的导入 首先是安装Vuforia 模块 2017版本后的可以直接使用Unity Hub安装 安装完成后可以直接在软件中使用 然后在菜单目录的GameObject gt Vuf
  • 利用docx4j word转pdf

    依赖
  • 不能导入当前目录下的py模块,不能导入自己写的包

    遇到一个很奇怪的问题 在jupyter里面 明明这个包就在当前目录下就是不能倒入 后来 发现os getcwd 返回的也不是当前文件所在目录 真是奇哉怪也 然后我在终端cd进去我要运行代码的目录 然后在 jupoyter notebook
  • 【计算机考研】从二本到浙大

    报名志愿 浙大 计算机科学与技术学院 软件工程专业 初试成绩 分数不高 大佬轻喷 以下学习方法仅供参考 小tip 放在前头 1 不要照搬别人的学习方案 马克思主义要中国化 学习也要个人化 学习是很私人的事情 一定要找到最适合自己的学习作息和
  • 关于IDEA中tomcat启动控制台乱码(server Tomcat Localhost Log Tomcat Catalina Log乱码)问题

    之前在网上查了好多 但好多都是乱改一通 没有实际效果 经过自己的几次试验后 终于找到了原因 希望可以帮助大家解决问题 少走些弯路 具体解释如下 在这之前说下 tomcat安装目录中 conf文件夹中的logging properties文件
  • linux vim配置

    vimrc config vim 配置 没有vimrc就之间创建新的 vi vimrc set nu 设置显示行号 set tabstop 4 shiftwidth 4 softtabstop 4 tab 等于四个空格 set expand
  • org.dom4j.DocumentException: null Nested exception: null解决

    org dom4j DocumentException null Nested exception null at org dom4j io SAXReader read SAXReader java 484 at org dom4j io
  • 【SpringCloud实战开发总结】

    Vue开发总结 1 Vue 开启Watch监听 2 on blur 3 disabled 4 InputNumber标签中的 max和 min 5 Select标签用于模糊查询 6 强制渲染的三种方法 7 增加下拉框宽度 8 vue前端校验
  • DHT11温湿度传感器编程详解

    一 DHT11介绍 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器 采用专用的数字模块采集技术和温湿度传感技术 无需复杂的电路处理 传感器包括一个电阻式感湿元件和一个NTC测温元件 并与一个高性能8位单片机相连接
  • D3D初学入门一(配置开发环境及绘制D3D窗口)

    最近一直接触的都是C 的东东 好久没写C 代码了 怕手生忘记了 打算写写C 的代码 写什么好呢 想来想去 以前的工作学过接触了些OpenGL 那我就学习一下D3D吧 原以为D3D的中文入门资料会很多的 结果找了半天也没找到合适的 哎 随便将