本帖最后由 〞剑舞长空 于 2025-3-28 08:08 编辑
纯AI写的,我是懒得写啥内容了。
实际就是翻译C++代码,连着备注都是AI整的
好的,这是一份适合在论坛或文档中描述这段易语言代码作用的格式化文本。
标题: 【易语言/DirectX】使用 D3D11/DXGI/D2D/DirectComposition 初始化图形并合成到窗口的易语言实现
代码语言: 易语言 (EPL)
目标/作用:
这段易语言代码 (InitializeGraphics 子程序) 的目的是初始化一套基于 DirectX 的图形渲染管线,并利用 DirectComposition API 将渲染结果(特别是使用 Direct2D 绘制的内容)合成并显示在传入的目标窗口 (hwnd /GameWindow ) 上。它展示了如何在易语言中调用 DirectX API 来实现窗口内容的现代合成技术。
使用的关键技术/API:
- Win32 API: 用于获取窗口客户区尺寸 (
GetClientRect )。
- Direct3D 11 (
d3d11.dll ): 创建底层图形设备 (D3D11CreateDevice )。
- DXGI (
dxgi.dll ): 获取 IDXGIDevice 接口 (IUnknow_QueryInterface ),创建 IDXGIFactory2 (CreateDXGIFactory2 ),并使用 DXGI_SWAP_CHAIN_DESC1 创建一个用于组合的交换链 (IDXGIFactory2_CreateSwapChainForComposition )。
- Direct2D (
d2d1.dll ): 创建 ID2D1Factory2 (D2D1CreateFactory )、ID2D1Device1 (ID2D1Factory2_CreateDevice )、ID2D1DeviceContext (ID2D1Device1_CreateDeviceContext ),并将渲染目标设置为 DXGI 交换链的后台缓冲区 (IDXGISwapChain1_GetBuffer , ID2D1DeviceContext_CreateBitmapFromDxgiSurface , ID2D1DeviceContext_SetTarget ),用于 2D 图形绘制。
- DirectWrite (
dwrite.dll ): 创建 IDWriteFactory (DWriteCreateFactory ) 和 IDWriteTextFormat (IDWriteFactory_CreateTextFormat ),用于后续可能的文本渲染。
- DirectComposition (
dcomp.dll ): 创建 IDCompositionDevice (DCompositionCreateDevice ),为目标窗口 GameWindow 创建组合目标 (IDCompositionDevice_CreateTargetForHwnd ),创建视觉对象 (IDCompositionDevice_CreateVisual ),将交换链内容设置到视觉对象上 (IDCompositionVisual_SetContent ),构建视觉树 (IDCompositionTarget_SetRoot ),并提交 (IDCompositionDevice_Commit , IDCompositionDevice_WaitForCommitCompletion )。
- COM (Component Object Model):
- 通过
IUnknow_QueryInterface , IUnknow_AddRef , IUnknow_Release 等子程序进行手动的 COM 接口查询和引用计数管理。
- 使用
动态调用 (易语言特性) 基于虚函数表 (VTBL) 索引来调用 COM 接口方法。
- 使用
GuidFromString (内部调用 CLSIDFromString ) 从字符串创建 GUID 字节集。
- 易语言特性:
字节集 用于存储 GUID。
传址 用于传递输出参数的地址。
动态调用 用于 COM 方法调用。
#常量 定义。
- 自定义错误检查 (
FAILED ) 和清理 (CleanupGraphics ) 逻辑。
代码执行流程概述:
- 保存窗口句柄: 将传入的
hwnd 保存到 GameWindow 。
- 初始化 D3D11 和 DXGI: 创建 D3D11 设备 (
d3d_device ) 并获取对应的 IDXGIDevice (dxgi_device )。
- 创建 DXGI 工厂: 创建
IDXGIFactory2 (dxgi_factory )。
- 创建组合交换链:
- 获取
GameWindow 的客户区尺寸。
- 配置
DXGI_SWAP_CHAIN_DESC1 结构体 (description ),使用窗口尺寸、特定格式、翻转效果等。
- 调用
IDXGIFactory2_CreateSwapChainForComposition 创建与窗口无关的交换链 (dxgi_chain )。
- 初始化 D2D 和 DWrite:
- 创建 D2D 工厂 (
d2d_factory )。
- 创建 D2D 设备 (
d2d_device1 )。
- 如果尚未创建,则创建 DWrite 工厂 (
m_pDWriteFactory )。
- 创建 D2D 设备上下文 (
d2d_context )。
- 如果尚未创建且 DWrite 工厂有效,则创建 DWrite 文本格式 (
m_pDWriteTextFormat )。
- 设置 D2D 渲染环境:
- 获取交换链的后台缓冲区表面 (
dxgi_surface )。
- 根据表面创建 D2D 位图 (
d2d_bitmap )。
- 将此位图设置为
d2d_context 的渲染目标。
- 创建 D2D 纯色画刷 (
d2d_brush )。
- 设置 DirectComposition (首次运行时,由
isinit 控制):
- 创建
IDCompositionDevice (composition_device )。
- 为传入的
GameWindow 创建组合目标 (composition_target )。
- 创建
IDCompositionVisual (composition_visual )。
- 将
dxgi_chain (交换链) 的内容设置为 composition_visual 的内容。
- 将
composition_visual 设置为 composition_target 的根视觉对象。
- 提交 DirectComposition 的更改并等待完成 (
Commit , WaitForCommitCompletion )。
- 设置
isinit 为真。
- 返回结果: 如果所有步骤成功,返回
#S_OK 。如果在任何步骤失败,则调用 CleanupGraphics 释放已分配的资源并返回错误代码 (HRESULT )。
关键点:
- 这段易语言代码演示了如何手动调用 DirectX COM 接口,包括获取接口、调用方法(通过
动态调用 和 VTBL 索引)以及手动管理引用计数。
- 最终的渲染结果通过 DirectComposition 合成到传入的
GameWindow 上,实现了在目标窗口上叠加 D2D 渲染内容的效果。
- 代码包含了比较完整的错误检查和资源清理逻辑 (
CleanupGraphics 子程序,虽然其实现未在此片段中显示)。
- 使用了易语言的
字节集 来处理 GUID,并通过辅助函数 GuidFromString 进行转换。
- 注意: 代码中
description.Flags 设置为 1024 (对应 DXGI_SWAP_CHAIN_FLAG_COMPOSITION_SURFACE_HANDLE ),这个标志在现代 CreateSwapChainForComposition 调用中通常已弃用,建议设为 0。
将以上内容复制粘贴到论坛编辑器即可。
|