我正在尝试简单的事情。但我无法做到。 t :(
我有一个TImage,其名称是概述。 我想绘制一个在概述上但与概览无关的矩形。所以我在概述中添加了一个TImage前端并绘制了一个矩形。矩形工作,但我只能看到TImage或概述。我尝试给rectImg透明,但rectImg完全消失。
with rectImg.Canvas do
begin
Pen.Color:= clRed;
Rectangle(0, 0, rectImg.Width, rectImg.Height);
end;
我画了一幅画,我想做什么。
那个rect可以从img独立调整大小。
感谢您的建议。
答案 0 :(得分:2)
如果我正确理解了您的问题,您实际上希望在不在原始图形本身上绘制框架的情况下直观地构图图像,即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;
我将插入类转换为自定义组件作为读者的练习...
<强>后记强>
现在我想到了另外两个想法:
TImage
标准提供OnPaint
事件。TImage
与TShape
重叠,将形状的Brush.Style
属性设置为{{正如我们在编码解决方案中所做的那样。在这种情况下,如果您为图片分配了bsClear
或Enabled
个处理程序,请将形状的False
属性设置为OnClick
。