2014-05-20 12 views
3

Delphi7을 사용하고 있는데 Windows Vista 이상의 제어판에서 찾을 수있는 LinkLabel을 구현하려고합니다.TabStop과 FocusRect로 TLabel 구현하기?

호버에서 커서/색상을 변경하는 것은 간단합니다. 은 TLabel이 탭 스톱을 수신하고 그 주위에 포커스 사각형을 그리는 것입니다..

방법에 대한 아이디어가 있으십니까? 나는 TLabel이 본성 때문에 탭을받지 않는다는 것을 이해합니다. 탭을받는 TStaticText도 있지만 초점 사각형도 없습니다.

+2

아마도 소유자가 그린 버튼을 사용하는 것이 나을 것입니다. 그런 다음 모든 기능을 즉시 사용할 수 있고 "그냥"필요한 모양을 얻을 필요가 있습니다. –

답변

4

다음은 초점을 맞출 때 포커스 사각형을 그리는 파생 정적입니다. '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;