实现将程序图标显示在系统托盘

长久以来,一直很好奇类似QQ等软件的图标是如何显示在系统托盘的,这次有个项目正好用到,所以就研究了一下。

具体方法如下:

1、首先我们需要在工具栏找到NotifyIcon这个控件,找到后将其拖到Form中。

然后,我们需要设置其Icon属性、Text属性和Visible属性。

其中:

          Icon属性是设置显示在右下角系统托盘的图标。

          Text属性是设置当鼠标移动到系统托盘图标时显示的文字,一般设置为软件的名称。

          Visible属性是设置小图标是否显示在系统托盘。注意:如果程序退出前没有将其设置为false,那么小图标将一直停留在系统栏,直到鼠标从上面经过时才会消失。

2、基本属性设置完之后,我们要将程序主窗体的ShowInTaskBar设置为True。这样小图标才可以显示在系统托盘中,一般,这个属性默认就是True。

3、设置完属性,我们就需要对NotifyIcon方法进行实现。

      我要做的实现是当点击最小化时,让程序的图标出现在“系统托盘”的位置上,而不显示在“任务栏”中。当双击系统托盘上的图标时,还原程序窗体,再次双击时最小化到系统托盘。点击程序的关闭按钮,正常退出程序。

      要实现上面的功能我们需要实现两个方法:

    一个方法是主窗体的SizeChanged事件。

        /// <summary>
        /// 最小化时到系统托盘
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MainForm_SizeChanged(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Minimized)  //判断是否最小化
            {
                this.ShowInTaskbar = false;  //不显示在系统任务栏
            }
        }

     一个是NotifyIcon的双击事件。
        /// <summary>
        /// 双击系统托盘,界面还原,再次双击,界面最小化到系统托盘
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (this.WindowState == FormWindowState.Minimized)
            {                
                this.WindowState = FormWindowState.Maximized;  //还原窗体
                this.ShowInTaskbar = true;  //显示在系统任务栏
            }
            else
            {
                this.WindowState = FormWindowState.Minimized;
            }
        }
     

4、这样,基本的功能就实现了,但是有时候我们还想要在系统托盘上右键关闭软件,那么就需要为系统托盘上的图标添加一个右键菜单。

      首先,我们需要在主窗体中拖入一个ContextMenuStrip控件,起名为ContextMenuStrip1,然后点击控件,打开其Items属性,然后添加一个MenuItem,起名为tsmiClose,并将其Text属性设置为“退出”。

     然后,我们再次选中ContextMenuStrip1,在窗体上会看到这个控件,然后在我们命名的“退出”菜单上双击,编辑退出的方法。

        /// <summary>
        /// 退出
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsmiClose_Click(object sender, EventArgs e)
        {
            this.Close();
            notifyIcon1.Visible = false;
        }

      最后,我们需要将退出菜单关联到notifyIcon1的控件上,我们需要将notifyIcon1的ContextMenu属性,设置为contextMenuStrip1。

5、至此,所有的操作都完成了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
实现程序关闭后显示系统托盘区,需要使用 Qt 的 QSystemTrayIcon 类。具体实现步骤如下: 1. 在程序初始化时创建 QSystemTrayIcon 对象,并设置图标、提示信息等属性; 2. 重写程序的 closeEvent() 函数,在程序关闭前将其隐藏,并在系统托盘显示 QSystemTrayIcon 对象; 3. 在 QSystemTrayIcon 对象的 activated() 信号中,处理双击托盘图标显示程序主窗口的事件。 示例代码如下: ```cpp #include <QSystemTrayIcon> #include <QMenu> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { // 创建系统托盘图标 trayIcon = new QSystemTrayIcon(this); trayIcon->setIcon(QIcon(":/images/icon.png")); trayIcon->setToolTip(tr("My Application")); // 创建托盘菜单 trayMenu = new QMenu(this); QAction *showAction = new QAction(tr("Show"), this); QAction *quitAction = new QAction(tr("Quit"), this); connect(showAction, &QAction::triggered, this, &MainWindow::showNormal); connect(quitAction, &QAction::triggered, qApp, &QApplication::quit); trayMenu->addAction(showAction); trayMenu->addAction(quitAction); trayIcon->setContextMenu(trayMenu); // 监听系统托盘图标的激活事件 connect(trayIcon, &QSystemTrayIcon::activated, this, &MainWindow::trayIconActivated); } protected: void closeEvent(QCloseEvent *event) override { if (trayIcon->isVisible()) { hide(); event->ignore(); } else { event->accept(); } } private slots: void trayIconActivated(QSystemTrayIcon::ActivationReason reason) { if (reason == QSystemTrayIcon::DoubleClick) { showNormal(); } } private: QSystemTrayIcon *trayIcon; QMenu *trayMenu; }; ``` 在程序退出时,需要手动删除 QSystemTrayIcon 对象,代码如下: ```cpp delete trayIcon; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dragonpeng2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值