2012-06-08 10 views
6

Intenté aplicar VCLStyle para TLinkLabel.Cómo aplico VCLStyle para TLinkLabel

Lamentablemente, no puedo mostrar subrayado (sentece de una etiqueta)

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

¿Cómo lo resolvió?

Para resolver este problema, sino una etiqueta no se parecía probable que esta "muestra" 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

La fuente de texto predeterminada se utiliza porque llama al 'DrawControlText' que utiliza la fuente predeterminada del control para la representación. Eso es lo que anula la configuración de la fuente de lienzo. Otra cosa es que no puede cambiar los colores del enlace a otra cosa que los colores del sistema (como COLOR_HIGHLIGHT) o el color de fuente predeterminado de la etiqueta, por lo que su intento parece ser inútil, si lo hago bien, quiere usar un enlace personalizado colores. Ver por ejemplo ['here'] (http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/bd54bd30-e21f-4dc7-a77f-88de02c63f72/). – TLama

+3

Puede llamar a 'StyleServices.DrawText' en lugar de a' DrawControlText' pero nada cambia en el hecho de que los enlaces de 'TLinkLabel' ([' SysLink'] (http://msdn.microsoft.com/en-us/library/ windows/desktop/bb760706 (v = vs.85) .aspx) control) son procesados ​​por el sistema utilizando los colores del sistema y si desea renderizarlos por su cuenta, deberá volver a analizar el texto y representar cada parte por su propia, lo que hace inútil el uso de 'TLinkLabel'. – TLama

+1

@TLama, tienes razón, ¿por qué no publicar tu comentario como respuesta? – RRUZ

Respuesta

10

cómo representar un texto de etiqueta basado en la configuración de fuente de lona que utilizó:

Utilice la función TCustomStyleServices.DrawText:

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

en lugar de TStyleManager.DrawControlText. Esta función utiliza la configuración de fuente de control predeterminada, por lo que simplemente ignora la configuración que ha realizado. En su primera línea que se necesita la fuente del control asignado, lo que establecer la fuente de la lona de la fuente del control por defecto:

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

Acerca de su intención:

Nota, que no es posible para usar colores personalizados para enlaces de etiquetas porque el sistema los representa. Solo hay dos soluciones para cambiarlas, ya sea que puede configurar los colores del sistema utilizados para la representación o análisis de la fuente del enlace y renderizar la leyenda de la etiqueta completamente por su cuenta, lo que hace que el uso de TLinkLabel sea inútil.

+1

Gracias por la respuesta. – gomsun2

Cuestiones relacionadas