托盤圖標
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
一、NOTIFYICONDATA結構
NOTIFYICONDATA結構包含了系統用來處理托盤圖標的信息,它包括選擇的圖標、回調消息、提示消息、圖標對應的窗口等內容。其定義為:
typedef struct _NOTIFYICONDATA {
//以字節為單位的這個結構的大小
DWORD cbSize;
//接收托盤圖標通知消息的窗口句柄
HWND hWnd;
//應用程序定義的該圖標的ID號
UINT uID;
//設置該圖標的屬性
UINT uFlags;
//應用程序定義的消息ID號,此消息傳遞給hWnd
UINT uCallbackMessage;
//圖標的句柄
HICON hIcon;
//鼠標停留在圖標上顯示的提示信息
char szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;
該結構中,成員uFlags可以使下列之一或組合:
NIF_ICON 設置成員hIcon有效
NIF_MESSAGE 設置成員uCallbackMessage有效
NIF_TIP 設置成員szTip有效
二、Shell_NotifyIcon函數
全局函數Shell_NotifyIcon() 用于在托盤上增加、刪除或修改圖標。其原型為:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA pnid);
Pnid是上面的NOTIFYICONDATA結構的指針;
dwMessage是被傳遞的消息,可以是以下消息之一:
NIM_ADD 增加圖標
NIM_DELETE 刪除圖標
NIM_MODIFY 修改圖標
三、托盤圖標程序設計示例
首先我們用AppWizard創建一個基于對話框的應用程序CUserDlg。m_nid為類成員變量
void CUserDlg::ToTray()
{
m_nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
m_nid.hWnd = this->m_hWnd;
m_nid.uID = IDR_MAINFRAME;
m_nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP ;
m_nid.uCallbackMessage =UM_SHOWTASK;
//自定義的消息名稱 UM_SHOWTASK 頭函數中定義為WM_USER+1
m_nid.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(m_nid.szTip,"托盤圖標\nMzfAntiVirus的防護已經開啟");//當鼠標放在上面時,所顯示的內容
Shell_NotifyIcon(NIM_ADD,&m_nid);//在托盤區添加圖標
}
四.添加消息UM_SHOWTASK的響應函數
afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);
添加消息映射:
ON_MESSAGE(UM_SHOWTASK,onShowTask)
編寫該函數:
LRESULT CUserDlg::onShowTask(WPARAM wParam,LPARAM lParam) //wParam接收的是圖標的ID,lParam接收的是鼠標的行為
{
if(wParam!=IDR_MAINFRAME)
return 1;
switch(lParam)
{
case WM_RBUTTONUP://右鍵起來時彈出快捷菜單,這里只有一個“關閉”
{
LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);//得到鼠標位置
CMenu menu;
menu.CreatePopupMenu();//聲明一個彈出式菜單
//增加菜單項“關閉”,點擊則發送消息WM_DESTROY給主窗口(已
//隱藏),將程序結束。
menu.AppendMenu(MF_STRING,WM_DESTROY,"退出");
//確定彈出式菜單的位置
menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
//資源回收
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
delete lpoint;
}
break;
case WM_LBUTTONDBLCLK://雙擊左鍵的處理
{
this->ShowWindow(SW_SHOWNORMAL);//簡單的顯示主窗口
}
break;
}
return 0;
}
然后在OnInitDialog函數中調用ToTray();
五為使應用程序退出時圖標消失,映射WM_DESTROY消息,在OnDestroy()函數中加入:
::Shell_NotifyIcon(NIM_DELETE,&m_tnid);
六。至此,托盤圖標程序的常規功能我們均已實現。我們還可以通過Shell_NotifyIcon()函數的調用實現不同狀態
下圖標的改變,就象金山詞霸在主窗口打開與暫停取詞時圖標有所改變一樣。 它常 用來顯示一些系統的狀態。如:
系統時間,音量控制以及其它的一些圖標RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成