程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 裝扮工具提示條

裝扮工具提示條

編輯:Delphi

什麼是工具提示條?在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方法即可,然後在其中設置背景及字體,這樣會省事得多啦。”當然,這樣也行得通,不過你會發現有一點小小的遺憾,是什麼?自己試試吧。(什麼?沒有?!當我沒說!)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved