zoukankan      html  css  js  c++  java
  • 转 点击关闭时最小化到任务栏

    来源: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快捷关闭时,取消关闭操作且窗体隐藏,任务栏图标仍然显示:

    //窗体关闭前发生事件
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        //窗体关闭原因为单击"关闭"按钮或Alt+F4
        if (e.CloseReason == CloseReason.UserClosing)
        {
            e.Cancel = true;           //取消关闭操作 表现为不关闭窗体
            this.Hide();               //隐藏窗体
        }
    }

    其中: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(鼠标单击组件时发生)事件.添加代码如下:

    //鼠标左键图标事件
    private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
    {
        //点击鼠标"左键"发生
        if (e.Button == MouseButtons.Left)
        {
            this.Visible = true;                        //窗体可见
            this.WindowState = FormWindowState.Normal;  //窗体默认大小
            this.notifyIcon1.Visible = true;            //设置图标可见
        }
    }

    四.完整代码

    源代码如下:

     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 }
  • 相关阅读:
    hive 三种启动方式及用途
    Nodejs根据字符串调用对象方法
    Hive原理与不足
    [置顶] 面向领域概念:流的思考
    curl的使用
    mysql知识点总结
    中文字符串反转
    《c陷阱与缺陷》之贪心法
    静态数据成员和静态成员函数
    常成员函数 int fun() const;
  • 原文地址:https://www.cnblogs.com/mrethan/p/4574175.html
Copyright © 2011-2022 走看看