最近在學習使用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);
複製程式碼
- 自定義HandleCustomMessage或HandleMessage處理滑鼠點選托盤圖示的響應
//如果在圖示中單擊左鍵則還原
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);
}
}
複製程式碼