这个其实是3D绘图里嵌入2D绘图的传统方式。

D3D9直接使用GDI/GDI+就可以画图,只不过需要额外的设置,而且只支持RGB和XRGB,不支持ARGB。因此这种方法比较适合合成UI元素和不透明的纹理贴图,不适合将要进行AlphaBlend操作的纹理贴图。ARGB贴图的合成要通过手动上传Gdiplus::Bitmap来实现。

使用GDI+画图的步骤:

  1. 创建设备dev时,需要pp->Flags设置D3DPRESENTFLAG_LOCKABLE_BACKBUFFER
  2. 调用dev->GetBackBuffer获取后台缓冲区surface
  3. 使用surface->GetDC获得GDI兼容的HDC句柄
  4. 使用这个句柄在花括号{}内创建GDI+的Graphics对象进行画图
  5. 依次调用ReleaseDC和Release释放HDC和surface
  6. 调用dev->PresentEx上屏

D3D10/D3D11也差不多,只不过要设置的东西比较多。具体设置方法请参见MSDN。

不过D3D10.1可以用D2D1,D3D11可以用D2D1.1,一般没有必要使用GDI/GDI+合成2D图片。除非要在D3D11里使用,但是却不允许使用D2D1.1,才需要使用GDI/GDI+合成2D图片。

// d3d9gdi.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <windows.h>
#include <d3d9.h>
#include <stdlib.h>
#include <gdiplus.h>
#include "resource.h"
#pragma comment(lib, "d3d9")
#pragma comment(lib, "gdiplus")
using namespace Gdiplus;INT_PTR __stdcall DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{static HMODULE rastlib;static IDirect3D9Ex *d3d;static IDirect3DDevice9Ex *dev;RECT rcc;GetClientRect(hWnd, &rcc);D3DPRESENT_PARAMETERS pp = {};pp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; // 重要:兼容GDIpp.SwapEffect = D3DSWAPEFFECT_DISCARD;pp.Windowed = TRUE;if (msg == WM_INITDIALOG) // 创建{// 创建D3D9设备Direct3DCreate9Ex(D3D_SDK_VERSION, &d3d);HRESULT hr = d3d->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING, &pp, NULL, &dev);if (FAILED(hr)){if (!rastlib)rastlib = LoadLibrary(L"rgb9rast.dll");if (!rastlib)rastlib = LoadLibrary(L"rgb9rast_2.dll");if (rastlib){d3d->RegisterSoftwareDevice(GetProcAddress(rastlib, "D3D9GetSWInfo"));d3d->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_SW, hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING, &pp, NULL, &dev);}}return TRUE;}if (msg == WM_SIZE) // 窗口大小变化{dev->ResetEx(&pp, NULL);}if (msg == WM_ERASEBKGND) // 防闪烁return TRUE;if (msg == WM_PAINT) // 需要重绘{// 移除WM_PAINT消息PAINTSTRUCT ps;BeginPaint(hWnd, &ps);EndPaint(hWnd, &ps);// 使用D3D9绘制// 清屏dev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 255, 255), 1.0f, 0);// 获取GDI句柄IDirect3DSurface9 *surface;dev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &surface);HDC hdc = NULL;HRESULT hr = surface->GetDC(&hdc);// 使用GDI+绘制if (1){Graphics g(hdc);SolidBrush brush(Color::Black);Font font(L"Arial", 16);g.DrawString(L"我是中文!", 5, &font, PointF(10, 10), &brush);}// 释放GDI句柄surface->ReleaseDC(hdc);surface->Release();// 上屏dev->PresentEx(NULL, NULL, NULL, NULL, 0);return TRUE;}if (msg == WM_DESTROY) // 窗口销毁{// 清理资源dev->Release();d3d->Release();return FALSE;}if (msg == WM_COMMAND){WORD nID = LOWORD(wParam);if (nID == IDCANCEL) // 对话框取消{EndDialog(hWnd, IDCANCEL);return TRUE;}}return FALSE;
}int main()
{DWORD_PTR gdiplustoken;GdiplusStartup(&gdiplustoken, &GdiplusStartupInput(), NULL);DialogBox(NULL, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);GdiplusShutdown(gdiplustoken);return 0;
}

使用GDI/GDI+绘制到D3D9缓冲区的方法相关推荐

  1. GDI+入门(5、在GDI+中绘制带动画效果的图片)

    五.在GDI+中绘制带动画效果的图片 private void Form2_Load(object sender, EventArgs e) { SetStyle(ControlStyles.Doub ...

  2. D2D引擎与GDI\GDI+绘制效果对比

    本例主要是对比D2D和GDI在绘制文字.线条的区别,以及D2D与GDI+在绘制图片时的区别. D2D是基于COM组件开发的,使用前的CoInitialize(NULL)是必须的:另外,GDI+的初始化 ...

  3. GDI/GDI+/D2D/D3D

    原文链接 : 2D Drawing APIs in Windows 在 Windows 7 操作系统中,微软花费了很大的力气构建了一套新的 2D 绘图 API.我们称之为 Direct2D ,隶属于 ...

  4. Windows 2D 绘图 (GDI, GDI+, Direct2D)

    Windows 2D 绘图 GDI GDI 函数 GDI+ GDI 和 GDI+ 的区别 GDI+ 新特性 Direct2D 视觉效果 demo GDI GDI 是 Graphics Device I ...

  5. 【OpenGL】十、OpenGL 绘制点 ( 初始化 OpenGL 矩阵 | 设置投影矩阵 | 设置模型视图矩阵 | 绘制点 | 清除缓冲区 | 设置当前颜色值 | 设置点大小 | 绘制点 )

    文章目录 一.初始化 OpenGL 矩阵 1.设置投影矩阵 2.设置模型视图矩阵 二.绘制点 1.清除缓冲区 2.设置当前颜色值 3.设置绘制点的大小 4.绘制点 5.将缓冲区绘制到前台 三.部分代码 ...

  6. VC知识库视频大讲坛系列之GDI GDI+从入门到精通

    第1章 <GDI GDI+从入门到精通视频> 第1节<GDI GDI+从入门到精通>前言 第2节<GDI GDI+从入门到精通>第一讲 第3节<GDI GDI ...

  7. 【ArcGIS微课1000例】0043:ArcGIS绘制国界线的3种方法

    本文讲解ArcGIS绘制国界线的3种方法. 文章目录 1. 直接修改国界线符号 2. 缓冲区工具 3. 制图表达 1. 直接修改国界线符号 直接修改国界线/省界线的符号.点击"线要素&quo ...

  8. 介绍三种绘制时间线图的方法

    作者 |周萝卜 来源 |萝卜大杂烩 今天我们再来分享几种不同的制作方法,大家可以自行比较下各种方法的优劣. Matplotlib 制作 Matplotlib 作为 Python 家族最为重要的可视化工 ...

  9. python 子图_python 实现在一张图中绘制一个小的子图方法

    有时候为了直观展现图的信息,可以在大图中添加小子图的方式进行数据分析,如下图所示: 具体的代码如下:该图连接了数据库,当然重要的不是数据展示,而是添加子图的方法. import matplotlib. ...

  10. python画直方图代码-Python绘制直方图及子图的方法分析(代码示例)

    本篇文章给大家带来的内容是关于Python绘制直方图及子图的方法分析(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.直方图的绘制也需要用到matplotlib下的py ...

最新文章

  1. python if elif else 区别
  2. java用关键字 指明继承关系_【填空题】java中用关键字 指明继承关系、用关键字 指明接口实现。...
  3. 用Python和OpenCV创建一个图片搜索引擎的完整指南
  4. html语言填充没有只有描边,HTML5 Canvas笔记——交互绘制文本(描边、填充、阴影、渐变填充、图案填充、文本的属性设置)...
  5. Exchange数据保护
  6. 二叉树的高度和节点数
  7. 高精度(压位+判负数+加减乘+读写)
  8. python数据库实现注册函数_python 函数 之 用户注册register()
  9. CAS 4.1.x 单点登出(退出登录)的原理解析
  10. 特征工程之归一化及标准化
  11. 算法笔记二分查找问题1
  12. TiDB 在 Cisco Webex 架构中的部署和应用
  13. 非线性光学近似计算机应用,浅谈非线性光学的发展及应用
  14. 直播常见协议概念说明
  15. MeteoInfo-Micaps绘制色斑图
  16. 数据库---[复习2]---数据查询---设有一个SPJ数据库,包括S、P、J及SPJ4个关系模式··· ···
  17. adc芯片资料——电子迷你秤芯片CS1180
  18. Ubuntu 20.04 : 几个BT下载软件和命令
  19. 数学建模系列-预测模型(一)灰色预测模型
  20. Zbrush一些基本操作

热门文章

  1. VIVADO synthesis和implementation具体完成什么操作
  2. 漫谈大数据 - 实时数据仓库以及大厂实际应用
  3. win10修改用户名_win10最详细优化设置|win10专业版笔记本优化教程
  4. 网贷平台倒闭了钱要还吗?网贷平台倒闭了怎么还钱
  5. vmware14安装黑苹果max ox x 10.13懒人版教程
  6. Android中使用AudioManager实现按键录音并保存以及点击播放功能
  7. 大数据内涵-“岂止于大”
  8. 【Pandas学习笔记Task05】:变形
  9. 中国的超级计算机银河号,美国突然切断GPS,是银河号的一次屈辱,中国:不会再让悲剧发生...
  10. Mysql之三少一多原则