來源:http://www.2cto.com/kf/201401/274489.html
現在很多軟件如360殺毒軟件、酷狗音樂都擁有最小化至任務欄並在系統托盤區留下圖標,我的項目同樣需要該功能.所以本文主要敘述如何使用C#讓窗體最小化至任務欄,同時在系統托盤區的圖標點擊左鍵能顯示窗體,右鍵能關聯控件顯示3個常用功能.主要涉及到的控件是NotifyIcon和ContextMenuStrip,此類文章較多,希望作者以自己的獨特視角給予大家幫助.
一.界面操作
1.創建"Windows窗體應用程序"項目,從"工具箱"中添加NotifyIcon(運行時期間在Windows任務欄右側的通知區域顯示圖標).鼠標右擊notifyIcon1屬性,為控件屬性Icon添加圖標,Text屬性為"CSDN".
2.添加ContextMenuStrip(當用戶右擊關聯控件時顯示快鍵菜單).鼠標右鍵contextMenuStrip1屬性,進入Items添加或右鍵"編輯項".添加3個toolStripMenuItem,設置其Text為"顯示窗體"、"隱藏窗體"、"退出".如下圖所示:
3.關聯系統托盤圖標與右鍵菜單.設置notifyIcon1的ContextMenuStrip屬性為contextMenuStrip1關聯兩個控件.運行程序,右下角任務欄的系統托盤處圖標點擊右鍵顯示如下圖所示:
二.窗體設置
窗體設置主要是當窗體點擊"退出"按鈕時,任務欄仍然顯示圖標且程序沒有退出.設置Form1的MaximizeBox(窗體是否能最大化)屬性設置為False,讓其不能最大化.並為Form1添加FormClosing(當用戶關閉窗體時,在窗體已關閉並制定關閉原因前發生)事件.如下圖所示.
添加代碼如下,主要實現的功能是當用戶點擊窗體"關閉"按鈕或通過Alt+F4快捷關閉時,取消關閉操作且窗體隱藏,任務欄圖標仍然顯示:
其中:FormClosingEventArgs 類為FormClosing事件提供數據,其屬性Cancel獲取或設置是否應取消事件的值,CloseReason獲取一個值,該值指示關閉窗體的原因.(詳見MSDN FormClosingEventArgs 類)
注意:添加的事件是Form_Closing-窗體關閉前發生,而不是Form_Closed窗體已關閉發生.它沒有e.Cancel屬性,會提示錯誤 "System.Windows.Forms.FormClosedEventArgs"不包含Cancel的定義.
三.系統托盤功能
常見的窗體最小化至任務欄(系統托盤)圖標的功能:
1.當鼠標左鍵點擊圖標時,顯示窗體.
2.當鼠標右鍵點擊圖標時,顯示"顯示窗體"\"隱藏窗體"\"退出"菜單欄,並有相對應的功能.
具體操作是:分別點擊"顯示窗體"\"隱藏窗體"\"退出"在其屬性欄中添加"Click"事件.添加代碼如下:
//"顯示窗體"單擊事件 private void toolStripMenuItem1_Click(object sender, EventArgs e) { this.Show(); //窗體顯示 this.WindowState = FormWindowState.Normal; //窗體狀態默認大小 this.Activate(); //激活窗體給予焦點 } //"隱藏窗體"單擊事件 private void toolStripMenuItem2_Click(object sender, EventArgs e) { this.Hide(); //隱藏窗體 } //"退出"單擊事件 private void toolStripMenuItem3_Click(object sender, EventArgs e) { //點擊"是(YES)"退出程序 if (MessageBox.Show("確定要退出程序?", "安全提示", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.Yes) { notifyIcon1.Visible = false; //設置圖標不可見 this.Close(); //關閉窗體 this.Dispose(); //釋放資源 Application.Exit(); //關閉應用程序窗體 } }
其中,窗體的狀態FormWindowState有Minimized(最小化)、Maximized(最大化)、Normal(默認大小).有的程序設置sizechanged事件,當用戶點擊"最小化"按鈕窗體尺寸變化時才最小化至任務欄(系統托盤).但我認為打開程序時就有最小化圖標更好,同時添加FormClosing事件更符合用戶使用.點擊"退出"運行結果如下圖所示:
最后添加鼠標左鍵圖標顯示窗體功能.右鍵notifyIcon1屬性,添加MouseClick(鼠標單擊組件時發生)事件.添加代碼如下:
四.完整代碼
源代碼如下:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 11 namespace WinFormMin 12 { 13 public partial class Form1 : Form 14 { 15 public Form1() 16 { 17 InitializeComponent(); 18 } 19 20 //窗體關閉前發生事件 21 private void Form1_FormClosing(object sender, FormClosingEventArgs e) 22 { 23 //窗體關閉原因為單擊"關閉"按鈕或Alt+F4 24 if (e.CloseReason == CloseReason.UserClosing) 25 { 26 e.Cancel = true; //取消關閉操作 表現為不關閉窗體 27 this.Hide(); //隱藏窗體 28 } 29 } 30 31 //"顯示窗體"單擊事件 32 private void toolStripMenuItem1_Click(object sender, EventArgs e) 33 { 34 this.Show(); //窗體顯示 35 this.WindowState = FormWindowState.Normal; //窗體狀態默認大小 36 this.Activate(); //激活窗體給予焦點 37 } 38 39 //"隱藏窗體"單擊事件 40 private void toolStripMenuItem2_Click(object sender, EventArgs e) 41 { 42 this.Hide(); //隱藏窗體 43 } 44 45 //"退出"單擊事件 46 private void toolStripMenuItem3_Click(object sender, EventArgs e) 47 { 48 //點擊"是(YES)"退出程序 49 if (MessageBox.Show("確定要退出程序?", "安全提示", 50 System.Windows.Forms.MessageBoxButtons.YesNo, 51 System.Windows.Forms.MessageBoxIcon.Warning) 52 == System.Windows.Forms.DialogResult.Yes) 53 { 54 notifyIcon1.Visible = false; //設置圖標不可見 55 this.Close(); //關閉窗體 56 this.Dispose(); //釋放資源 57 Application.Exit(); //關閉應用程序窗體 58 } 59 } 60 61 //鼠標左鍵圖標事件 62 private void notifyIcon1_MouseClick(object sender, MouseEventArgs e) 63 { 64 //點擊鼠標"左鍵"發生 65 if (e.Button == MouseButtons.Left) 66 { 67 this.Visible = true; //窗體可見 68 this.WindowState = FormWindowState.Normal; //窗體默認大小 69 this.notifyIcon1.Visible = true; //設置圖標可見 70 } 71 } 72 } 73 }