【问题标题】:How do you set the TDirect2DCanvas.Pen.StrokeStyle?你如何设置 TDirect2DCanvas.Pen.StrokeStyle?
【发布时间】:2021-06-03 20:01:14
【问题描述】:

我一直在尝试在 C++Builder 中修改 StrokeStyleTDirect2DCanvas.Pen

documentation 是这么说的:

确定笔画线的笔触样式。

使用 StrokeStyle 指定更复杂的线条绘制样式。 StrokeStyle 接受一个接口,该接口提供一组方法,每个方法返回一个特定的绘图选项。

文档没有给出示例。当我尝试将此属性设置为任何内容时,我收到一个编译错误,提示“无法编写没有写入说明符的属性”(看起来此属性仅设置为读取 StrokeStyle;即使文档似乎另有说明)。

我的愿望是让线条呈现圆头,而不是使用TDirect2DCanvas 时默认的平头。有谁知道如何做到这一点?

我正在使用 C++Builder 10.2 和 clang 编译器。我正在尝试使用TDirect2DCanvas 而不是常规的TCanvas,因为它可以绘制抗锯齿线。

【问题讨论】:

    标签: c++builder vcl direct2d c++builder-10.2-tokyo


    【解决方案1】:

    文档具有误导性。 TDirect2DPen::StrokeStyle 属性确实是只读的,因为它代表 current Direct2D ID2D1StrokeStyle 对象,由 TDirect2DPen 在内部创建。 TDirect2DPen 不提供任何方式来自定义任何笔画设置除了dashStyle

    影响TDirect2DPen::StrokeStyle 的唯一方法是设置TDirect2DPen::Style 属性。设置Style 将释放当前的ID2D1StrokeStyle,然后如果Style 设置为psSolidpsClearpsInsideFrame 以外的值,则TDirect2DPen将调用ID2D1Factory::CreateStrokeStyle() 来创建一个新的ID2D1StrokeStyle,并为其指定以下属性:

    • startCap = D2D1_CAP_STYLE_FLAT
    • endCap = D2D1_CAP_STYLE_FLAT
    • dashCap = D2D1_CAP_STYLE_ROUND
    • lineJoin = D2D1_LINE_JOIN_ROUND
    • miterLimit = 10
    • dashStyle = 以下之一,取决于TDirect2DPen.Style
      • D2D1_DASH_STYLE_DASH
      • D2D1_DASH_STYLE_DOT
      • D2D1_DASH_STYLE_DASH_DOT
      • D2D1_DASH_STYLE_DASH_DOT_DOT
    • dashOffset = 0
    • 破折号 = 无
    • dashesCount = 0

    此行为是硬编码的,无法更改。

    因此,如果您想对StrokeStyle 进行更多控制,则根本不能使用TDirect2DCanvas。您将不得不直接使用 Direct2D API。

    【讨论】:

    • 感谢 Remy,像往常一样,非常感谢您对 VCL 的所有知识!感谢您与社区分享。
    • 只需查看TDirect2DPen 的源代码即可了解StrokeStyle 属性是如何使用的。
    猜你喜欢
    • 2014-03-26
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 2019-09-30
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    相关资源
    最近更新 更多