在 Win32 API 的 Direct2D 中,LayerParameters 结构体用于定义图层(layer)的属性。该结构体通常用于在绘图时创建和管理图层。以下是 LayerParameters 结构体的定义:
typedef struct D2D1_LAYER_PARAMETERS {
  D2D1_RECT_F   contentBounds;
  ID2D1Geometry *geometricMask;
  D2D1_ANTIALIAS_MODE     maskAntialiasMode;
  D2D1_MATRIX_4X4_F       maskTransform;
  FLOAT                   opacity;
  ID2D1Brush             *opacityBrush;
  D2D1_LAYER_OPTIONS      layerOptions;
} D2D1_LAYER_PARAMETERS;

  •  contentBounds: 指定图层的内容边界,是一个 D2D1_RECT_F 结构体。

  •  geometricMask: 指定一个几何图形,用于定义图层的可见区域。

  •  maskAntialiasMode: 指定图层中几何掩码的抗锯齿模式,是一个 D2D1_ANTIALIAS_MODE 枚举。

  •  maskTransform: 指定几何掩码的变换矩阵,是一个 D2D1_MATRIX_4X4_F 结构体。

  •  opacity: 指定图层的不透明度,取值范围为 0.0(完全透明)到 1.0(完全不透明)之间。

  •  opacityBrush: 指定用于设置图层不透明度的画刷。

  •  layerOptions: 指定图层的选项,是一个 D2D1_LAYER_OPTIONS 枚举。


使用 LayerParameters 结构体,你可以在 Direct2D 中创建复杂的图层效果。以下是一个简单的示例,演示如何使用 LayerParameters 创建图层:
#include <d2d1.h>
#include <d2d1helper.h>

// 初始化 Direct2D 和相关资源
HRESULT InitializeD2D(HWND hwnd, ID2D1Factory** ppFactory, ID2D1HwndRenderTarget** ppRenderTarget)
{
    // 创建 Direct2D 工厂
    HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, ppFactory);
    if (SUCCEEDED(hr)) {
        RECT rc;
        GetClientRect(hwnd, &rc);

        // 创建 Hwnd 渲染目标属性
        D2D1_HWND_RENDER_TARGET_PROPERTIES hwndRenderTargetProperties = {
            hwnd,
            D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top),
            D2D1_PRESENT_OPTIONS_NONE
        };

        // 创建 Direct2D 渲染目标
        hr = (*ppFactory)->CreateHwndRenderTarget(
            D2D1::RenderTargetProperties(),
            hwndRenderTargetProperties,
            ppRenderTarget
        );
    }

    return hr;
}

// 绘制内容
void DrawContent(ID2D1HwndRenderTarget* pRenderTarget)
{
    // 开始绘制
    pRenderTarget->BeginDraw();

    // 清空背景色
    pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));

    // 定义图层参数
    D2D1_LAYER_PARAMETERS layerParameters = {};
    layerParameters.contentBounds = D2D1::RectF(50.0f, 50.0f, 200.0f, 200.0f);
    layerParameters.opacity = 0.5f;

    // 创建图层
    pRenderTarget->PushLayer(&layerParameters, NULL);

    // 在图层上进行绘制
    // ...

    // 结束图层
    pRenderTarget->PopLayer();

    // 结束绘制
    pRenderTarget->EndDraw();
}

// 释放资源
void Cleanup(ID2D1Factory* pFactory, ID2D1HwndRenderTarget* pRenderTarget)
{
    if (pRenderTarget != NULL) {
        pRenderTarget->Release();
    }
    if (pFactory != NULL) {
        pFactory->Release();
    }
}

// 主窗口过程
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static ID2D1Factory* pFactory = NULL;
    static ID2D1HwndRenderTarget* pRenderTarget = NULL;

    switch (message) {
    case WM_CREATE:
        if (FAILED(InitializeD2D(hwnd, &pFactory, &pRenderTarget))) {
            return -1;  // 创建失败,结束窗口
        }
        return 0;

    case WM_PAINT:
        DrawContent(pRenderTarget);
        ValidateRect(hwnd, NULL);
        return 0;

    case WM_DESTROY:
        Cleanup(pFactory, pRenderTarget);
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProc(hwnd, message, wParam, lParam);
}

// 主函数和窗口创建、消息循环等代码...

在这个示例中,PushLayer 方法用于创建一个图层,绘图操作可以在该图层上进行。PopLayer 方法用于结束图层。这样可以实现在特定区域内应用图层效果,例如透明度调整。


转载请注明出处:http://www.zyzy.cn/article/detail/25448/Win32 API/D2d1helper.h/LayerParameters