gpt4 book ai didi

delphi - 动态 TRect 绘制

转载 作者:行者123 更新时间:2023-12-03 18:36:08 25 4
gpt4 key购买 nike

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

我有一个 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

该矩形可以独立于 img 调整大小。

谢谢指教。

最佳答案

如果我正确理解您的问题,您实际上希望在视觉上构图图像而不在原始图形本身上绘制框架,即 rectImg.Picture不应返回带框的图形。立即想到两种方法:

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

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.StylebsClear不创建填充矩形:
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属性(property)给 bsClear就像我们在编码解决方案中所做的那样。在这种情况下,设置形状的 Enabled属性(property)给 False如果您有任何OnClickOnMouseXXX分配给图像的处理程序。
  • 关于delphi - 动态 TRect 绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28024734/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com