Winform 为程序设置隐藏到托盘功能和将窗口置顶

零、前言废话

之前因为工作需要与便于偷懒总结,便在一个阳光明媚的下午写了一个非常简单的Winform应用作为日常记录工作内容和一键生成工作周报的工具,当时因为基本功能都完成了,便没有继续优化细节。今日又是一个风和日丽午后,左右无事,便起了想要优化一下程序的念头。

自己看着自己的程序发呆,不一会便想到了需要优化的部分——不能每次用完就退出,用的时候再打开吧?虽然程序很小用的资源不多,但是用户体验很不好的呀!于是便想到了不如把程序隐藏到系统托盘,用的时候点开用,不用的时候挂在后台瑟瑟发抖多好。综上,今天的优化目标来了。

 

一、隐藏到托盘

想要隐藏到托盘,首先就要能有个图标放在系统托盘,不然你把程序隐藏了别个怎么点开嘛...那么怎么能够让他在托盘里显示呢?我猜肯定有个控件吧。于是去工具箱里翻找了一下,凭借出色的英语水平和有道词典,终于找到了控件NotifyIcon!那就赶紧把他拖到我们的Form里吧!

然后我们良好的编程习惯驱使我们去属性里给他改个名字改改文字啥的;暂时先改Text和Icon就好啦  这俩分别是显示出的文字和显示的图标(说的跟谁不知道一样!)。然后顺便还看到了ContextMenuStrip属性和Visible属性,先偷偷记下来一会会用到。

我们有了托盘区的图标,就要让窗体最小化时只在托盘区显示而不要在任务栏中显示出来,这样才叫隐藏嘛!于是去找到Form窗体的一个事件SizeChanged,双击进去编写隐藏任务栏的方法:

        /// <summary>
        /// 当窗体最小化时隐藏任务栏的图标只显示托盘区图标
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MainForm_SizeChanged(object sender, EventArgs e)
        {
            //判断窗体是否将要最小化
            if (WindowState == FormWindowState.Minimized)
            {
                //隐藏任务栏区图标
                this.ShowInTaskbar = false;
                //图标显示在托盘区
                notifyIcon.Visible = true;
            }
        }

然后!我们切换到NotifyIcon控件事件的标签,找到鼠标双击事件(MouseDoubleClick),然后在后面自己起个方法名,我觉得他默认的notifyIcon_MouseDoubleClick就很好很直观嘛!点进去开始编写相应的功能代码~(没错,前面看到的Visible属性正是用来设置是否可见的)

        /// <summary>
        /// 托盘区图标双击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (WindowState == FormWindowState.Minimized)
            {
                //把最小化的窗体显示出来
                WindowState = FormWindowState.Normal;
                //激活窗体并赋予焦点
                this.Activate();
                //任务栏区显示图标
                this.ShowInTaskbar = true;
                //托盘区图标隐藏
                notifyIcon.Visible = true;
            }  
        }

好啦,最基本的双击托盘显示功能就OK啦,不过在我们使用一下之后便会发现,这样只能在窗体被最小化时双击显示,可是当窗体失去焦点被盖在其他应用下面时我们再点图标并不能让窗体蹦出来。于是对上面的代码进行小小的优化,得到以下代码:

        /// <summary>
        /// 托盘区图标双击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (WindowState == FormWindowState.Minimized)
            {
                //把最小化的窗体显示出来  
                WindowState = FormWindowState.Normal;
                //激活窗体并赋予焦点
                this.Activate();
                //任务栏区显示图标
                this.ShowInTaskbar = true;
                //托盘区图标隐藏
                notifyIcon.Visible = true;
            }
            else
            {               
                this.Activate();
                //将窗体前置
                this.TopMost = true;
                //解除窗体前置
                this.TopMost = false;
                //任务栏区显示图标
                this.ShowInTaskbar = true;
                //托盘区图标隐藏
                notifyIcon.Visible = true;
            }
        }

这样一来,即使我们的应用被压在五指山下都能通过双击图标把他弄出来啦。可是托盘的图标只能用来双击嘛?那用处好小哦。能不能像别的应用那样,右键的时候弹出菜单呢?当然可以!依然是去工具箱里翻找,找到ContextMenuStrip控件,这个控件专门用来设置右键菜单的。我们先把他从工具箱里拖出来,就先随便扔在我们的Form上吧!

拖出来以后,还是按照习惯给他改改基础属性(其实就改个名字)。接着就可以在上图画圈处写自己的菜单啦!就先写显示和退出好了!

写好菜单之后,我们要把菜单绑定到我们的托盘图标上去,这样才能在右键托盘的时候弹出我们想要的菜单。选中之前加入的NotifyIcon控件,查看其属性,找到我们之前特别关注到的ContextMenuStrip属性,点击后面的下拉框,选中我们刚刚改了名字的那个ContextMenuStrip控件,就绑定上啦!

现在运行一下会发现一切都如我们设想的那样进行着,托盘有图标可以显示窗体,还可以右键看到菜单,接下来就该编写菜单的功能了!

选中我们之前加入的ContextMenuStrip控件,双击我们要编写的那条菜单编译器就可以自动为我们生成空白方法!

于是便可以写下如下代码:

        private void 显示程序ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //将窗体显示出来
            WindowState = FormWindowState.Normal;
        }

        private void 完全退出ToolStripMenuItem_Click(object sender, EventArgs e)
        {
                // 关闭所有的线程
                this.Dispose();
                this.Close();
        }

这样一来就OK啦!现在的功能已经比之前强大啦!

二、窗口置顶

在上面的功能实现后,我突然觉得右键菜单只有两个选项会不会太单薄,刚好之前在双击显示窗体的时候发现了MainForm的TopMost属性有点意思,那不如干脆来做个窗口置顶吧!

说干就干,于是先在菜单里加一条“保持最前”。加完之后,我陷入了沉思......怎样在一条菜单里控制保持最前和不保持呢?突然想起别人的程序里好像菜单里可以打钩来着!那我不如也把“保持最前”设置为可勾选,这样一来不就可以了嘛!

选中我们之前加入的ContextMenuStrip控件,单击刚刚输入的“保持最前”那条,果然在属性里找到了Check三兄弟,分别是Checked、CheckOnClick、CheckState。看字面意思,Checked应该就是是否允许勾选属性了吧!把他改成True;第二个CheckOnClick看起来应该是在点击这条的时候就把他打上勾,这么方便的功能我们当然也设成True啊!第三个CheckState明显就是默认状态嘛,那必然是Unchecked呀。然后我们就会发现在CheckState改成Unchecked以后,Checked直接就变成False了......emmmmmm......原来这个Checked不是指是否允许勾选呀...查了一下发现这个Checked就是用来改变状态的  好哒,这下明白了!

这个解决了那么后面的工作就非常简单了!写就完事儿了!

        private void 保持最前ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (!this.保持最前ToolStripMenuItem.Checked)
            {
                //解除窗体前置
                this.TopMost = false;
            }
            else
            {
                //还原窗体显示    
                WindowState = FormWindowState.Normal;
                //焦点激活
                this.Activate();
                //将窗体前置
                this.TopMost = true;
            }
        }

这样一来,我们的目的就完全达到了呢,真是一次成功的优化!

(来自一名菜鸡程序猿的随手记录)

 

 

 

 

 

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页