什麼是工具提示條?在Windows程序中,當鼠標移動到工具條相應的按鈕上時,會彈出一個小窗口來說明該按鈕的作用,這個小窗口就叫做工具提示條。一般情況下它的背景色為淡黃色,字體色為黑色。面對這樣千篇一律的面孔不知你是不是有些厭煩,是否想過給它化化妝,使其改頭換面呢?下面我們就以Delphi為工具,對它動些小手術。
在Delphi中,我們可以設置控件的Hint和ShowHint屬性來顯示工具提示條。當然,這並不是我們所希望的效果。幸好Delphi在Application對象中給我們提供了HintColor屬性,用它可以設置工具提示條的背景顏色。在程序主窗體的創建事件中寫入Application.HintColor:=clRed,然後運行一下,怎麼樣?效果不錯吧,背景變成紅色了。接下來的問題是,我們如何來改變顯示文字的顏色。(嗯,讓我好好想想)
Delphi中有一個THintWindow類,看名字就知道它是干什麼的了。不錯,Delphi就是通過它來實現工具提示條的。在它的創建方法(Create)中只有四條語句:
Constructor THintWindow.Create(AOwner: TComponent);
Begin
Inherited Create (AOwner);
Color := $80FFFF;
Canvas.Font := Screen.HintFont;
Canvas.Brush.Style := bsClear;
End;
它首先重載了父類的創建方法,然後設置了背景顏色、字體和畫刷樣式。從這裡可以設想一下,如果我們創建一個THintWindow的派生類,並重載它的創建方法,然後在此方法中重新定義字體,不就實現了我們所希望的效果嗎?那就讓我們行動起來吧。
首先新建一應用程序,在Form1窗體上添加一個用於測試的按鈕Button1,設置ShowHint屬性為True,Hint屬性為“這是一個按鈕”,然後在代碼頁的Implementation部分前面聲明MyHint類:
Type
MyHint=class (THintWindow)
Constructor Create (AOwner: TComponent); override;
End;
該類只有一個方法,用override關鍵字來表示重載了父類(THintWindow)的創建方法。接著在Implementation部分寫入此方法的代碼:
Constructor MyHint.Create(AOwner: TComponent);
Begin
inherited Create(AOwner); //重載父類方法
with Canvas do begin //設置字體
Font.Name := '楷體_GB2312';
Font.Color :=clYellow;
Font.Size :=20;
Brush.Style := bsClear;
End;
End;
在此過程中我們重新定義了字體的名稱、顏色及大小,現在就可以使用這個新類了。那麼如何使用呢?這裡還要說明一點:在Delphi中有一個隱含的變量HintWindowClass,它的作用就是指定在程序運行時顯示的工具提示條所使用的類,其聲明如下:
var HintWindowClass: THintWindowClass = THintWindow;
在程序中我們可以動態改變此變量,如在主窗體的創建事件中寫入:HintWindowClass:=MyHint;這樣就可以讓它使用我們新創建的類了。好了,現在來運行一下程序,看看效果如何?工具提示條的字體變成了楷體,尺寸也變大了,顏色……,怎麼顏色沒有改變呢?新的問題出現了,還是再看看THintWindow的代碼吧。
問題就出在THintWindow的Paint方法上,其代碼如下:
Procedure THintWindow.Paint;
var
R: TRect;
Begin
R := ClIEntRect;
Inc (R.Left, 2);
Inc (R.Top, 2);
Canvas.Font.Color := clInfoText; //請注意這一句
DrawText(Canvas.Handle, PChar(Caption), -1, R, DT_LEFT or DT_NOPREFIX or DT_WordBREAK or DrawTextBiDiModeFlagsReadingOnly);
End;
原來THintWindow在它的Paint方法中又重新改變了字體顏色。沒辦法,只好重寫Paint方法了。在MyHint類中再聲明一個重載方法:Procedure Paint; Override;然後將THintWindow的Paint方法的代碼照搬過來,再將Canvas.Font.Color := clInfoText;這一句刪除掉。至此就大功告成了,再運行一下程序看看,這下一點問題都沒有了。
也許你會說:“其實我們也不用重載THintWindow的Create方法,只需重載Paint方法即可,然後在其中設置背景及字體,這樣會省事得多啦。”當然,這樣也行得通,不過你會發現有一點小小的遺憾,是什麼?自己試試吧。(什麼?沒有?!當我沒說!)