【问题标题】:Fill custom area with color用颜色填充自定义区域
【发布时间】:2011-11-27 17:36:34
【问题描述】:

如何用颜色填充选定区域?

var Rect: TRect;
    Color: TColor;
begin
  //fill area with color
end;

【问题讨论】:

    标签: delphi colors delphi-7 paint fill


    【解决方案1】:

    您还没有说明 自定义区域 的含义,而您谈论的是“选定区域”。我不明白你的意思。

    对于一个简单的矩形,您通常会用TCanvas.FillRect 填充矩形。

    Canvas.Brush.Style := bsSolid;
    Canvas.Brush.Color := Color;
    Canvas.FillRect(R);
    

    其中R 是指定矩形的TRect

    对于更复杂的区域,您需要使用 Windows GDI 函数FillRgn。这个函数没有被TCanvas 包裹,但你可以简单地调用它,将TCanvas.Handle 作为HDC 传递。

    【讨论】:

    • 再补充一点,对于非矩形区域我建议ExtFloodFill函数
    • @Magicmaster 我没有想到这一点。不过这是一个很好的建议。洪水填充与 FillRect/FillRgn 有点不同,但在这里可能是合适的。
    【解决方案2】:

    您需要更加具体,但这应该会让您朝着正确的方向前进:

    procedure DoMyDrawing(Canvas: TCanvas; L, T, R, B: Integer; Color: TColor);
    var
      Rec: TRect;
    begin
      Rec.Left:= L;
      Rec.Top:= T;
      Rec.Right:= R;
      Rec.Bottom:= B;
      //SAME AS Rec:= Rect(L, T, R, B);
      Canvas.Brush.Color:= Color;
      Canvas.Brush.Style:= bsSolid;
      Canvas.Pen.Style:= psClear;
      Canvas.FillRect(Rec);
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      DoMyDrawing(Self.Canvas, 10, 10, 50, 50, clNavy);
    end;
    

    编辑:

    我更建议使用 TRect 而不是 4 个坐标(左、上、右和下),因为 TRect 已经包含所有 4 个坐标。您还可以读取带有 TopLeft TPoint 和 BottomRight TPoint 的 TRect。

    (我还修正了上面的错字 - Canvas.FillRect(R); 应该是 Canvas.FillRect(Rec);

    这是同一过程的另一个版本:

    procedure DoMyDrawing(Canvas: TCanvas; const R: TRect; const Color: TColor);
    begin
      Canvas.Brush.Color:= Color;
      Canvas.Brush.Style:= bsSolid;
      Canvas.Pen.Style:= psClear;
      Canvas.FillRect(R);
    end;
    

    容易多了,不是吗?


    另一个编辑:

    还要注意我正在使用的函数Rect(Left, Top, Right, Bottom) - 这也让事情变得简单。不幸的是,我见过一些标准的 VCL 控件,它们的事件带有名为 Rect: TRect; 的参数,这破坏了在 classes 单元中使用原始函数的能力。因此,还要避免使用名称为 Rect 的变量,因为它会阻止您使用 Rect 函数(它将 4 行代码变成只有 1 行代码)。

    【讨论】:

    • 我还建议不要使用 4 个数字(左、上、右、下),而是使用 TRect,因为这四个数字已经组合在一起了。
    • 您可以编辑它,而不是评论您自己的答案。这是一个维基。事实上,任何人都可以编辑你的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-10-13
    • 2021-10-25
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多