当前位置: 首页 > news >正文

缓存HDC内容用于后续Direct2D绘制.

思路:把HDC里的内容保存到Direct2D格式的位图里,后续直接调用 renderTarget->DrawBitmap即可。本例中,位图将保存为类的字段。

本例中 COM 接口指针皆使用 com_ptr,这是 WinRT 的 COM 智能指针类,com_ptr<I>::get() 返回的是实际接口指针,put() 返回实际接口指针的指针。可以用 ATL 的 ComPtr 类代替,功能相同,但用法稍有不同。

缓存

假设已有 RichEdit Control 句柄 m_editBox,欲将其图像缓存到一个D2D位图里,后续要把位图绘制到 Render target 或 ID2D1DeviceContext 对象 m_ctx 上。字段 m_bitmap 作为位图缓存,字段 m_bmpRT 作为位图缓存的呈现目标(不会在绘制位图时真的用到,但要存)。
则可用如下代码把该编辑框的 DC 的内容复制到 m_bitmap 里:

float dpiX, dpiY;
m_ctx->GetDpi(&dpiX, &dpiY);
auto dpiFactor = dpiX / 96.0f;RECT rect;
GetClientRect(m_editBox, &rect);// 先创建内存render target(BitmapRenderTarget),类似于创建内存DC,
// 不同之处在于不用手动创建、选择bitmap,D2D会自动完成该操作。
auto bmpRtPixelSize = D2D1::SizeU(rect.right, rect.bottom);
auto bmpRtSize = D2D1::SizeF(bmpRtPixelSize.width / dpiFactor, bmpRtPixelSize.height / dpiFactor);
auto bmpRtPixelFmt = D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE);
HRESULT hr = m_ctx->CreateCompatibleRenderTarget(bmpRtSize, bmpRtPixelSize, bmpRtPixelFmt,D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_GDI_COMPATIBLE,m_bmpRT.put());// 获取与 GDI 兼容的 render target 接口指针。
// 该接口仍然属于上面创建的 BitmapRenderTarget 对象(对 QueryInterface
// 的理解),所以尽管 gdiRT 本身没有 BeginDraw 方法,仍可调用 
// m_bmpRT->BeginDraw() 来使该对象处于正确状态。EndDraw() 同理。
com_ptr<ID2D1GdiInteropRenderTarget> gdiRT;
m_bmpRT->QueryInterface(gdiRT.put());
m_bmpRT->BeginDraw();
HDC rtDC{};
hr = gdiRT->GetDC(D2D1_DC_INITIALIZE_MODE_CLEAR, &rtDC);// 把编辑框 DC 内容复制到 render target 的 DC 上
HDC hdc = GetDC(m_editBox);
BitBlt(rtDC, 0, 0, rect.right, rect.bottom, hdc, 0, 0,SRCCOPY);
ReleaseDC(m_editBox, hdc);gdiRT->ReleaseDC(nullptr);
hr = m_bmpRT->EndDraw();
if (FAILED(hr)) {// 处理异常
}m_bmpRT->GetBitmap(m_bitmap.put());

绘制到任意 ID2D1RenderTarget 或 ID2D1DeviceContext 上

直接调用 DrawBitmap 即可:

m_ctx->DrawBitmap(m_bitmap.get());
http://www.dtcms.com/a/297142.html

相关文章:

  • 数据仓库深度探索系列 | 开篇:开启数仓建设新征程
  • 验证回文串-leetcode
  • Nginx简单介绍
  • 【STM32】Keil + FreeRTOS + HAL DMA + UART 空闲中断 接收异常
  • 【矩阵专题】Leetcode48.旋转图像(Hot100)
  • leetcode_122 买卖股票的最佳时机II
  • STM32与ADS1220实现多通道数据采集的完整分析和源程序
  • Comfyui中Upscale Image By 几种放大方法的区别
  • Java研学-RabbitMQ(三)
  • Centos7安装rabbitmq
  • RabbitMQ—HAProxy负载均衡
  • React性能优化终极指南:memo、useCallback、useMemo全解析
  • Ubuntu22 上,用C++ gSoap 创建一个简单的webservice
  • NineData 数据库 DevOps 全面支持 GaussDB,国产化管理再升级!
  • Spring Boot 自动装配底层源码实现详解
  • 国产DevOps平台Gitee:如何重塑中国企业研发效能新格局
  • Java 单元测试详解:从入门到实战,彻底掌握 JUnit 5 + Mockito + Spring Boot 测试技巧
  • react中 多个层级 组件数据同用 组件之间传值 usecontext useReducer
  • Gitee如何成为国内企业DevOps转型的首选平台?
  • 璞致 PZSDR-P101:ZYNQ7100+AD9361 架构软件无线电平台,重塑宽频信号处理范式
  • ERNIE-4.5-0.3B 实战指南:文心一言 4.5 开源模型的轻量化部署与效能跃升
  • 规则分配脚本
  • 初识JVM--从Java文件到机器指令
  • 中国开源Qwen3 Coder与Kimi K2哪个最适合编程
  • “磁”力全开:钕铁硼重塑现代科技生活
  • Linux 网络与 Vim 编辑器操作
  • 3D实景的概念、特点及应用场景
  • 从“人工眼”到‘智能眼’:EZ-Vision视觉系统如何重构生产线视觉检测精度?
  • AI与区块链融合:2025年的技术革命与投资机遇
  • C++与Hive、Spark、libhdfs、ACID交互技巧