我正在尝试用Delphi创建一个继承自TLabel的组件,并在TLabel.Paint上添加一些自定义图形。我希望图形位于文本的左侧,因此我重写了GetClientRect:
function TMyComponent.GetClientRect: TRect;
begin
result := inherited GetClientRect;
result.Left := 20;
end;这个解决方案有一个我想解决的主要问题:不能点击控件的“图形区域”,只能点击标签区域。如果标题为空字符串,则无法在设计器中通过单击组件来选择该组件。有什么想法吗?
发布于 2008-09-25 16:16:30
第一个借口--我的英语不好。
我认为更改组件的ClientRect不是一个好主意。此属性用于许多内部方法和过程,因此您可能会意外地更改该组件的功能/操作。
我认为您可以更改点以编写文本(在DoDrawText procedure -for example中为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-25 15:53:59
您从TLabel获得了哪些需要此组件执行的方法/功能?
你会不会更好地继承(比方说,TImage)并将你的文本绘制为它的paint方法的一部分呢?
如果它真的必须是TLabel的后代(所有这些都需要),那么我认为你会被这个设计时的问题所困扰,因为当标题为空的时候,TLabel就不会有这个问题吗?
我会对你得到的其他答案感兴趣!:-)
https://stackoverflow.com/questions/134018
复制相似问题