博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Duilib程序添加托盘图标显示
阅读量:4325 次
发布时间:2019-06-06

本文共 2241 字,大约阅读时间需要 7 分钟。

转载:

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

功能描述

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

功能实现

使用托盘图标需要引入头文件  #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程序可以使用CMenu30         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

你可能感兴趣的文章
Lambda 表达式
查看>>
Ural1297 最长回文子串(后缀数组+RMQ)
查看>>
十九、CSS如何引入字体
查看>>
DS博客作业07--查找
查看>>
c# Invalidate() Update() Refresh()的区别
查看>>
work of 1/5/2016
查看>>
自己做了个微信小程序
查看>>
CMD获取当前目录的绝对路径
查看>>
HTML5新规范和CSS3新特性
查看>>
使用php后台给自己做一个页面路由,配合ajax实现局部刷新。
查看>>
类与对象(二)
查看>>
NSString 的常用方法
查看>>
mysql的engine不同,导致事物回滚失败的问题
查看>>
JAVAWeb使用POI做导出Excel
查看>>
今天解决了首页无头像被显示的问题
查看>>
charts 画折线图
查看>>
[py]__name__ 属于哪个文件
查看>>
技术分析淘宝的超卖宝贝
查看>>
i++和++1
查看>>
react.js
查看>>