【问题标题】:How do i apply to VCLStyle for TLinkLabel我如何为 TLinkLabel 申请 VCLStyle
【发布时间】: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,但事实上TLinkLabelSysLink 控件)的链接是由系统使用系统颜色呈现的,如果您愿意喜欢自己渲染它们,您将不得不再次解析文本并自己渲染每个部分,这使得 TLinkLabel 的使用无用。
  • @TLama,你是对的,为什么不发表你的评论作为答案?
  • @RRUZ,我做了,但后来删除了,因为这只是问题的一部分。 OP似乎想要覆盖链接颜色,没有自己的标题解析和渲染是不可能的,是什么使TLinkLabel无用,在这种情况下使用普通的TLabel可能会更好。 TLinkLabel 的钩子绘制覆盖在这里没有意义,因为您将失去链接着色。
  • @TLama,好的,现在你有我的 +1。

标签: delphi delphi-xe2 vcl-styles


【解决方案1】:

如何根据您使用的画布字体设置呈现标签文本:

使用TCustomStyleServices.DrawText函数:

StyleServices.DrawText(Canvas.Handle, LDetails, ParseStr, DrawRect, DT_VCENTER or DT_CENTER, Canvas.Font.Color);

而不是TStyleManager.DrawControlText。这个函数使用默认的控制字体设置,所以它只是忽略你所做的设置。在第一行,它从分配的控件中获取字体,将画布字体设置为默认控件的字体:

Canvas.Font := TWinControlClass(Control).Font;

关于您的意图:

请注意,标签链接不能使用自定义颜色,因为它们是由系统呈现的。只有两种变通方法可以更改它们,或者您可以设置用于链接字体渲染的系统颜色或完全自己解析和渲染标签标题,这使得TLinkLabel 的使用无用。

【讨论】:

    猜你喜欢
    • 2020-10-12
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多