MFC為應用程序添加托盤(右鍵托盤,彈出菜單)
源代碼:http://download.csdn.net/detail/nuptboyzhb/4137784
1. 導入一個托盤圖標的資源(.ico)格式;資源ID為IDI_ICON1
2. 在框架程序的初始化函數中,初始化一個托盤圖標的一個結構體
NOTIFYICONDATA notifyicondata;//NOTIFYICONDATA結構
notifyicondata.cbSize = sizeof(NOTIFYICONDATA);//為notifyicondata結構體分配空間
//為notifyicondata結構體各個參數賦值
notifyicondata.hWnd = m_hWnd;//窗口的句柄
notifyicondata.uID = IDI_NOTIFYICON; //ID標識
notifyicondata.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
notifyicondata.uCallbackMessage = WM_ADDTRAYICON;//回調消息的標識;我們要為回調消息的標識添加用戶消息映射
notifyicondata.hIcon=AfxGetApp()->LoadIcon(IDI_ICON1);//加載托盤圖標
wcscpy(notifyicondata.szTip, _T("為程序創建托盤圖標"));
Shell_NotifyIcon(NIM_ADD, ¬ifyicondata); //裝載托盤圖標
注意:在該步驟中有幾個注意的變量:
a. m_hWnd是整個應用程序窗口的句柄
b. IDI_NOTIFYICON是我們自己定義的一個常量;即在頭文件上添加如下代碼:
#define IDI_NOTIFYICON 100 //托盤圖標標識
c. WM_ADDTRAYICON是我們自定義消息的標識,也是一個常量;
#define WM_ADDTRAYICON WM_USER+101//自定義消息
3. 添加用戶消息映射和消息處理函數
1. 添加成員函數:
afx_msg LRESULT OnAddTrayIcon(WPARAM wParam,LPARAM lParam);
2. 添加消息映射
ON_MESSAGE(WM_ADDTRAYICON, OnAddTrayIcon)//添加消息映射
注意:第一個參數是用戶自定義消息的標識;第二個參數是消息響應處理函數
3. 實現消息響應處理函數OnAddTrayIcon
LRESULT 類名::OnAddTrayIcon(WPARAM wParam,LPARAM lParam)
{
if (wParam == IDI_NOTIFYICON)//為創建的托盤圖標
{
switch(lParam)//消息的類型
{
case WM_LBUTTONDBLCLK://雙擊左鍵
//實習窗口的隱藏或顯示
//AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);//隱藏窗口
break;
case WM_RBUTTONDBLCLK://雙擊右鍵
{
AfxGetApp()->m_pMainWnd->DestroyWindow();//關閉窗口
break;
}
case WM_RBUTTONDOWN://右擊托盤,顯示菜單
{
CMenu menu,*pSubMenu; //后面要用的CMenu對象
CPoint point;
.LoadMenu(IDR_POPUP_MENU); //裝載自定義的右鍵菜單
pSubMenu = menu.GetSubMenu(0); //獲取第一個彈出菜單
GetCursorPos(&point); //獲取當前光標位置 pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
break;
}
}
}
return 1;
}
4. 卸載托盤。
當應用程序退出時,卸載
NOTIFYICONDATA notifyicondata;
notifyicondata.cbSize = sizeof(NOTIFYICONDATA);
notifyicondata.uFlags = 0;
notifyicondata.hWnd = m_hWnd;
notifyicondata.uID = IDI_NOTIFYICON;
Shell_NotifyIcon(NIM_DELETE, ¬ifyicondata);//卸載托盤圖標
NOTIFYICONDATA結構體的uCallbackMessage變量,使得用戶消息響應與托盤的點擊等消息關聯在一起;托盤的標識IDI_NOTIFYICON,恰好是用戶消息響應用來判斷是否是托盤傳遞的消息的依據;
在基于多文檔或單文檔的應用程序,當用戶點擊最小化按鈕時,我們可以講界面隱藏;
具體是,添加OnSize()消息
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
if(nType == SIZE_MINIMIZED)
{
ShowWindow(SW_HIDE); // 當最小化時,隱藏主窗口
}
// TODO: 在此處添加消息處理程序代碼
}
對話框的最小化托盤于此很類似,可以參考:http://justtotry.blog.163.com/blog/static/446308122011622101427208/
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成