我如何申请VCLStyle for TLinkLabel

时间:2012-06-08 08:33:42

标签: delphi delphi-xe2 vcl-styles

我尝试将VCLStyle应用于TLinkLabel。

可悲的是,我无法显示下划线(A标签的感觉)

TLinkLabel.Caption := 'Sma<a>pl</a>e';

我如何解决这个问题?

要解决这个问题,但是这个“Sample”可能没有出现标签 enter image description here

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;

1 个答案:

答案 0 :(得分:10)

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

使用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用法毫无用处。