动态TRect Draw

时间:2015-01-19 12:31:22

标签: delphi

我正在尝试简单的事情。但我无法做到。 t :(

我有一个TImage,其名称是概述。 我想绘制一个在概述上但与概览无关的矩形。所以我在概述中添加了一个TImage前端并绘制了一个矩形。矩形工作,但我只能看到TImage或概述。我尝试给rectImg透明,但rectImg完全消失。

   with rectImg.Canvas do
      begin
        Pen.Color:= clRed;
        Rectangle(0, 0, rectImg.Width, rectImg.Height);
      end;

我画了一幅画,我想做什么。 enter image description here

那个rect可以从img独立调整大小。

感谢您的建议。

1 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,您实际上希望在不在原始图形本身上绘制框架的情况下直观地构图图像,即rectImg.Picture不应返回带框的图形。立即想到两种方式:

a)转储TImage并使用TPaintBox,手动维护核心图形并通过方法调用进行任何拉伸或其他任何操作,而不是组件上的属性设置。

b)将TImage扩展为OnPaintTImage完成标准绘画后引发的事件。

关于(b),您可以将其作为插入者类或自定义组件。作为插入者类,您可以这样做:

1)在表单类的正上方重新声明TImage

type
  TPaintEvent = procedure (Sender: TObject; Canvas: TCanvas) of object;

  TImage = class(Vcl.ExtCtrls.TImage) //use class(ExtCtrls.TImage) if pre-XE2
  strict private
    FOnPaint: TPaintEvent;
  protected
    procedure Paint; override;
  published
    property OnPaint: TPaintEvent read FOnPaint write FOnPaint;
  end;

  TMyForm = class(TForm)
  //...

2)实现Paint覆盖,因为TImage稍微繁琐,重新定义了基类的Canvas属性:

type
  TGraphicControlAccess = class(TGraphicControl);

procedure TImage.Paint;
begin
  inherited;
  if Assigned(FOnPaint) then
    FOnPaint(Self, TGraphicControlAccess(Self).Canvas);
end;

3)在表单类中声明一个合适的事件处理程序:

procedure rectImgPaint(Sender: TObject; Canvas: TCanvas);

4)像这样实现处理程序 - 请注意,您需要将Brush.Style设置为bsClear以不创建填充矩形:

procedure TMyForm.rectImgPaint(Sender: TObject; Canvas: TCanvas);
begin
  Canvas.Brush.Style := bsClear;
  Canvas.Pen.Color := clRed;
  Canvas.Rectangle(0, 0, rectImg.Width, rectImg.Height);
end;

5)在表格OnCreate事件中分配事件处理程序:

procedure TMyForm.ImagePaint.FormCreate(Sender: TObject);
begin
  rectImg.OnPaint := rectImgPaint;
end;

我将插入类转换为自定义组件作为读者的练习...

<强>后记

现在我想到了另外两个想法:

  • 奇怪的是,FMX在这里实际上更好,因为TImage标准提供OnPaint事件。
  • 如果它实际上只是您想要的一个框架,则无代码替代方法是将TImageTShape重叠,将形状的Brush.Style属性设置为{{正如我们在编码解决方案中所做的那样。在这种情况下,如果您为图片分配了bsClearEnabled个处理程序,请将形状的False属性设置为OnClick