【发布时间】:2012-06-08 08:33:42
【问题描述】:
我尝试为 TLinkLabel 应用 VCLStyle。
遗憾的是,我无法显示下划线(A Tag 的句子)
TLinkLabel.Caption := 'Sma<a>pl</a>e';
我该如何解决这个问题?
为了解决这个问题,但是一个标签可能没有出现这个“样本”
procedure TgLinkLabelHook.Paint(Canvas: TCanvas);
var
LDetails: TThemedElementDetails;
ParseStr: String;
DrawRect: TRect;
DC: HDC;
TextSize: TSize;
SaveFont: HFont;
ThemeTextColor: TColor;
begin
ParseStr := ParseLinks;
LDetails := StyleServices.GetElementDetails(tbPushButtonPressed);
DC := GetDC(0);
try
SaveFont := SelectObject(DC, TLinkLabel(Control).Font.Handle);
try
GetTextExtentPoint32(DC, PWideChar(ParseStr), Length(ParseStr), TextSize);
finally
SelectObject(DC, SaveFont);
end;
finally
ReleaseDC(0, DC);
end;
Canvas.Font := TLinkLabel(Control).Font;
Canvas.Font.Style := Canvas.Font.Style + [fsUnderline];
Canvas.Font.Size := TLinkLabel(Control).Font.Size;
if StyleServices.GetElementColor(LDetails, ecBodyTextColor, ThemeTextColor) then
Canvas.Font.Color := ThemeTextColor;
// DrawRect := Rect(0, 0, TextSize.cx, TextSize.cy);
DrawRect := Control.ClientRect;
DrawControlText(Canvas, LDetails, ParseStr, DrawRect, DT_VCENTER or DT_CENTER);
end;
procedure TForm8.FormCreate(Sender: TObject);
begin
TStyleManager.Engine.RegisterStyleHook(TLinkLabel, TgLinkLabelHook);
end;
【问题讨论】:
-
使用默认文本字体是因为您调用了
DrawControlText,它使用控件的默认字体进行渲染。这就是覆盖画布字体设置的原因。另一件事是,您不能将链接颜色更改为系统颜色(如 COLOR_HIGHLIGHT)或标签的默认字体颜色以外的其他颜色,因此您的尝试似乎没有用,如果我做对了,您想使用自定义链接颜色。参见例如here。 -
您可以调用
StyleServices.DrawText而不是DrawControlText,但事实上TLinkLabel(SysLink控件)的链接是由系统使用系统颜色呈现的,如果您愿意喜欢自己渲染它们,您将不得不再次解析文本并自己渲染每个部分,这使得TLinkLabel的使用无用。 -
@TLama,你是对的,为什么不发表你的评论作为答案?
-
@RRUZ,我做了,但后来删除了,因为这只是问题的一部分。 OP似乎想要覆盖链接颜色,没有自己的标题解析和渲染是不可能的,是什么使
TLinkLabel无用,在这种情况下使用普通的TLabel可能会更好。TLinkLabel的钩子绘制覆盖在这里没有意义,因为您将失去链接着色。 -
@TLama,好的,现在你有我的 +1。
标签: delphi delphi-xe2 vcl-styles