• Duilib程序添加托盘图标显示


    转载:https://www.zhaokeli.com/article/8266.html

    温馨提示:技术类文章有它的时效性,请留意文章更新时间以及软件的版本

    功能描述

    实现点击关闭后,程序最小化到托盘中并显示图标,单击图标销毁图标并且显示窗口,右键弹出菜单退出,点击退出关闭程序

    功能实现

    使用托盘图标需要引入头文件  #include <ShellAPI.h>

    先在窗口类中头文件中定义下面代码

    1 //定义托盘图标对象
    2 NOTIFYICONDATA m_trayIcon;
    3 //添加托盘图标(初始化)
    4 void AddTrayIcon();
    5 //处理托盘图标上的事件
    6 LRESULT OnTrayIcon(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

    然后打开cpp文件定义实现

     1 void MainWnd::AddTrayIcon() {
     2     memset(&m_trayIcon, 0, sizeof(NOTIFYICONDATA));
     3     m_trayIcon.cbSize = sizeof(NOTIFYICONDATA);
     4     m_trayIcon.hIcon = ::LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1));
     5     m_trayIcon.hWnd = m_hWnd;
     6     lstrcpy(m_trayIcon.szTip, _T("Msg"));
     7     m_trayIcon.uCallbackMessage = WM_SHOWTASK;
     8     m_trayIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
     9     Shell_NotifyIcon(NIM_ADD, &m_trayIcon);
    10     ShowWindow(SW_HIDE);
    11 }
    12 LRESULT MainWnd::OnTrayIcon(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled)
    13 {
    14     //如果在图标中单击左键则还原
    15     if (lParam == WM_LBUTTONDOWN)
    16     {
    17         //删除托盘图标
    18         Shell_NotifyIcon(NIM_DELETE, &m_trayIcon);    //博主认为此处应注释掉
    19         //显示主窗口
    20         ShowWindow(SW_SHOWNORMAL);
    21     }
    22     //如果在图标中单击右键则弹出声明式菜单
    23     if (lParam == WM_RBUTTONDOWN)
    24     {
    25         //获取鼠标坐标
    26         POINT pt; GetCursorPos(&pt);
    27         //右击后点别地可以清除“右击出来的菜单”
    28         SetForegroundWindow(m_hWnd);
    29         //托盘菜单    win32程序使用的是HMENU,如果是MFC程序可以使用CMenu
    30         HMENU hMenu;
    31         //生成托盘菜单
    32         hMenu = CreatePopupMenu();
    33         //添加菜单,关键在于设置的一个标识符  WM_ONCLOSE 点击后会用到
    34         AppendMenu(hMenu, MF_STRING, WM_ONCLOSE, _T("Exit"));
    35         //弹出菜单,并把用户所选菜单项的标识符返回
    36         int cmd = TrackPopupMenu(hMenu, TPM_RETURNCMD, pt.x, pt.y, NULL, m_hWnd, NULL);
    37         //如果标识符是WM_ONCLOSE则关闭
    38         if (cmd == WM_ONCLOSE)
    39         {
    40             m_trayIcon.hIcon = NULL;
    41             Shell_NotifyIcon(NIM_DELETE, &m_trayIcon);
    42             //退出程序
    43             ::PostQuitMessage(0);
    44         }
    45     }
    46     bHandled = true;
    47     return 0;
    48 }

    里面写的很清楚啦需要你自己设置一个图标导入资源里面就可以啦
    如图:

    在Notify函数中应将

    if(msg.spender == m_pCloseBtn)
    {
        PostQuitMessage(0);
        return;
    }

    替换为

    if(msg.spender == m_pCloseBtn)
    {
        ::ShowWindow(m_hWnd,SW_HIDE);
        return;
    }
  • 相关阅读:
    JavaOOP对象和封装
    使用socket实现文件复制
    多线程模拟银行取款
    初入多线程示例展示--Runner
    初步学习多线程3
    初步学习多线程2
    初步线程学习1
    守护线程_setDaemon()
    多线程_yield()和sleep()方法比较
    java_多线程_优先级
  • 原文地址:https://www.cnblogs.com/Toya/p/11230296.html
Copyright © 2020-2023  润新知