基於Duilib的win32程式實現最小化到托盤

吳尼瑪發表於2017-12-19

最近在學習使用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);
		}
	}
複製程式碼

相關文章