- C#開發(fā)案例精粹
- 明日科技編著
- 2152字
- 2024-04-22 11:37:06
實例007 任務(wù)欄通知窗體
實例說明
在日常上網(wǎng)的過程中,有時候會發(fā)現(xiàn)任務(wù)欄的右下角有一個圖標(biāo)在閃爍,單擊后會彈出一條提示信息。本實例模擬該過程的實現(xiàn)效果。實例運行結(jié)果如圖1.8所示。

圖1.8 任務(wù)欄通知窗體
技術(shù)要點
本實例主要通過Timer組件的時間事件來實現(xiàn)窗體狀態(tài)的判斷,在顯示的過程中借助Windows提供的API函數(shù)ShowWindow。
ShowWindow函數(shù)用來顯示窗體。其語法如下:
[DllImportAttribute("user32.dll")]
private static extern Boolean ShowWindow(IntPtr hwnd,Int32 cmdShow);
參數(shù)說明如下。
◇ hwnd:將要顯示的窗體的句柄。
◇ cmdShow:將要顯示的窗體的類型。
◇ 返回值:返回true,表示窗體顯示成功;返回false,表示窗體顯示失敗。
實現(xiàn)過程
01 新建一個項目,將其命名為TaskMessageWindow,修改默認(rèn)窗體為TaskMessageWindow;添加一個Windows窗體,將其命名為MainForm。
02 在TaskMessageWindow窗體中添加2個Button控件、3個Label控件以及1個TextBox控件和RichTextBox控件,設(shè)置該窗體的StartPosition屬性為CenterScreen。在MainForm窗體中添加2個Label控件、3個Timer組件、1個PictureBox控件、1個ImageList控件和1個NotifyIcon控件,修改displayCounter組件中的Interval屬性為1000,修改iconCounter組件中的Interval屬性為400。
03 主要代碼。
在TaskMessageWindow窗體中需要定義及聲明一些變量。代碼如下:
01 public static string MainFormTitle = ""; //通知窗體的標(biāo)題內(nèi)容
02 public static string MainFormContent = "";//通知窗體的文本內(nèi)容
03 MainForm InformWindow = new MainForm(); //實例化類MainForm的一個對象
在TaskMessageWindow窗體中,當(dāng)用戶輸入完通知標(biāo)題和通知內(nèi)容后,單擊“通知”按鈕,在任務(wù)欄中會出現(xiàn)一個閃爍圖標(biāo)。代碼如下:
01 private void informButton_Click(object sender,EventArgs e)
02 {
03 MainForm.IconFlickerFlag = true; //設(shè)置圖標(biāo)閃爍標(biāo)識
04 InformWindow.IconFlicker(); //調(diào)用閃爍圖標(biāo)方法
05 }
在上面的代碼中,閃爍圖標(biāo)用到IconFlicker方法和iconCounter計時器的Tick事件。代碼如下:
01 public void IconFlicker()//自定義方法用來使托盤圖標(biāo)閃爍
02 {
03 if(MainForm.IconFlickerFlag != false) //當(dāng)托盤閃爍圖標(biāo)為真時
04 {
05 taskBarIcon.Icon = Properties.Resources._1;//托盤圖標(biāo)顯示為圖片
06 iconCounter.Enabled = true;//啟動托盤圖標(biāo)的Timer
07 //在titleInform中顯示通知標(biāo)題
08 titleInform.Text = TaskMessageWindow.MainFormTitle;
09 //在contentInform中顯示通知內(nèi)容
10 contentInform.Text = TaskMessageWindow.MainFormContent;
11 }
12 }
13 private void iconCounter_Tick(object sender,EventArgs e)
14 {
15 if(IconFlag) //當(dāng)該值為真時
16 {
17 taskBarIcon.Icon = Properties.Resources._1; //設(shè)定托盤控件的圖標(biāo)
18 IconFlag = false; //修改該值為假
19 }
20 else //當(dāng)該值為假時
21 {
22 taskBarIcon.Icon = Properties.Resources._2; //設(shè)定托盤控件的圖標(biāo)
23 IconFlag = true; //修改該值為真
24 }
25 }
當(dāng)閱讀完提示信息后,單擊“關(guān)閉”按鈕,任務(wù)欄中的閃爍圖標(biāo)消失。代碼如下:
01 private void closeInform_Click(object sender,EventArgs e)
02 {
03 InformWindow.CloseNewWindow(); //關(guān)閉新顯示的窗體
04 }
在上面的代碼中,讓閃爍圖標(biāo)消失用到CloseNewWindow方法。代碼如下:
01 public void CloseNewWindow()
02 {
03 base.Hide();//隱藏該窗體
04 iconCounter.Enabled = false;//設(shè)定計時器iconCounter不可用
05 taskBarIcon.Icon = Properties.Resources._2;//設(shè)定托盤圖標(biāo)
06 MainForm.IconFlickerFlag = false;//更改靜態(tài)變量IconFlickerFlag的值
07 }
在MainForm窗體中需要顯示通知標(biāo)題和通知內(nèi)容,因此在TaskMessageWindow窗體中需要保存通知的標(biāo)題和內(nèi)容。代碼如下:
01 private void title_TextChanged(object sender,EventArgs e)
02 {
03 MainFormTitle = title.Text; //記錄通知的標(biāo)題
04 }
05 private void content_TextChanged(object sender,EventArgs e)
06 {
07 MainFormContent = content.Text; //記錄通知的內(nèi)容
08 }
在MainForm窗體的加載過程中,應(yīng)該在它的構(gòu)造函數(shù)中定義窗體的工作區(qū)。代碼如下:
01 public MainForm()
02 {
03 InitializeComponent();
04 //開啟顯示提示窗體的計時器
05 displayCounter.Start();
06 //初始化工作區(qū)的大小
07 System.Drawing.Rectangle rect = System.Windows.Forms.Screen.GetWorkingArea
(this);//實例化一個當(dāng)前窗體的對象
08 this.Rect = new System.Drawing.Rectangle(rect.Right - this.Width - 1,rect.
Bottom - this.Height - 1,this.Width,this.Height); //創(chuàng)建工作區(qū)
09 }
在MainForm窗體中需要定義和聲明一些變量。代碼如下:
01 public static int SW_SHOWNOACTIVATE = 4;//該變量決定窗體的顯示方式
02 public static int CurrentState;//該變量標(biāo)識當(dāng)前窗體狀態(tài)
03 public static bool MainFormFlag=true ;
04 private System.Drawing.Rectangle Rect;//定義一個存儲矩形框的區(qū)域
05 private FormState InfoStyle = FormState.Hide;//定義變量為隱藏
06 public static bool MouseState; //該變量標(biāo)識當(dāng)前鼠標(biāo)指針狀態(tài)
07 bool IconFlag = true;//用來標(biāo)識圖標(biāo)閃爍
08 public static bool IconFlickerFlag;//運用本標(biāo)識避免單擊"關(guān)閉"按鈕時彈出信息框
09 protected enum FormState
10 {
11 //隱藏窗體
12 Hide = 0,
13 //顯示窗體
14 Display = 1,
15 //隱藏窗體中
16 Hiding=3,
17 //顯示窗體中
18 Displaying = 4,
19 }
20 protected FormState FormNowState
21 {
22 get { return this.InfoStyle; } //返回窗體的當(dāng)前狀態(tài)
23 set { this.InfoStyle = value; } //設(shè)定窗體當(dāng)前狀態(tài)的值
24 }
如果要使MainForm窗體處于運行狀態(tài),那么必須觸發(fā)NotifyIcon控件的MouseDoubleClick事件。代碼如下:
01 private void taskBarIcon_MouseDoubleClick(object sender,MouseEventArgs e)
02 {
03 iconCounter.Enabled = false;//停止閃爍托盤圖標(biāo)計時器
04 taskBarIcon.Icon = Properties.Resources._2;//清空托盤中原有的圖片
05 ShowNewWindow();//調(diào)用顯示窗體方法
06 }
運行MainForm窗體時,需要調(diào)用ShowNewWindow方法。代碼如下:
01 public void ShowNewWindow()
02 {
03 switch(FormNowState) //判斷當(dāng)前窗體處于哪種狀態(tài)
04 {
05 case FormState.Hide://當(dāng)提示窗體的狀態(tài)為隱藏時
06 this.FormNowState = FormState.Displaying;//設(shè)置提示窗體的狀態(tài)為顯示中
07 //顯示提示窗體,并把它放在屏幕底端
08 this.SetBounds(Rect.X,Rect.Y + Rect.Height,Rect.Width,0);
09 ShowWindow(this.Handle,4); //顯示提示窗體
10 displayCounter.Interval = 100; //設(shè)定時間事件的頻率為100ms一次
11 displayCounter.Start(); //啟動計時器displayCounter
12 break;
13 case FormState.Display: //當(dāng)提示窗體的狀態(tài)為顯示時
14 displayCounter.Stop(); //停止計時器displayCounter
15 displayCounter.Interval = 5000; //設(shè)定時間事件的頻率為5000ms一次
16 displayCounter.Start(); //啟動計時器displayCounter
17 break;
18 }
19 taskBarIcon.Icon = Properties.Resources._1;//設(shè)定托盤圖標(biāo)
20 }
MainForm窗體顯示時從桌面的右下角出現(xiàn),本過程通過displayCounter計時器的Tick事件完成。代碼如下:
01 private void displayCounter_Tick(object sender,EventArgs e)
02 {
03 switch(this.FormNowState) //判斷當(dāng)前窗體的狀態(tài)
04 {
05 case FormState.Display: //當(dāng)窗體處于顯示狀態(tài)時
06 this.displayCounter.Start(); //啟動計時器displayCounter
07 this.displayCounter.Interval = 100; //設(shè)定計時器的時間事件間隔
08 if(!MouseState) //當(dāng)鼠標(biāo)指針不在窗體上時
09 {
10 this.FormNowState = FormState.Hiding; //隱藏當(dāng)前窗體
11 }
12 this.displayCounter.Start(); //啟動計時器displayCounter
13 break;
14 case FormState.Displaying: //當(dāng)窗體處于顯示中狀態(tài)時
15 if(this.Height <= this.Rect.Height - 12) //如果窗體沒有完全顯示
16 {
17 this.SetBounds(Rect.X,this.Top - 12,Rect.Width,this.Height + 12);
//設(shè)定窗體的邊界
18 }
19 else //當(dāng)窗體完全顯示時
20 {
21 displayCounter.Stop(); //停止計時器displayCounter
22 //設(shè)定窗體的邊界
23 this.SetBounds(Rect.X,Rect.Y,Rect.Width,Rect.Height);
24 this.FormNowState = FormState.Display; //修改當(dāng)前窗體所處的狀態(tài)
25 this.displayCounter.Interval = 5000; //設(shè)定計時器的時間事件間隔
26 this.displayCounter.Start(); //啟動計時器displayCounter
27 }
28 break;
29 case FormState.Hiding: //當(dāng)窗體處于隱藏中狀態(tài)時
30 if(MouseState) //當(dāng)鼠標(biāo)指針在窗體上時
31 {
32 this.FormNowState = FormState.Displaying;//修改窗體的狀態(tài)為顯示中
33 }
34 else //當(dāng)鼠標(biāo)指針離開窗體時
35 {
36 if(this.Top <= this.Rect.Bottom - 12) //當(dāng)窗體沒有完全隱藏時
37 {
38 this.SetBounds(Rect.X,this.Top + 12,Rect.Width,this.Height - 12);
//設(shè)定窗體的邊界
39 }
40 else //當(dāng)窗體完全隱藏時
41 {
42 this.Hide(); //隱藏當(dāng)前窗體
43 this.FormNowState = FormState.Hide; //設(shè)定當(dāng)前的窗體狀態(tài)
44 }
45 }
46 break;
47 }
48 }
在MainForm窗體的隱藏與顯示的過程中需要判斷鼠標(biāo)指針是否在窗體中。代碼如下:
01 private void MainForm_MouseEnter(object sender,EventArgs e)
02 {
03 MouseState = true; //設(shè)定bool型變量MouseState的值為真
04 }
05 private void MainForm_MouseLeave(object sender,EventArgs e)
06 {
07 MouseState = false; //設(shè)定bool型變量MouseState的值為假
08 }
舉一反三
根據(jù)本實例,讀者可以實現(xiàn)以下功能。
◇ 制作任務(wù)欄彈出窗體。
◇ 實現(xiàn)類似騰訊QQ的閃爍圖標(biāo)提示。
- C和C++安全編碼(原書第2版)
- 編程珠璣(續(xù))
- Android 9 Development Cookbook(Third Edition)
- Git高手之路
- Elastic Stack應(yīng)用寶典
- C語言程序設(shè)計上機指導(dǎo)與習(xí)題解答(第2版)
- 51單片機C語言開發(fā)教程
- Microsoft 365 Certified Fundamentals MS-900 Exam Guide
- Scratch趣味編程:陪孩子像搭積木一樣學(xué)編程
- Elasticsearch Essentials
- Distributed Computing in Java 9
- 基于GPU加速的計算機視覺編程:使用OpenCV和CUDA實時處理復(fù)雜圖像數(shù)據(jù)
- Google Maps JavaScript API Cookbook
- Android熱門應(yīng)用開發(fā)詳解
- 數(shù)據(jù)庫技術(shù)及應(yīng)用教程上機指導(dǎo)與習(xí)題(第2版)