如何创建线性渐变画笔

要创建线性渐变画笔,请使用 CreateLinearGradientBrush 方法并指定线性渐变画笔属性和渐变停止点集合。 某些重载使你能够指定画笔属性。 以下代码演示如何创建线性渐变画笔来填充正方形,以及如何创建纯黑色画笔来绘制正方形的轮廓。

该代码产生如下图所示的输出。

用线性渐变画笔填充方形的图示

  1. 声明类型为 ID2D1LinearGradientBrush 的变量。

        ID2D1LinearGradientBrush *m_pLinearGradientBrush;
    
  2. 使用 ID2D1RenderTarget::CreateGradientStopCollection 方法创建含有声明的 D2D1_GRADIENT_STOP 结构数组的 ID2D1GradientStopCollection 集合,如以下代码中所示。

    注意

    从 Windows 8 开始,可以改用 ID2D1DeviceContext::CreateGradientStopCollection 方法创建 ID2D1GradientStopCollection1 集合。 此接口添加了高颜色渐变以及直接或预乘颜色的渐变插值。 有关详细信息,请参阅 ID2DDeviceContext::CreateGradientStopCollection 页面。

     

    // Create an array of gradient stops to put in the gradient stop
    // collection that will be used in the gradient brush.
    ID2D1GradientStopCollection *pGradientStops = NULL;
    
    D2D1_GRADIENT_STOP gradientStops[2];
    gradientStops[0].color = D2D1::ColorF(D2D1::ColorF::Yellow, 1);
    gradientStops[0].position = 0.0f;
    gradientStops[1].color = D2D1::ColorF(D2D1::ColorF::ForestGreen, 1);
    gradientStops[1].position = 1.0f;
    // Create the ID2D1GradientStopCollection from a previously
    // declared array of D2D1_GRADIENT_STOP structs.
    hr = m_pRenderTarget->CreateGradientStopCollection(
        gradientStops,
        2,
        D2D1_GAMMA_2_2,
        D2D1_EXTEND_MODE_CLAMP,
        &pGradientStops
        );
    
  3. 使用 ID2D1RenderTarget::CreateLinearGradientBrush 创建线性渐变画笔,用该画笔填充正方形,然后用黑色画笔绘制正方形。

    // The line that determines the direction of the gradient starts at
    // the upper-left corner of the square and ends at the lower-right corner.
    
    if (SUCCEEDED(hr))
    {
        hr = m_pRenderTarget->CreateLinearGradientBrush(
            D2D1::LinearGradientBrushProperties(
                D2D1::Point2F(0, 0),
                D2D1::Point2F(150, 150)),
            pGradientStops,
            &m_pLinearGradientBrush
            );
    }
    
    m_pRenderTarget->FillRectangle(&rcBrushRect, m_pLinearGradientBrush);
    m_pRenderTarget->DrawRectangle(&rcBrushRect, m_pBlackBrush, 1, NULL);
    

Direct2D 参考