使用GDI/GDI+绘制到D3D9缓冲区的方法
这个其实是3D绘图里嵌入2D绘图的传统方式。
D3D9直接使用GDI/GDI+就可以画图,只不过需要额外的设置,而且只支持RGB和XRGB,不支持ARGB。因此这种方法比较适合合成UI元素和不透明的纹理贴图,不适合将要进行AlphaBlend操作的纹理贴图。ARGB贴图的合成要通过手动上传Gdiplus::Bitmap来实现。
使用GDI+画图的步骤:
- 创建设备dev时,需要pp->Flags设置D3DPRESENTFLAG_LOCKABLE_BACKBUFFER
- 调用dev->GetBackBuffer获取后台缓冲区surface
- 使用surface->GetDC获得GDI兼容的HDC句柄
- 使用这个句柄在花括号{}内创建GDI+的Graphics对象进行画图
- 依次调用ReleaseDC和Release释放HDC和surface
- 调用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缓冲区的方法相关推荐
- GDI+入门(5、在GDI+中绘制带动画效果的图片)
五.在GDI+中绘制带动画效果的图片 private void Form2_Load(object sender, EventArgs e) { SetStyle(ControlStyles.Doub ...
- D2D引擎与GDI\GDI+绘制效果对比
本例主要是对比D2D和GDI在绘制文字.线条的区别,以及D2D与GDI+在绘制图片时的区别. D2D是基于COM组件开发的,使用前的CoInitialize(NULL)是必须的:另外,GDI+的初始化 ...
- GDI/GDI+/D2D/D3D
原文链接 : 2D Drawing APIs in Windows 在 Windows 7 操作系统中,微软花费了很大的力气构建了一套新的 2D 绘图 API.我们称之为 Direct2D ,隶属于 ...
- Windows 2D 绘图 (GDI, GDI+, Direct2D)
Windows 2D 绘图 GDI GDI 函数 GDI+ GDI 和 GDI+ 的区别 GDI+ 新特性 Direct2D 视觉效果 demo GDI GDI 是 Graphics Device I ...
- 【OpenGL】十、OpenGL 绘制点 ( 初始化 OpenGL 矩阵 | 设置投影矩阵 | 设置模型视图矩阵 | 绘制点 | 清除缓冲区 | 设置当前颜色值 | 设置点大小 | 绘制点 )
文章目录 一.初始化 OpenGL 矩阵 1.设置投影矩阵 2.设置模型视图矩阵 二.绘制点 1.清除缓冲区 2.设置当前颜色值 3.设置绘制点的大小 4.绘制点 5.将缓冲区绘制到前台 三.部分代码 ...
- VC知识库视频大讲坛系列之GDI GDI+从入门到精通
第1章 <GDI GDI+从入门到精通视频> 第1节<GDI GDI+从入门到精通>前言 第2节<GDI GDI+从入门到精通>第一讲 第3节<GDI GDI ...
- 【ArcGIS微课1000例】0043:ArcGIS绘制国界线的3种方法
本文讲解ArcGIS绘制国界线的3种方法. 文章目录 1. 直接修改国界线符号 2. 缓冲区工具 3. 制图表达 1. 直接修改国界线符号 直接修改国界线/省界线的符号.点击"线要素&quo ...
- 介绍三种绘制时间线图的方法
作者 |周萝卜 来源 |萝卜大杂烩 今天我们再来分享几种不同的制作方法,大家可以自行比较下各种方法的优劣. Matplotlib 制作 Matplotlib 作为 Python 家族最为重要的可视化工 ...
- python 子图_python 实现在一张图中绘制一个小的子图方法
有时候为了直观展现图的信息,可以在大图中添加小子图的方式进行数据分析,如下图所示: 具体的代码如下:该图连接了数据库,当然重要的不是数据展示,而是添加子图的方法. import matplotlib. ...
- python画直方图代码-Python绘制直方图及子图的方法分析(代码示例)
本篇文章给大家带来的内容是关于Python绘制直方图及子图的方法分析(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.直方图的绘制也需要用到matplotlib下的py ...
最新文章
- python if elif else 区别
- java用关键字 指明继承关系_【填空题】java中用关键字 指明继承关系、用关键字 指明接口实现。...
- 用Python和OpenCV创建一个图片搜索引擎的完整指南
- html语言填充没有只有描边,HTML5 Canvas笔记——交互绘制文本(描边、填充、阴影、渐变填充、图案填充、文本的属性设置)...
- Exchange数据保护
- 二叉树的高度和节点数
- 高精度(压位+判负数+加减乘+读写)
- python数据库实现注册函数_python 函数 之 用户注册register()
- CAS 4.1.x 单点登出(退出登录)的原理解析
- 特征工程之归一化及标准化
- 算法笔记二分查找问题1
- TiDB 在 Cisco Webex 架构中的部署和应用
- 非线性光学近似计算机应用,浅谈非线性光学的发展及应用
- 直播常见协议概念说明
- MeteoInfo-Micaps绘制色斑图
- 数据库---[复习2]---数据查询---设有一个SPJ数据库,包括S、P、J及SPJ4个关系模式··· ···
- adc芯片资料——电子迷你秤芯片CS1180
- Ubuntu 20.04 : 几个BT下载软件和命令
- 数学建模系列-预测模型(一)灰色预测模型
- Zbrush一些基本操作
热门文章
- VIVADO synthesis和implementation具体完成什么操作
- 漫谈大数据 - 实时数据仓库以及大厂实际应用
- win10修改用户名_win10最详细优化设置|win10专业版笔记本优化教程
- 网贷平台倒闭了钱要还吗?网贷平台倒闭了怎么还钱
- vmware14安装黑苹果max ox x 10.13懒人版教程
- Android中使用AudioManager实现按键录音并保存以及点击播放功能
- 大数据内涵-“岂止于大”
- 【Pandas学习笔记Task05】:变形
- 中国的超级计算机银河号,美国突然切断GPS,是银河号的一次屈辱,中国:不会再让悲剧发生...
- Mysql之三少一多原则