2

我正在尝试使用 Delphi 创建一个从 TLabel 继承的组件,并在 TLabel.Paint 上添加了一些自定义图形。我希望图形位于文本的左侧,所以我覆盖了 GetClientRect:

function TMyComponent.GetClientRect: TRect;
begin
  result := inherited GetClientRect;
  result.Left := 20;
end;

该解决方案有我想解决的主要问题:无法单击控件的“图形区域”,只能单击标签区域。如果标题为空字符串,则根本无法通过单击在设计器中选择组件。有任何想法吗?

4

2 回答 2

4

首先对不起我的英语不好。
我认为更改组件的 ClientRect 不是一个好主意。此属性用于许多内部方法和过程,因此您可能会意外更改该组件的功能/操作。

我认为您可以更改写入文本的点(例如,在DoDrawText过程中为 20 个像素),并且组件可以响应图形区域中的事件。

procedure TGrlabel.DoDrawText(var Rect: TRect; Flags: Integer);
begin
  Rect.Left := 20;
  inherited;
end;

procedure TGrlabel.Paint;
begin
  inherited;

  Canvas.Brush.Color := clRed;
  Canvas.Pen.Color := clRed;
  Canvas.pen.Width := 3;
  Canvas.MoveTo(5,5);
  Canvas.LineTo(15,8);

end;
于 2008-09-25T16:16:30.120 回答
0

您从 TLabel 获得哪些需要此组件执行的方法/功能?

您是否会更好地制作(例如,TImage)的后代并将您的文本作为其绘制方法的一部分进行绘制?

如果它真的必须是一个 TLabel 后代(所有这些都需要),那么我认为你会被这个设计时问题困住,因为当标题为空时,TLabel 不会有这个问题吗?

我会对你得到的其他答案感兴趣!:-)

于 2008-09-25T15:53:58.847 回答