最近在学习使用Duilib,这个库实现PC程序的界面确实很方便。Duilib中的demo程序全是点击关闭按钮程序就关闭了,因此这里我实现了一个点击关闭按钮后程序最小化到托盘的效果。以及常规的,鼠标左键点击托盘里的程序图标后程序正常显示。右键点击后出现退出菜单,点击退出按钮后程序正常退出。
下面是关键部分源码:学习
#include <ShellAPI.h> #define WM_SHOWTASK WM_USER+101 #define WM_ONCLOSE WM_USER+102
memset(&m_nid,0,sizeof(NOTIFYICONDATA)); m_nid.cbSize = sizeof(NOTIFYICONDATA); m_nid.hIcon = ::LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_SMALL)); m_nid.hWnd = m_hWnd; lstrcpy(m_nid.szTip, _T("Duilib程序")); m_nid.uCallbackMessage = WM_SHOWTASK; m_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; Shell_NotifyIcon(NIM_ADD, &m_nid); ShowWindow(SW_HIDE);
//若是在图标中单击左键则还原 if( lParam == WM_LBUTTONDOWN ) { Shell_NotifyIcon(NIM_DELETE, &m_nid);//删除托盘图标 ShowWindow(SW_SHOWNORMAL);//显示主窗口 } //若是在图标中单击右键则弹出声明式菜单 if( lParam == WM_RBUTTONDOWN ) { //获取鼠标坐标 POINT pt; GetCursorPos(&pt); SetForegroundWindow(m_hWnd); //右击后点别地能够清除“右击出来的菜单” HMENU hMenu; //托盘菜单 win32程序使用的是HMENU,若是是MFC程序可使用CMenu hMenu = CreatePopupMenu();//生成托盘菜单 AppendMenu(hMenu, MF_STRING, WM_ONCLOSE, _T("退出")); int cmd = TrackPopupMenu(hMenu, TPM_RETURNCMD, pt.x, pt.y, NULL, m_hWnd, NULL); if(cmd == WM_ONCLOSE) { //退出程序 m_nid.hIcon = NULL; Shell_NotifyIcon(NIM_DELETE, &m_nid); ::PostQuitMessage(0); } }