Delphi中使用提示是如此簡單,只需將欲使用Hint的控件作如下設置:
ShowHint := True;
Hint := ‘提示信息’;
不必寫一行代碼,相當方便。
但有時我們又想自己定制提示的效果,使其看起來更美觀更具個人特色,沒關系,Delphi完全有辦法讓你寫出自己喜歡的Hint效果。
Delphi的Hint功能實現歸類在Application類中,所以我們可以在Application類中看到數個關於Hint的屬性,這些屬性可以設置Hint窗口的顏色,停留時間,出現時間等,設置了這些屬性,將對整個工程的Hint功能起到影響。這樣做的好處當然是統一了Hint的風格,並且讓其他類不必去理會Hint的實現。
我們可以建一個簡單的工程,並放一個按鈕,將按鈕的ShowHint設為True,再對Hint設一個值。運行程序,當光標指到按鈕上時,便會出現一個提示窗口。
但如果我們在主窗口的創建事件中寫下:
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.ShowHint := False;
end;
這些再運行程序,就不再有提示出現了,由此可知Application的ShowHint控制整個工程的Hint是否顯示。
如果你對於平常所見的Hint窗口的顏色感到厭煩,那麼可以設Application的HintColor為其他顏色。但此時有一個問題,如果HintColor設為黑色,則提示字體也為黑色,就看不到提示信息了。為此,我們得了解另一個全局對象,事實上當程序運行時,會創建三個全局對象:Application,Screen,Mouse,三個對象的職責非常明顯。Screen封閉了運行的工程在屏幕上的狀態,它有一個HintFont的屬性,允許你設置提示信息的字體。
我們可以寫如下的代碼:
procedure TForm1.Button1Click(Sender: TObject);
begin
Application.HintColor := clBlack;
Screen.HintFont.Color := clWindow;
Screen.HintFont.Size := 14;
end;
運行程序看看效果,提示字體變為白色,且變大了。
另外Application有這三個屬性:
HintHidePause,HintPause,HintShortPause,控制著提示窗顯示的時間等。HintHidePause指定提示窗口在屏幕上顯示的時間,以毫秒為單位。HintPause則指定當你將光標移到有提示的控件上時,經過多長時間才會出現提示窗口,以毫秒為單位。而HintShortPause呢表示當你快速移動光標經過一組有Hint的控件時,顯示Hint的間隔。比如有兩個有Hint的控鈕,當你的光標快速從Btn1移到Btn2時,Hint經過HintShortPause毫秒才會顯示出來。
Application中有一個比較特殊的屬性Hint,我們不禁要奇怪,Hint指定的是那個控件的提示呢。其實Hint屬性的一個很大的用途是給那些沒有辦法直接出現Hint窗口的控件一個機會,使它們能夠通過別的方式出現提示。比如菜單,我們沒有辦法使菜單出現Hint窗口,但我們可以使菜單的Hint出現在狀態欄上的。
我們在上面的工程主窗口中加一個狀態欄,並在加一個菜單控件,設置幾個菜單項,並給每個菜單薦的Hint屬性設置一些字符串。
然後寫下:
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnHint := WhenHint;
end;
procedure TForm1.WhenHint(sender: TObject);
begin
StatusBar1.SimpleText := Application.Hint;
end;
運行程序,當你指到菜單項時,看,狀態欄上出現了提示了。
上面可以看到,通過一些簡單的代碼,就可以使得提示別具特色。但人們是永遠不會滿足的,他們總想能不能做更好看的Hint呢,甚至對Hint的窗口風格提出了要求。Delphi的工程師們早想到了這一點,他們通過類的繼承設定了一個提示窗口的父類,即我們看到的那個Hint窗口,我們可以通過繼承它並覆蓋它所提供的虛擬方法來寫自己的提示窗口。
去讀一讀HintWindow的源碼吧,你只要覆蓋幾個虛擬方法,你就可以做出很漂亮的提示出來了。
Delphi的Hint雖然簡單易用,但卻不夠靈活,因為它提供了統一的風格,所以你不能指定某個提示為錯誤指示,可某個提示為警告提示。關於這個,我們要用API來實現,在網上找一個漫畫式提示,有很多文章可用。這裡不再說述。
下面將給出一個定制Hint窗口的例子。這個自定義Hint窗口的效果不錯,以玻璃為邊框,並且有陰影的效果。
不過這之前,我們必須介紹一個如何定制,Hint的父類為THintWindow,在Controls單元中定義。我們看看幾個虛擬方法,CreateParams設定窗口的風格,我們要覆蓋掉它,使其沒有邊框。NCPaint畫窗口的邊框,我們也要覆蓋它,因為我們不需要邊框嗎。Paint比較重要,為畫Hint窗口客戶區內容,當然要覆蓋。不過最重要的當屬ActivateHint,它會設定好窗口的大小,並顯示它,我們就在這裡定制一個類玻璃的窗口效果。下面給出該類的實現:
unit wdHintWnd;
interface
uses
Windows, Classes, Controls, Graphics, Forms, SysUtils, ExtCtrls;
type
TwdHintWnd = class(THintWindow)
private
FWndBmp: TBitmap; //窗口位圖
FHintBmp: TBitmap; //提示信息位圖
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure Paint; override;
procedure NCPaint(DC: HDC); override;
{畫提示的圖象}
procedure DrawHintImg(Bmp:TBitmap; AHint: string);
{取得提示窗口對應的桌面區域的圖象}
procedure GetDesktopImg(Bmp: TBitmap; R: TRect);
{對桌面區域圖象作處理,使其看起來像一塊玻璃且帶有一點陰影}
procedure EffectHandle(WndBmp
[1] [2] [3] 下一頁