Реализация TLabel с TabStop и FocusRect?
Я использую Delphi7 и пытаюсь внедрить LinkLabel, подобный тому, который вы можете найти в Панели управления в Windows Vista и выше.
Изменение курсора / цвета при наведении на самом деле очень просто, единственное, что мне нужно сделать, это заставить точки приема табуляции TLabel и нарисовать вокруг нее прямоугольник фокусировки.
Есть идеи, как это сделать? Я понимаю, что TLabel не получает вкладки из-за своей природы. Существует также TStaticText, который получает вкладки, но у него также нет прямоугольника фокуса.
1 ответ
Вот производная статика, которая рисует прямоугольник фокуса при фокусировке. 'TabStop' должен быть установлен, или код, который проверяет, должен быть добавлен. Выглядит не очень хорошо (на самом деле элемент управления не имеет места для линий по всем краям), но в любом случае:
type
TStaticText = class(stdctrls.TStaticText)
private
FFocused: Boolean;
protected
procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
end;
...
procedure TStaticText.WMSetFocus(var Message: TWMSetFocus);
begin
FFocused := True;
Invalidate;
inherited;
end;
procedure TStaticText.WMKillFocus(var Message: TWMKillFocus);
begin
FFocused := False;
Invalidate;
inherited;
end;
procedure TStaticText.WMPaint(var Message: TWMPaint);
var
DC: HDC;
R: TRect;
begin
inherited;
if FFocused then begin
DC := GetDC(Handle);
GetClipBox(DC, R);
DrawFocusRect(DC, R);
ReleaseDC(Handle, DC);
end;
end;