6

TLinkLabel に VCLStyle を適用してみました。

残念ながらアンダーライン(Aタグの文)が表示できません。

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

1 に答える 1

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;

あなたの意図について:

システムによってレンダリングされるため、ラベル リンクにカスタム カラーを使用することはできないことに注意してください。それらを変更するための回避策は 2 つだけです。リンク フォントのレンダリングに使用されるシステム カラーを設定するか、ラベル キャプションを完全に解析してレンダリングするかのいずれかですTLinkLabel

于 2012-06-08T10:03:55.660 に答える