2008-09-25 61 views
2

我试图用Delphi创建一个从TLabel继承的组件,并在TLabel.Paint中添加了一些自定义图形。我想要的图形是文本的左侧,所以我推翻GetClientRect:添加图形到TLabel的问题

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

这个方案有我想解决的重大问题:它是不可能的点击控件的“图形区域” ,只有标签区域。如果标题为空字符串,则无法通过单击来选择设计器中的组件。有任何想法吗?

回答

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; 
0

你从TLabel得到什么方法/功能,你需要这个组件?

您是否可以更好地制作(比如TImage)的后代并将其绘制为绘制方法的一部分?

如果它确实是一个TLabel后裔(包括所有这一切),那么我认为你会被这个设计时问题困住,因为当标题为空时TLabel不会有这个问题吗?

我会对其他答案感兴趣! :-)

+0

基本上我只是在想“我需要带图形的标签”,并且由于文本绘图已经存在,因此仅添加图形部分是我对这个问题的首选。 – Harriv 2008-09-25 21:29:04

+0

这很有道理。 (看到你对@ neftali的建议的评论) - 很高兴现在有了解决方案! – robsoft 2008-09-26 05:27:32