Реализация 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;
Другие вопросы по тегам