我正在尝试简单的事情。但是我不能:(
我有一个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
事件作为标准。如果从字面上看只是一个所需的框架,则无编码的替代方法是将
TImage
与TShape
重叠,就像在编码解决方案中一样,将形状的Brush.Style
属性设置为bsClear
。在这种情况下,如果已将任何Enabled
或False
处理程序分配给图像,请将形状的OnClick
属性设置为OnMouseXXX
。关于delphi - 动态轨迹绘制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28024734/