2012-06-08 2 views
6

Ich habe versucht, VCLStyle für TLinkLabel anzuwenden.Wie greife ich auf VCLStyle für TLinkLabel an?

Leider kann ich nicht anzeigen unterstreichen (sentece A Tag)

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

Wie kann ich dieses Problem lösen?

Um dieses Problem zu lösen, aber ein Tag erschienen ist nicht wahrscheinlich, um dieses "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; 
+0

Die Standardschriftart wird verwendet, weil Sie den 'DrawControlText' aufrufen, der die Standardschriftart des Steuerelements zum Rendern verwendet. Das überschreibt die Zeichensatzeinstellungen für die Zeichenfläche. Eine andere Sache ist, dass Sie die Link-Farben nicht auf etwas anderes als die Systemfarben (wie COLOR_HIGHLIGHT) oder die Standardschriftfarbe der Beschriftung ändern können, so dass Ihr Versuch nutzlos scheint, wenn ich richtig komme, wollen Sie benutzerdefinierte Verbindung verwenden Farben. Siehe zum Beispiel ['here'] (http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/bd54bd30-e21f-4dc7-a77f-88de02c63f72/). – TLama

+3

Sie können 'StyleServices.DrawText' anstelle von' DrawControlText' aufrufen, aber nichts ändert sich an der Tatsache, dass die Links von 'TLinkLabel' ([' SysLink'] (http://msdn.microsoft.com/en-us/library/) windows/desktop/bb760706 (v = vs.85) .aspx) control) werden vom System mit Systemfarben gerendert, und wenn Sie sie selbst rendern möchten, müssten Sie den Text erneut parsen und jedes Teil von Ihrem Renderer darstellen lassen eigenen, was die Verwendung von 'TLinkLabel' unbrauchbar macht. – TLama

+1

@TLama, du hast recht, warum postest du deinen Kommentar nicht als Antwort? – RRUZ

Antwort

10

Wie ein Beschriftungstext zu machen, basierend auf Leinwand Schrifteinstellungen verwendet Sie:

Verwenden Sie die TCustomStyleServices.DrawText Funktion:

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

anstelle von TStyleManager.DrawControlText. Diese Funktion verwendet die Standardeinstellungen für die Steuerungsschriftart, sodass die von Ihnen vorgenommenen Einstellungen ignoriert werden. Auf seiner ersten Zeile nimmt es die Schriftart aus der zugeordneten Steuer, was die Leinwand Schriftart auf die Standardsteuerung der Schriftart gesetzt:

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

über Ihre Absicht:

Hinweis, dass es nicht möglich ist Verwenden von benutzerdefinierten Farben für Beschriftungsverknüpfungen, da sie vom System gerendert werden. Es gibt nur zwei Problemumgehungen, um sie zu ändern, entweder Sie können die Systemfarben für das Link-Font-Rendering festlegen oder die Beschriftungsbeschriftung vollständig analysieren und selbst rendern, was die Verwendung von TLinkLabel unbrauchbar macht.

+1

Vielen Dank für die Antwort. – gomsun2

Verwandte Themen