转载:
温馨提示:技术类文章有它的时效性,请留意文章更新时间以及软件的版本
功能描述
实现点击关闭后,程序最小化到托盘中并显示图标,单击图标销毁图标并且显示窗口,右键弹出菜单退出,点击退出关闭程序
功能实现
使用托盘图标需要引入头文件 #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;}