我试图为TLinkLabel应用VCLStyle.
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,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;
解决方法
如何根据您使用的画布字体设置呈现标签文本:
使用TCustomStyleServices.DrawText
功能:
StyleServices.DrawText(Canvas.Handle,DT_VCENTER or DT_CENTER,Canvas.Font.Color);
而不是TStyleManager.DrawControlText
.此功能使用默认的控制字体设置,因此它只是忽略您已完成的设置.在第一行,它从指定的控件获取字体,将画布字体设置为默认控件的字体:
Canvas.Font := TWinControlClass(Control).Font;
关于你的意图:
请注意,标签链接不能使用自定义颜色,因为它们由系统呈现.只有两种解决方法可以改变它们,要么你可以设置用于链接字体渲染的系统颜色,要么解析并完全由你自己渲染标签标题,这使得TLinkLabel的使用无用.