很多初學MFC的人對於系統托盤程式和泡泡提示很好奇,但卻有種望而生畏的感覺,其實只需要以下3個函數和一個自訂訊息和訊息處理函數就夠了.
我們先來認識一下這幾個函數
BOOL AddToTray();//添加托盤表徵圖
void RemoveFromTray();//移除托盤表徵圖
BOOL ShowBalloonTip(LPCTSTR szMsg,LPCTSTR szTitle,
UINT uTimeout, DWORD dwInfoFlags);//顯示泡泡提示
#define WM_TRAYMENU WM_USER+3001//自訂訊息
ON_MESSAGE(WM_TRAYMENU,OnTrayMenu)//訊息處理
afx_msg void OnTrayMenu(WPARAM wParam,LPARAM lParam);//訊息處理函數
這幾個函數都是在MFC 主架構類中定義的:
- BOOL CMainFrame::AddToTray()//初始化主架構時調用
- {
- nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);//NOTIFYICONDATA nid;
- // NOTIFYICONDATA結構請參考MSDN
- nid.hWnd=this->m_hWnd;
- nid.uID=IDR_MAINFRAME;
- nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
- nid.uCallbackMessage=WM_TRAYMENU;//訊息名
- nid.hIcon=LoadIcon(AfxGetInstanceHandle(),
- MAKEINTRESOURCE(IDR_MAINFRAME));
- sprintf(nid.szTip,"我的程式名");
- Shell_NotifyIcon(NIM_ADD,&nid);//添加托盤表徵圖
- return TRUE;
- }
- void CMainFrame::RemoveFromTray()//在銷毀的時候調用,
- //否則程式意外退出後需要滑鼠移上去托盤表徵圖才會消失
- {
- nid.uFlags = 0;
- Shell_NotifyIcon(NIM_DELETE, &nid);//移除托盤表徵圖
- }
- /*例如:ShowBalloonTip("歡迎登入","我的程式名",4000,NIIF_INFO);*/
- BOOL CMainFrame::ShowBalloonTip(LPCTSTR szMsg,LPCTSTR szTitle, UINT uTimeout, DWORD dwInfoFlags)
- {
- nid.cbSize=sizeof(NOTIFYICONDATA);
- nid.uFlags = NIF_INFO;//提示類型 ,用於顯示泡泡左上方不同表徵圖,
- //另外還有NIIF_ERROR等
- nid.uTimeout = uTimeout;//提示時間
- nid.dwInfoFlags = dwInfoFlags;
- strcpy(nid.szInfo,szMsg ? szMsg : _T(""));//提示資訊
- strcpy(nid.szInfoTitle,szTitle ? szTitle : _T(""));//提示標題
- return Shell_NotifyIcon(NIM_MODIFY, &nid);
- }
- /*響應在托盤上的動作*/
- void CMainFrame::OnTrayMenu(WPARAM wParam,LPARAM lParam)
- {
- if(wParam!=IDR_MAINFRAME)
- return ;
- switch(lParam)
- {
- case WM_RBUTTONUP://右鍵起來時彈出捷徑功能表
- {
-
- POINT point;
- ::GetCursorPos(&point);//得到滑鼠位置
- CMenu menu;
- menu.LoadMenu(IDR_MENU_TRAY);//你的菜單資源
- CMenu* file_menu = menu.GetSubMenu(0);
- ASSERT(file_menu);
-
- this->SetForegroundWindow();
- file_menu->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x,
- point.y, this);
- menu.DestroyMenu();//資源回收
- }
- break;
- case WM_LBUTTONUP://單擊左鍵的處理
- {
- ShowWindow(SW_SHOW);//簡單的顯示主視窗,為了使托盤程式比較專業,
- //最小化時進行了ShowWindow(SW_HIDE);
- }
- break;
- }
- }
將這3個函數在你的MainFrame.h 和.cpp中定義,聲明WM_TRAYMENU並添加定義訊息處理函數然後在初始化主架構時調用AddToTray(),銷毀的時候調用RemoveFromTray(),需要提示的時候調用ShowBalloonTip(...)。
補充一下:泡泡提示需要IE5以上的支援,也就是說,你的程式必須運行於高於或等於IE5版本的Windows系統上;
相應的你的開發包也應該使用支援IE5以上的SDK,如果你是使用的是VC6,那很可能需要安裝一個sdk如xp sp2 sdk
這個可以在很多地方下載到,安裝好後記得把include目錄所在位置加到你的vc6的搜尋路徑中,而且需要排到首位。
如:E:/XP_SDK_SP2/INCLUDE
(完)