【问题标题】:how to draw a Direct2D transparent line in C++Builder如何在 C++Builder 中绘制 Direct2D 透明线
【发布时间】:2015-07-13 22:48:29
【问题描述】:

我在 VCL windows 平台上使用 C++Builder XE4,并且我使用包装器 TDirect2DCanvas 来访问 Direct2D 函数。我正在将 GDI+ 代码移植到 Direct2D,但我一直坚持如何在 Direct2D 中绘制透明线。当我说透明时,我正在考虑使用某种类型的 alpha 混合或透明设置来设置线条,以便可以看到线条下方的图像。下面的代码创建一个 Direct2D 渐变画笔并在 Direct2D 渲染目标上绘制一条线,但没有透明度。您能否展示如何设置画笔和/或钢笔以使线条透明。谢谢

// begin drawing
Canvas2D_->BeginDraw();
try
{
TColor clrs[] = {clRed, clLime};
// create a gradient brush
DelphiInterface<ID2D1Brush> pBrush =
Canvas->CreateBrush(clrs, 1,
D2D1::Point2F(-w/2, -h/2),
D2D1::Point2F(w/2, h/2));
Canvas->Brush->Handle = pBrush;

Canvas->Pen->Width = 10;
int x=25;
Canvas->MoveTo(x, -half_h);
Canvas->LineTo(x, half_h);

}
__finally
{
// end drawing (actual screen update)
Canvas2D_->EndDraw();
} 

【问题讨论】:

    标签: delphi c++builder direct2d


    【解决方案1】:

    尝试在画笔上调用 ID2D1Brush::SetOpacity,其值介于 0.0 和 1.0 之间,具体取决于您希望线条的透明度:

    DelphiInterface<ID2D1Brush> pBrush = // ...
    pBrush->SetOpacity(0.5);
    

    【讨论】:

    • 设置画笔->SetOpacity(0.5) 似乎只影响填充对象,如多边形。它似乎不会影响钢笔,所以画一条宽线是不透明的。有没有办法在 Direct2D 中设置笔的不透明度?此代码运行但 Pen 不透明 Canvas->Pen->Width = 15;画布->笔->颜色= clRed; DelphiInterface pRedBrush = Canvas->CreateBrush(clRed); pRedBrush->SetOpacity(0.5);画布->画笔->手柄= pRedBrush;画布->画笔->样式= bsSolid;画布->MoveTo(x, y);画布->LineTo(x, y);
    • 抱歉,我熟悉 Direct2D,但不熟悉您使用的 TDirect2DCanvas 包装器。但是,我确实知道,如果您使用 ID2D1RenderTarget::DrawLine,在画笔上设置不透明度确实会影响线条绘制。如果包装器允许你使用底层的 ID2D1RenderTarget 对象,你可以使用它的 DrawLine 方法来获得想要的效果。
    • 这就是答案。对象 TDirect2DPen 有自己的 Brush 属性。创建画笔时,您可以将其直接分配给 TDirect2DPen.Brush.Handle=TDirect2DPen.Brush。我不知道这支笔有自己的画笔属性。使用 SetOpacity(0.5) 创建画笔后,线条是透明的。
    • Canvas-&gt;Pen-&gt;Brush-&gt;Handle-&gt;SetOpacity(0.5);
    猜你喜欢
    • 2013-09-13
    • 2017-02-15
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    相关资源
    最近更新 更多