裝扮工具提示條 (轉)

gugu99發表於2008-03-27
裝扮工具提示條 (轉)[@more@]

 

 技巧之:namespace prefix = o ns = "urn:schemas--com::office" />

裝扮工具提示條

什麼是工具提示條?在中,當滑鼠移動到工具條相應的按鈕上時,會彈出一個小視窗來說明該按鈕的作用,這個小視窗就叫做工具提示條。一般情況下它的背景色為淡黃色,字型色為黑色。面對這樣千篇一律的面孔不知你是不是有些厭煩,是否想過給它化化妝,使其改頭換面呢?下面我們就以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); overr;

  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_WORREAK or DrawTextBiDiModeFlagsReadingOnly);

End;

原來THintWindow在它的Paint方法中又重新改變了字型顏色。沒辦法,只好重寫Paint方法了。在MyHint類中再宣告一個過載方法:Procedure Paint; Override;然後將THintWindow的Paint方法的程式碼照搬過來,再將Canvas.Font.Color := clInfoText;這一句刪除掉。至此就大功告成了,再執行一下程式看看,這下一點問題都沒有了。

也許你會說:“其實我們也不用過載THintWindow的Create方法,只需過載Paint方法即可,然後在其中設定背景及字型,這樣會省事得多啦。”當然,這樣也行得通,不過你會發現有一點小小的遺憾,是什麼?自己試試吧。(什麼?沒有?!當我沒說!)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1001553/,如需轉載,請註明出處,否則將追究法律責任。

相關文章