如果你希望在 CD2DGradientBrush 类中添加一个受保护的数据成员 m_pGradientStops 用于存储渐变停止集合,你可以按照以下方式修改类的定义和实现:
// CD2DGradientBrush.h

#pragma once

#include <afxwin.h>
#include <d2d1.h>
#include <vector>

class CD2DGradientBrush
{
public:
    // 公共构造函数
    CD2DGradientBrush(ID2D1RenderTarget* pRenderTarget, const D2D1_POINT_2F& startPoint, const D2D1_POINT_2F& endPoint);

    // 析构函数
    ~CD2DGradientBrush();

    // 受保护方法
protected:
    // 销毁渐变刷资源
    void Destroy();

    // 其他成员函数和数据成员可以在这里添加
    // ...

    // 受保护的渐变停止集合
    std::vector<D2D1_GRADIENT_STOP> m_arGradientStops;

    // 受保护的颜色插值伽马值
    D2D1_GAMMA m_colorInterpolationGamma;

    // 受保护的扩展模式
    D2D1_EXTEND_MODE m_extendMode;

    // 受保护的渐变停止集合指针
    CComPtr<ID2D1GradientStopCollection> m_pGradientStops;

private:
    // 用于存储 Direct2D 渐变刷的私有成员
    CComPtr<ID2D1GradientBrush> m_pGradientBrush;
};


在上述示例中,m_pGradientStops 是一个 CComPtr<ID2D1GradientStopCollection> 类型的成员变量,用于存储渐变停止集合的指针。你可以在构造函数中初始化它,并在创建渐变刷时使用这个指针。

修改 CD2DGradientBrush 类的实现,确保在构造函数中初始化 m_pGradientStops 并在 Destroy 方法中释放相关资源:
// CD2DGradientBrush.cpp

#include "stdafx.h"
#include "CD2DGradientBrush.h"

CD2DGradientBrush::CD2DGradientBrush(ID2D1RenderTarget* pRenderTarget, const D2D1_POINT_2F& startPoint, const D2D1_POINT_2F& endPoint)
{
    // 初始化渐变停止集合
    D2D1_GRADIENT_STOP gradientStops[] = {
        // ... 添加渐变停止的具体信息 ...
    };

    m_arGradientStops.assign(std::begin(gradientStops), std::end(gradientStops));

    // 初始化颜色插值伽马值
    m_colorInterpolationGamma = D2D1_GAMMA_2_2; // 例如,设置为默认值 D2D1_GAMMA_2_2

    // 初始化扩展模式
    m_extendMode = D2D1_EXTEND_MODE_CLAMP; // 例如,设置为默认值 D2D1_EXTEND_MODE_CLAMP

    // 创建渐变停止集合
    pRenderTarget->CreateGradientStopCollection(
        m_arGradientStops.data(),
        m_arGradientStops.size(),
        &m_pGradientStops
    );

    // 创建线性渐变刷
    pRenderTarget->CreateLinearGradientBrush(
        D2D1::LinearGradientBrushProperties(startPoint, endPoint),
        m_pGradientStops,
        &m_pGradientBrush
    );
}

CD2DGradientBrush::~CD2DGradientBrush()
{
    // 在析构函数中释放渐变刷资源
    Destroy();
    // 可以添加其他需要在对象销毁时释放的资源清理代码
}

void CD2DGradientBrush::Destroy()
{
    // 在销毁函数中释放渐变刷资源
    m_pGradientBrush.Release();

    // 释放渐变停止集合指针
    m_pGradientStops.Release();
    
    // 清理渐变停止集合
    m_arGradientStops.clear();

    // 可以添加其他需要在销毁时释放的资源清理代码
}

这样,你就可以在 CD2DGradientBrush 对象中使用 m_pGradientStops 来存储和管理渐变停止集合,确保在销毁对象时释放相关资源。


转载请注明出处:http://www.zyzy.cn/article/detail/16267/MFC/CD2DGradientBrush