WinForm 之 窗口最小化到托盘及右键图标显示菜单
Form最小化是指整个Form都缩小到任务栏上,但是窗体以Form的标题栏形式显示在任务栏上, 若是想让Form以Icon的形式显示在任务栏右下角,则需要给Form添加一个NotifyIcon控件。
一、添加NotifyIcon控件
1 如下图为窗体添加一个 NotifyIcon 控件,并指定 Icon 和 Text 属性,如下图:
2 在需要窗体最小化到托盘的处理代码中,添加如下代码:
if(this.WindowState==FormWindowState.Normal&&this.Visible==true) { this.notifyIcon1.Visible=true;//在通知区显示Form的Icon this.WindowState=FormWindowState.Minimized; this.Visible=false; this.ShowInTaskbar=false;//使Form不在任务栏上显示 }
3 可以为 添加NotifyIcon控件指定双击事件,双击还原,代码如下:
/// <summary> /// 添加双击托盘图标事件(双击显示窗口) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { if (WindowState == FormWindowState.Minimized) { //还原窗体显示 WindowState = FormWindowState.Normal; //激活窗体并给予它焦点 this.Activate(); //任务栏区显示图标 this.ShowInTaskbar = true; //托盘区图标隐藏 notifyIcon1.Visible = false; } }
4 关闭窗体询问是否直接退出或者最小化到托盘
/// <summary> /// 判断是否最小化,然后显示托盘 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void F_Main_SizeChanged(object sender, EventArgs e) { //判断是否选择的是最小化按钮 if (WindowState == FormWindowState.Minimized) { //隐藏任务栏区图标 this.ShowInTaskbar = false; //图标显示在托盘区 notifyIcon1.Visible = true; } } /// <summary> /// 确认是否退出 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void F_Main_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("是否确认退出程序?", "退出", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) { // 关闭所有的线程 this.Dispose(); this.Close(); } else { e.Cancel = true; } }
二、添加 ContextMenuStrip 控件
1 在窗体添加一个 ContextMenuStrip 控件,然后添加控件菜单项,最后绑定给 NotifyIcon 控件即可,如下:
2 绑定菜单给 NotifyIcon 控件,如下图:
3 为 ContextMenuStrip 控件的菜单项指定单击事件,如下:
/// <summary> /// 托盘右键显示主界面 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 显示ToolStripMenuItem_Click(object sender, EventArgs e) { WindowState = FormWindowState.Normal; } /// <summary> /// 托盘右键退出程序 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 退出ToolStripMenuItem_Click(object sender, EventArgs e) { if (MessageBox.Show("是否确认退出程序?", "退出", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) { // 关闭所有的线程 this.Dispose(); this.Close(); } }
三、为 NotifyIcon 控件添加单击事件,控制菜单的显示及窗口的还原,代码如下:
private void myIcon_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { myMenu.Show(); } if (e.Button == MouseButtons.Left) { this.Visible = true; this.WindowState = FormWindowState.Normal; } }