MFC程序添加系統托盤

注:TrayIcon.h文件在附件中
1.引入TrayIcon.h(封裝了Tray的一些api)//這一步並非必需,可以直接針對api編寫代碼
2.在主框架文件中創建CTrayIcon對象
3.爲托盤添加菜單
eg.
m_trayIcon(菜單ID)

4.處理托盤通知消息,一般在OnCreate函數中
eg.
m_trayIcon.SetNotificationWnd(this, WM_MY_TRAY_NOTIFICATION);
m_trayIcon.SetIcon(IDR_MAINFRAME);

5.添加消息映射函數
#define WM_MY_TRAY_NOTIFICATION WM_USER+0
ON_MESSAGE(WM_MY_TRAY_NOTIFICATION, OnTrayNotification)

6.編寫OnTrayNotification函數
LRESULT CTrayTestDlg::OnTrayNotification(WPARAM uID, LPARAM lEvent)
{
//add code

return m_trayIcon.OnTrayNotification(uID, lEvent);
}

7.添加氣泡
如果使用的SDK爲6.0 sp6 這需要修改include下的ShellApi.h文件,替換NOTIFYICONDATA定義部分
////
//// Tray notification definitions
////

typedef struct _NOTIFYICONDATAA {
                DWORD cbSize;
                HWND hWnd;
                UINT uID;
                UINT uFlags;
                UINT uCallbackMessage;
                HICON hIcon;
#if (_WIN32_IE < 0x0500)
                CHAR     szTip[64];
#else
                CHAR     szTip[128];
#endif
#if (_WIN32_IE >= 0x0500)
                DWORD dwState;
                DWORD dwStateMask;
                CHAR     szInfo[256];
                union {
                        UINT    uTimeout;
                        UINT    uVersion;
                } DUMMYUNIONNAME;
                CHAR     szInfoTitle[64];
                DWORD dwInfoFlags;
#endif
#if (_WIN32_IE >= 0x600)
                GUID guidItem;
#endif
} NOTIFYICONDATAA, *PNOTIFYICONDATAA;
typedef struct _NOTIFYICONDATAW {
                DWORD cbSize;
                HWND hWnd;
                UINT uID;
                UINT uFlags;
                UINT uCallbackMessage;
                HICON hIcon;
#if (_WIN32_IE < 0x0500)
                WCHAR    szTip[64];
#else
                WCHAR    szTip[128];
#endif
#if (_WIN32_IE >= 0x0500)
                DWORD dwState;
                DWORD dwStateMask;
                WCHAR    szInfo[256];
                union {
                        UINT    uTimeout;
                        UINT    uVersion;
                } DUMMYUNIONNAME;
                WCHAR    szInfoTitle[64];
                DWORD dwInfoFlags;
#endif
#if (_WIN32_IE >= 0x600)
                GUID guidItem;
#endif
} NOTIFYICONDATAW, *PNOTIFYICONDATAW;
#ifdef UNICODE
typedef NOTIFYICONDATAW NOTIFYICONDATA;
typedef PNOTIFYICONDATAW PNOTIFYICONDATA;
#else
typedef NOTIFYICONDATAA NOTIFYICONDATA;
typedef PNOTIFYICONDATAA PNOTIFYICONDATA;
#endif // UNICODE


#define NOTIFYICONDATAA_V1_SIZE         FIELD_OFFSET(NOTIFYICONDATAA, szTip[64])
#define NOTIFYICONDATAW_V1_SIZE         FIELD_OFFSET(NOTIFYICONDATAW, szTip[64])
#ifdef UNICODE
#define NOTIFYICONDATA_V1_SIZE            NOTIFYICONDATAW_V1_SIZE
#else
#define NOTIFYICONDATA_V1_SIZE            NOTIFYICONDATAA_V1_SIZE
#endif

#define NOTIFYICONDATAA_V2_SIZE         FIELD_OFFSET(NOTIFYICONDATAA, guidItem)
#define NOTIFYICONDATAW_V2_SIZE         FIELD_OFFSET(NOTIFYICONDATAW, guidItem)
#ifdef UNICODE
#define NOTIFYICONDATA_V2_SIZE            NOTIFYICONDATAW_V2_SIZE
#else
#define NOTIFYICONDATA_V2_SIZE            NOTIFYICONDATAA_V2_SIZE
#endif


#if (_WIN32_IE >= 0x0500)
#define NIN_SELECT                    (WM_USER + 0)
#define NINF_KEY                        0x1
#define NIN_KEYSELECT             (NIN_SELECT | NINF_KEY)
#endif

#if (_WIN32_IE >= 0x0501)
#define NIN_BALLOONSHOW         (WM_USER + 2)
#define NIN_BALLOONHIDE         (WM_USER + 3)
#define NIN_BALLOONTIMEOUT    (WM_USER + 4)
#define NIN_BALLOONUSERCLICK (WM_USER + 5)
#endif


#define NIM_ADD                 0x00000000
#define NIM_MODIFY            0x00000001
#define NIM_DELETE            0x00000002
#if (_WIN32_IE >= 0x0500)
#define NIM_SETFOCUS        0x00000003
#define NIM_SETVERSION    0x00000004
#define         NOTIFYICON_VERSION 3
#endif

#define NIF_MESSAGE         0x00000001
#define NIF_ICON                0x00000002
#define NIF_TIP                 0x00000004
#if (_WIN32_IE >= 0x0500)
#define NIF_STATE             0x00000008
#define NIF_INFO                0x00000010
#endif
#if (_WIN32_IE >= 0x600)
#define NIF_GUID                0x00000020
#endif

#if (_WIN32_IE >= 0x0500)
#define NIS_HIDDEN                            0x00000001
#define NIS_SHAREDICON                    0x00000002

// says this is the source of a shared icon

// Notify Icon Infotip flags
#define NIIF_NONE             0x00000000
// icon flags are mutually exclusive
// and take only the lowest 2 bits
#define NIIF_INFO             0x00000001
#define NIIF_WARNING        0x00000002
#define NIIF_ERROR            0x00000003
#if (_WIN32_IE >= 0x0600)
#define NIIF_USER             0x00000004
#endif
#define NIIF_ICON_MASK    0x0000000F
#if (_WIN32_IE >= 0x0501)
#define NIIF_NOSOUND        0x00000010
#endif
#endif

SHSTDAPI_(BOOL) Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA lpData);
SHSTDAPI_(BOOL) Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW lpData);
#ifdef UNICODE
#define Shell_NotifyIcon    Shell_NotifyIconW
#else
#define Shell_NotifyIcon    Shell_NotifyIconA
#endif // !UNICODE

////
//// End Tray Notification Icons
////

並在MFC工程的AfxStd.h文件加入
#ifndef _WIN32_IE // 允許使用 IE 4.0 或更高版本的特定功能。
#define _WIN32_IE 0x0500 //爲 IE 5.0 及更新版本改變爲適當的值。
#endif

注:不修改會出現NIF_INFO未定義的編譯錯誤
7.在TRAYICON中添加顯示氣泡函數,並寫相應的函數體    
// Show balloon tip
        BOOL ShowBalloonTip(LPCTSTR szMsg, LPCTSTR szTitle,
                UINT uTimeout, DWORD dwInfoFlags=NIIF_INFO);

        // Show balloon tip: use resource ID instead of LPCSTR.
        BOOL ShowBalloonTip(UINT uID, LPCTSTR szTitle,
                UINT uTimeout, DWORD dwInfoFlags=NIIF_INFO);

函數體:
//////////////////
// Show balloon tip: args give message, tiemout, etc.
//
BOOL CTrayIcon::ShowBalloonTip(LPCTSTR szMsg, LPCTSTR szTitle,
        UINT uTimeout, DWORD dwInfoFlags)
{
        m_nid.cbSize=sizeof(NOTIFYICONDATA);
        m_nid.uFlags = NIF_INFO;
        m_nid.uTimeout = uTimeout;
        m_nid.dwInfoFlags = dwInfoFlags;
        strcpy(m_nid.szInfo,szMsg ? szMsg : _T(""));
        strcpy(m_nid.szInfoTitle,szTitle ? szTitle : _T(""));
        return Shell_NotifyIcon(NIM_MODIFY, &m_nid);
}

BOOL CTrayIcon::ShowBalloonTip(UINT uID, LPCTSTR szTitle,
        UINT uTimeout, DWORD dwInfoFlags)
{
        CString s;
        return s.LoadString(uID) ?
                ShowBalloonTip(s, szTitle, uTimeout, dwInfoFlags) : FALSE;
}


使用的時候直接調用該函數即可

注:當explorer異常重啓時,程序無法找回托盤圖標,找回方法會在後續添加

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章