2012-06-08 49 views
6

我試圖將VCLStyle應用於TLinkLabel。我如何申請VCLStyle TLinkLabel

可悲的是,我不能顯示下劃線(A標籤的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/zh-cn/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