VC6.0下实现系统托盘的气泡提示窗口(Use NIIF_INFO)
首先需要更新一下VC6.0的SDK(否则会出现编译出错),方法如下:
1.把ShellAPI.h文件中的关于任务栏提示的函数和常量替换为下面的内容(重要):
-
-
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
-
#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
-
2.在stdafx.h文件中添加:
-
#ifndef _WIN32_IE // 允许使用 IE 4.0 或更高版本的特定功能。
-
#define _WIN32_IE 0x0500 //为 IE 5.0 及更新版本改变为适当的值。
-
#endif
3.添加函数(需要先添加系统托盘图标)
-
//添加成员变量
-
NOTIFYICONDATA m_nid;
-
/***************************************
-
* pWnd - 窗体指针
-
* szMsg - 显示的内部信息
-
* szTitle - 显示的标题信息
-
* uTimeout - 这个时间过后,气球自动消失(好像不启作用)
-
* uCallbackMessage - 消息标识
-
***************************************/
-
BOOL CMyCatchFun::ShowBalloonTip(
-
CWnd* pWnd,
-
LPCTSTR szMsg,
-
LPCTSTR szTitle,
-
UINT uTimeout,
-
UINT uCallbackMessage
-
)
-
{
-
m_nid.cbSize = sizeof(NOTIFYICONDATA);
-
m_nid.uTimeout = uTimeout;
-
m_nid.uVersion = NOTIFYICON_VERSION;
-
m_nid.dwInfoFlags = NIIF_INFO; //如果前面修改错误,这里会发生"未定义标识符"错误
-
m_nid.uFlags = NIF_MESSAGE|NIF_INFO|NIF_ICON;
-
m_nid.uID = IDR_MAINFRAME;
-
m_nid.hWnd = pWnd->m_hWnd;
-
m_nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
-
m_nid.uCallbackMessage = uCallbackMessage;
-
_tcscpy(m_nid.szInfoTitle,szTitle);
-
_tcscpy(m_nid.szInfo,szMsg);
-
return Shell_NotifyIcon(NIM_MODIFY,&m_nid);
-
}
4.修改气球提示信息
-
void CMyDlg::OnButton1()
-
{
-
_tcscpy(m_nid.szInfoTitle,"提醒你");
-
_tcscpy(m_nid.szInfo,"内容改变");
-
m_nid.uTimeout=1000;
-
m_nid.uVersion=NOTIFYICON_VERSION;
-
Shell_NotifyIcon(NIM_MODIFY,&m_nid);
-
}
为了更好的说明问题 再给出一个例子
:
vc++系统托盘
系统托盘
如果将自己做的程序添加到系统托盘中,会给人一种你的程序很专业的感觉。其实要操作系统托盘很简单。首先,在对话框的头文件中添加自定义消息:
#define WM_TASKBAR WM_APP+1000
然后映射自定义消息,在如下地方添加代码:
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
// 在此处添加
ON_MESSAGE(WM_TASKBAR,OnTaskbar)
//{{AFX_MSG_MAP(CAddiconDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_COMMAND(ID_MENUQUIT, OnMenuquit)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
然后就是编写处理自定义消息的函数(右键单击弹出菜单):
LRESULT CMyDlg::OnTaskbar(WPARAM wParam, LPARAM lParam)
{
if( lParam == WM_RBUTTONDOWN )
{
CMenu* menu;
menu = new CMenu();
menu->LoadMenu(IDR_MENU1);// 菜单是要提前做好的
CMenu* pPopup=menu->GetSubMenu(0);
::SetMenuDefaultItem(pPopup->m_hMenu,0,TRUE); //设置粗体字
CPoint Point;
GetCursorPos(&Point);
pPopup->TrackPopupMenu(TPM_LEFTALIGN,Point.x,Point.y,AfxGetMainWnd(),NULL);
}
return 0;
}
接下来是向系统托盘中加入图标,用函数来表示:
void CMyDlg::AddIcon()
{
//图标句柄
HICON hIcon;
char lpszTip[] = "欢迎使用本程序!";
HINSTANCE hInst = AfxFindResourceHandle(
MAKEINTRESOURCE(IDR_MAINFRAME),RT_GROUP_ICON);
hIcon = (HICON)LoadImage(hInst,MAKEINTRESOURCE(IDR_MAINFRAME),
IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
//给NOTIFYICONDATA结构赋值
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = m_hWnd;
tnid.uID = IDR_MAINFRAME;
tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
tnid.uCallbackMessage = WM_TASKBAR; //自定义消息
tnid.hIcon = hIcon;
if (lpszTip)
lstrcpyn(tnid.szTip, lpszTip, sizeof(tnid.szTip));
else
tnid.szTip[0] = '/0';
//调用Shell_NotifyIcon函数通过NIM_ADD向任务栏写图标
Shell_NotifyIcon(NIM_ADD, &tnid);
//释放图标资源
if (hIcon)
DestroyIcon(hIcon);
}
最后是编写删除托盘图标的函数:
void CMyDlg::DelIcon()
{
//提供结构大小,窗口句柄和图标ID
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = m_hWnd;
tnid.uID = IDR_MAINFRAME;
//用NIM_DELETE删除图标
Shell_NotifyIcon(NIM_DELETE, &tnid);