如果您建立的應用程式是執行在windows 98或更高版本作業系統上,您可以通過呼叫api函式flashwindowex並賦給它乙個flashwinfo結構體來實現. 而如果是執行在windows 95上則比較麻煩, 但您也可以通過使用乙個timer元件來實現想要的效果。
flashwindowex
當您呼叫api函式flashwindowex時,乙個tflashwinfo被用來控制windows實現該閃爍功能的資訊. 幸運的是,delphi已經為您封裝了該結構體。delphi中它被申明如下:
typetflashwinfo =recordcbsize : longint;您所需做的全部事情僅僅是填充和組裝該記錄型別,並呼叫api函式。本例中,我把兩者放在了乙個按鈕的onclick事件中,當然您也可以放置它們到任何合適的地方:hwnd : longint;
dwflags : longint;
ucount : longint;
dwtimeout : longint;end;
proceduretform1.button1click(sender: tobject);varfwinfo: tflashwinfo;beginfwinfo.cbsize := 20;dwflags指示了閃爍的方式,下面是dwflags屬性的取值定義:fwinfo.dwflags := flashw_all;
fwinfo.ucount := 10; // 閃爍的次數
fwinfo.dwtimeout := 0; // 速度以毫秒為單位, 0 預設為與指標閃爍的速率相同
flashwindowex(fwinfo); // 使它閃爍!end;
flashw_stop = 0 // 停止閃爍以上只有在windows 98或更高版本作業系統上才有效,如果您要在windows 95上實現,您就需要採取另一不同的途徑:flashw_caption = 1 // 閃爍視窗標題
flashw_tray = 2 // 閃爍工作列按鈕
flashw_all = 3 // 閃爍視窗標題與工作列按鈕
flashw_timer = 4 // 不停地閃爍,直到flashw_stop標誌設定
flashw_timernofg = 5 // 不停地閃爍直到視窗被前置
flashwindow
windows 95下 (並且delphi 3及更底版本幷包含適用的api封裝) 需要不同的途徑. 該作業系統下沒有flashwindowex這個api函式,您需要使用flashwindow來代替. (flashwindow還能在更低版本的作業系統中被呼叫。)
但問題是flashwindow只能閃爍一次,所以要達到閃爍按鈕的目的就需要用到乙個timer元件。 當然,這樣一來也就加大了寶貴的系統資源開銷 - 但它能完成我們想要的效果。
proceduretform1.timer1timer(sender: tobject);beginend;
proceduretform1.button1click(sender: tobject);begintimer1.enabled := not timer1.enabled;end;到此為止,兩種不同方法實現了相同的功能。
本示例貼出還沒幾分鐘,西蒙·克萊頓(simon clayton)就提出了乙個閃爍方法的建議——僅當應用程式不是當前活動的乙個時。 西蒙改寫如下:
我是這樣做的:
proceduretform1.timer1timer(sender: tobject);beginif(getforegroundwindow()<>form1.handle)thenbeginfwinfo.cbsize := 20;我也在form的onpaint事件中加入了一些停止閃爍的**:fwinfo.dwflags := flashw_all;
fwinfo.ucount := 5;
fwinfo.dwtimeout := 0;
flashing := true;
flashwindowex(fwinfo);endelseif(flashing)thenbeginfwinfo.cbsize := 20;
fwinfo.dwflags := flashw_stop;
fwinfo.ucount := 0;
fwinfo.dwtimeout := 0;
flashwindowex(fwinfo);
flashing := false;end;end;
proceduretform1.formpaint(sender: tobject);beginif(flashing)thenbeginfwinfo.cbsize := 20;我現在要解決的唯一乙個問題是,如果我正我第二台顯示器使用乙個應用程式,而窗體卻在我第乙個顯示器的頂層,那麼當我切換回應用程式時,onpaint事件好像沒能被呼叫 。也就是說閃爍一直在進行 - 我注意到這應該是ms實時訊息的乙個問題。fwinfo.dwflags := flashw_stop;
fwinfo.ucount := 0;
fwinfo.dwtimeout := 0;
flashwindowex(fwinfo);end;end;
幹得好,西蒙 - 非常好的技巧!
無邊窗體在工作列上的系統選單
我們可能會用到乙個沒有邊框的窗體,因為這樣我們可以在整個窗體上自由的繪製。然後我們也會發現乙個討厭的問題,這個時候在工作列上滑鼠右鍵點不出那可愛的系統選單了。這樣會不好,會使得使用者感覺到沒有道理,為什麼別的視窗都有系統選單,而只有我們的窗體沒有系統選單呢?其實如果我們使用vc建立mfc程式的時候,...
隱藏在工作列中的程式 VB
public declare function getwindowlong lib user32 alias getwindowlonga byval hwnd as long,byval nindex as long as long public declare function setwindo...
C WinForm程式不不在工作列顯示的處理方法
窗體不在工作列上顯示程式的窗體,c form提供了乙個 屬性值可以很好的解決這個問題 這個屬性就是 showintaskbar 在微軟的官方宣告格式為 public bool showintaskbar 及可以通過這個屬性來獲取或設定乙個值 這個屬性值的預設值是true 就是要在工作列上顯示窗體,如...