【问题标题】:How to draw crosshatches on a TCanvas and specify the background color如何在 TCanvas 上绘制剖面线并指定背景颜色
【发布时间】:2011-03-08 22:34:24
【问题描述】:

我正在尝试制作“空白”背景以在其上放置图像。通过将 TImage 放置在表单上并执行以下操作来创建剖面线并不难:

image1.Canvas.brush.Style := bsDiagCross;
image1.canvas.brush.color := clWhatever;
image1.canvas.FillRect(image1.clientrect);

这行得通,我在黑色背景上的 clWhatever 中得到了一个交叉影线图案。但这就是问题所在。它总是黑色的,如果我想要黑色以外的东西,我找不到任何方法来指定背景颜色。

有人知道怎么做吗?

【问题讨论】:

    标签: delphi colors canvas drawing


    【解决方案1】:

    阴影画笔的颜色是前景颜色 - 阴影本身的颜色。

    使用阴影画笔时,背景颜色是单独设置的,据我所知,它没有作为 TCanvas 的属性公开,因此需要使用 Windows GDI API SetBkColor () 函数。

    例如要在白色背景上绘制红色阴影线,请在使用画布画笔绘制之前添加一个设置背景颜色的调用:

    image1.Canvas.brush.Style := bsDiagCross;
    image1.canvas.brush.color := clRed;
    
    SetBkColor(image1.Canvas.Handle, ColorToRGB(clWhite));
    image1.canvas.FillRect(image1.clientrect);
    

    [更新:] 注意:似乎在 Delphi 2010(可能还有一些早期版本)中,您应该在设置画笔后调用 SetBKColor()特性。在内部,当画布创建它的画笔时,它会调用 SetBKColor() 来践踏在引用 Canvas.Brush之前对 SetBKColor() 的任何显式调用>。在 Delphi 2006(测试原始帖子时使用)和 Delphi 2010 之间,创建内部画布画笔或内部使用 SetBkColor() 的时间似乎发生了变化。不管是什么原因在使用之前立即调用 SetBKColor 显然更可靠。

    【讨论】:

    • 刚刚在Windows 7下的D2010上测试过这个,还是不行。我仍然得到黑色背景。
    • 这很有趣。如果你做一次它不起作用,但第二次它会起作用。
    • 在 Delphi 2010 上,您似乎必须在使用画笔之前立即设置背景颜色。似乎修改画笔会影响 2010 年的背景颜色(之前发布的解决方案/提示是在 Delphi 2006 中完成的)。我将相应地编辑代码。
    • Delphi 2005在选择刷入DC后调用SetBkColor(not Brush.Color)SetBkMode(Transparent)。更改画笔的属性会使它和 DC 手柄无效。在画笔无效的情况下,FillRect 调用会重新创建画笔并调用 SetBkColor。您可以通过阅读Canvas.Handle 属性在FillRect 之前触发它。完成此操作后,您可以对 DC 进行任何手动更改,例如自己致电 SetBkColor。 Deltics,除非 Delphi 2006 引入了稍后修复的回归,否则我怀疑您的原始测试只是偶然的。
    • 是的,可能是“幸运”。有趣的是,我的运气与 D2010 和 D2006 不一样。不管是什么原因,在调用需要它的 Canvas 之前尽可能晚地调用 SetBKColor() 是最好的方法 - 可能避免使用 Canvas 方法并直接调用 GDI 更为可取(或使用公开 GDI 的 GDI Canvas 包装器更忠实地,如果存在的话,我敢肯定它必须在某个地方......)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2020-04-21
    • 2010-12-26
    • 1970-01-01
    • 2014-01-11
    相关资源
    最近更新 更多