2014-05-20 43 views
3

我使用的是Delphi7,我試圖實現一個LinkLabel,就像你可以在Windows Vista及更高版本的控制面板下找到的一樣。使用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;