我正在尝试简单的事情。但是我不能:(

我有一个TImage,它的名称是Overview。
我想在概述上绘制一个矩形,但与概述无关。因此,我在概览的前面添加了TImage并绘制了一个矩形。矩形的作品,但我只能看到TImage或概述。我试图给rectImg透明,但是rectImg完全消失了。

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


我画颜料,我想做的。


可以根据img调整该rect的大小。

感谢您的建议。

最佳答案

如果我正确理解了您的问题,则您实际上想在不对原始图形本身绘制框架的情况下以视觉方式对图像进行构图,即rectImg.Picture不应返回带有框架的图形。立即想到两种方法:

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

b)扩展TImage具有OnPaint事件,该事件在TImage完成其标准绘制后引发。

关于(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属性设置为bsClear。在这种情况下,如果已将任何EnabledFalse处理程序分配给图像,请将形状的OnClick属性设置为OnMouseXXX

关于delphi - 动态轨迹绘制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28024734/

10-09 06:45