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;
}

 

转载于:https://www.cnblogs.com/Toya/p/11230296.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值