官术网_书友最值得收藏!

  • C#開發(fā)案例精粹
  • 明日科技編著
  • 2152字
  • 2024-04-22 11:37:06

bt2-L 實例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)提示。

主站蜘蛛池模板: 平凉市| 蒙自县| 兰西县| 营口市| 贵州省| 长子县| 莒南县| 商丘市| 广东省| 巫山县| 永胜县| 南岸区| 神农架林区| 普安县| 文昌市| 湖南省| 海阳市| 施秉县| 苏州市| 图们市| 巴林右旗| 多伦县| 彭山县| 綦江县| 顺平县| 万山特区| 郧西县| 三河市| 新兴县| 钟祥市| 肃南| 宣城市| 吴旗县| 枣阳市| 米脂县| 郑州市| 曲靖市| 特克斯县| 蚌埠市| 南漳县| 开江县|