2012-06-08 6 views
6

Я попытался применить VCLStyle для TLinkLabel.Как мне применить к VCLStyle для TLinkLabel

К сожалению, я не могу показать подчеркнуть (sentece тега)

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

Как решить это?

Чтобы решить эту проблему, но тег не появился, вероятно, этот «образец» 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

Шрифт текста по умолчанию используется, потому что вы вызываете 'DrawControlText', который использует стандартный шрифт элемента управления для рендеринга. Вот что переопределяет ваши настройки шрифта холста. Другое дело, что вы не можете изменить цвета ссылок на что-то еще, кроме системных цветов (например, COLOR_HIGHLIGHT) или цвета шрифта по умолчанию на этикетке, поэтому ваша попытка кажется бесполезной, если я получу право, вы хотите использовать пользовательскую ссылку цвета. См. Например ['here'] (http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/bd54bd30-e21f-4dc7-a77f-88de02c63f72/). – TLama

+3

Вы можете вызвать 'StyleServices.DrawText' вместо' DrawControlText', но ничего не меняется по факту ссылок из 'TLinkLabel' ([' SysLink'] (http://msdn.microsoft.com/en-us/library/ windows/desktop/bb760706 (v = vs.85) .aspx) отображаются системой с использованием системных цветов, и если вы хотите сделать их самостоятельно, вам придется снова разобрать текст и отобразить каждую часть собственный, что делает использование «TLinkLabel» бесполезным. – TLama

+1

@TLama, вы правы, почему бы не опубликовать свой комментарий в качестве ответа? – RRUZ

ответ

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 бесполезным.

+1

Спасибо за ответ. – gomsun2