我试图在一个TLinkLabel上使用一个TPageControl,但我找不到一种方法让它利用它的父背景。
// Image removed because the website doesn't exist any more
// and I can't find it anywhere... Sorry.如您所见,父选项卡的可爱渐变没有保留在链接文本后面。
我希望在一个流动的文本块( TLinkLabel提供的功能)中具有多个链接的功能,并且在文本后面显示父链接的背景。
TLinkLabel没有ParentBackground属性。我尝试创建一个派生类,它将csParentBackground添加到控件样式中,但没有效果:
TMyLinkLabel = class (TLinkLabel)
public
constructor Create(AOwner: TComponent); override;
end;
...
constructor TMyLinkLabel.Create(AOwner: TComponent);
begin
inherited;
ControlStyle := ControlStyle - [csOpaque] + [csParentBackground]
end;有人有什么想法吗?
发布于 2009-08-29 20:53:01
Nat,您即将完成对ControlStyle of TLinkLabel的更改。此外,您还必须确保标准Windows (这就是TLinkLabel )的父控件能够正确地处理WM_CTLCOLORSTATIC消息。
VCL有一个很好的重定向机制,可以让控件自己处理作为通知发送到其父窗口的消息。利用这一点,可以创建一个完全独立的透明链接标签:
type
TTransparentLinkLabel = class(TLinkLabel)
private
procedure CNCtlColorStatic(var AMsg: TWMCtlColorStatic);
message CN_CTLCOLORSTATIC;
public
constructor Create(AOwner: TComponent); override;
end;
constructor TTransparentLinkLabel.Create(AOwner: TComponent);
begin
inherited;
ControlStyle := ControlStyle - [csOpaque] + [csParentBackground];
end;
procedure TTransparentLinkLabel.CNCtlColorStatic(var AMsg: TWMCtlColorStatic);
begin
SetBkMode(AMsg.ChildDC, TRANSPARENT);
AMsg.Result := GetStockObject(NULL_BRUSH);
end;发布于 2009-08-28 09:53:26
通常,我讨厌人们提供第三方组件作为回答,但我会提到TMS THTMLabel作为您想要做的事情的替代方案。它具有TLabel的透明属性,允许您使用HTML作为标题,因此您可以根据示例执行多个链接。
发布于 2009-08-28 14:54:31
csParentBackground和csOpaque样式都需要来自控件代码的其他部分的协作。仅仅设置它们不会有多大效果;如果是这样的话,那么控件可能已经有了一个公共Transparent属性。
您可以查看TCustomLabel.Paint,看看它如何尊重csOpaque样式。它通过在绘制背景之前读取其Transparent属性来检查该样式:
if not Transparent then
begin
Canvas.Brush.Color := Self.Color;
Canvas.Brush.Style := bsSolid;
FillRect(ClientRect);
end;csParentBackground样式对TCustomLabel没有影响,因为该样式只影响窗口控件;TCustomLabel是从TGraphicControl下降的,而不是TWinControl。
我没有TLinkLabel,所以我不能看它的源代码来找出它需要改变什么。如果它是TGraphicControl后代,那么它将需要包括我在上面从TCustomLabel上展示的代码。如果它是从TWinControl降下来的,那么我会修改来自TCustomStaticText的代码。这有点复杂;它调用DrawParentBackground来响应cn_CtlColorStatic通知消息。它也不使用Delphi代码来绘制自己。该控件是Win32“静态”控件类型的包装器。
TLinkLabel显然无条件地描绘了它的背景。要解决这个问题,您需要重写Paint方法。删除功能(在本例中为背景绘制)与重写虚拟方法的传统方法是很难的,因为您无法调用继承的方法来绘制所有文本。相反,您可能需要复制和粘贴基类的实现,然后在中间的某个地方添加条件部分。
https://stackoverflow.com/questions/1345316
复制相似问题