VC6.0下实现系统托盘的气泡提示窗口(Use NIIF_INFO)

 

VC6.0下实现系统托盘的气泡提示窗口(Use NIIF_INFO)

首先需要更新一下VC6.0的SDK(否则会出现编译出错),方法如下:
1.把ShellAPI.h文件中的关于任务栏提示的函数和常量替换为下面的内容(重要):

  1. Tray notification definitions
  2. typedef struct _NOTIFYICONDATAA {
  3. DWORD cbSize;
  4. HWND hWnd;
  5. UINT uID;
  6. UINT uFlags;
  7. UINT uCallbackMessage;
  8. HICON hIcon;
  9. #if (_WIN32_IE < 0x0500)
  10. CHAR szTip[64];
  11. #else
  12. CHAR szTip[128];
  13. #endif
  14. #if (_WIN32_IE >= 0x0500)
  15. DWORD dwState;
  16. DWORD dwStateMask;
  17. CHAR szInfo[256];
  18. union {
  19. UINT uTimeout;
  20. UINT uVersion;
  21. } DUMMYUNIONNAME;
  22. CHAR szInfoTitle[64];
  23. DWORD dwInfoFlags;
  24. #endif
  25. #if (_WIN32_IE >= 0x600)
  26. GUID guidItem;
  27. #endif
  28. } NOTIFYICONDATAA, *PNOTIFYICONDATAA;
  29. typedef struct _NOTIFYICONDATAW {
  30. DWORD cbSize;
  31. HWND hWnd;
  32. UINT uID;
  33. UINT uFlags;
  34. UINT uCallbackMessage;
  35. HICON hIcon;
  36. #if (_WIN32_IE < 0x0500)
  37. WCHAR szTip[64];
  38. #else
  39. WCHAR szTip[128];
  40. #endif
  41. #if (_WIN32_IE >= 0x0500)
  42. DWORD dwState;
  43. DWORD dwStateMask;
  44. WCHAR szInfo[256];
  45. union {
  46. UINT uTimeout;
  47. UINT uVersion;
  48. } DUMMYUNIONNAME;
  49. WCHAR szInfoTitle[64];
  50. DWORD dwInfoFlags;
  51. #endif
  52. #if (_WIN32_IE >= 0x600)
  53. GUID guidItem;
  54. #endif
  55. } NOTIFYICONDATAW, *PNOTIFYICONDATAW;
  56. #ifdef UNICODE
  57. typedef NOTIFYICONDATAW NOTIFYICONDATA;
  58. typedef PNOTIFYICONDATAW PNOTIFYICONDATA;
  59. #else
  60. typedef NOTIFYICONDATAA NOTIFYICONDATA;
  61. typedef PNOTIFYICONDATAA PNOTIFYICONDATA;
  62. #endif // UNICODE
  63. #define NOTIFYICONDATAA_V1_SIZE FIELD_OFFSET(NOTIFYICONDATAA, szTip[64])
  64. #define NOTIFYICONDATAW_V1_SIZE FIELD_OFFSET(NOTIFYICONDATAW, szTip[64])
  65. #ifdef UNICODE
  66. #define NOTIFYICONDATA_V1_SIZE NOTIFYICONDATAW_V1_SIZE
  67. #else
  68. #define NOTIFYICONDATA_V1_SIZE NOTIFYICONDATAA_V1_SIZE
  69. #endif
  70. #define NOTIFYICONDATAA_V2_SIZE FIELD_OFFSET(NOTIFYICONDATAA, guidItem)
  71. #define NOTIFYICONDATAW_V2_SIZE FIELD_OFFSET(NOTIFYICONDATAW, guidItem)
  72. #ifdef UNICODE
  73. #define NOTIFYICONDATA_V2_SIZE NOTIFYICONDATAW_V2_SIZE
  74. #else
  75. #define NOTIFYICONDATA_V2_SIZE NOTIFYICONDATAA_V2_SIZE
  76. #endif
  77. #if (_WIN32_IE >= 0x0500)
  78. #define NIN_SELECT (WM_USER + 0)
  79. #define NINF_KEY 0x1
  80. #define NIN_KEYSELECT (NIN_SELECT | NINF_KEY)
  81. #endif
  82. #if (_WIN32_IE >= 0x0501)
  83. #define NIN_BALLOONSHOW (WM_USER + 2)
  84. #define NIN_BALLOONHIDE (WM_USER + 3)
  85. #define NIN_BALLOONTIMEOUT (WM_USER + 4)
  86. #define NIN_BALLOONUSERCLICK (WM_USER + 5)
  87. #endif
  88. #define NIM_ADD 0x00000000
  89. #define NIM_MODIFY 0x00000001
  90. #define NIM_DELETE 0x00000002
  91. #if (_WIN32_IE >= 0x0500)
  92. #define NIM_SETFOCUS 0x00000003
  93. #define NIM_SETVERSION 0x00000004
  94. #define NOTIFYICON_VERSION 3
  95. #endif
  96. #define NIF_MESSAGE 0x00000001
  97. #define NIF_ICON 0x00000002
  98. #define NIF_TIP 0x00000004
  99. #if (_WIN32_IE >= 0x0500)
  100. #define NIF_STATE 0x00000008
  101. #define NIF_INFO 0x00000010
  102. #endif
  103. #if (_WIN32_IE >= 0x600)
  104. #define NIF_GUID 0x00000020
  105. #endif
  106. #if (_WIN32_IE >= 0x0500)
  107. #define NIS_HIDDEN 0x00000001
  108. #define NIS_SHAREDICON 0x00000002
  109. // says this is the source of a shared icon
  110. // Notify Icon Infotip flags
  111. #define NIIF_NONE 0x00000000
  112. // icon flags are mutually exclusive
  113. // and take only the lowest 2 bits
  114. #define NIIF_INFO 0x00000001
  115. #define NIIF_WARNING 0x00000002
  116. #define NIIF_ERROR 0x00000003
  117. #define NIIF_ICON_MASK 0x0000000F
  118. #if (_WIN32_IE >= 0x0501)
  119. #define NIIF_NOSOUND 0x00000010
  120. #endif
  121. #endif
  122. SHSTDAPI_(BOOL) Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA lpData);
  123. SHSTDAPI_(BOOL) Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW lpData);
  124. #ifdef UNICODE
  125. #define Shell_NotifyIcon Shell_NotifyIconW
  126. #else
  127. #define Shell_NotifyIcon Shell_NotifyIconA
  128. #endif // !UNICODE
  129. End Tray Notification Icons

2.在stdafx.h文件中添加:

  1. #ifndef _WIN32_IE // 允许使用 IE 4.0 或更高版本的特定功能。
  2. #define _WIN32_IE 0x0500 //为 IE 5.0 及更新版本改变为适当的值。
  3. #endif

3.添加函数(需要先添加系统托盘图标)

  1. //添加成员变量
  2. NOTIFYICONDATA m_nid;
  3. /***************************************
  4. * pWnd - 窗体指针
  5. * szMsg - 显示的内部信息
  6. * szTitle - 显示的标题信息
  7. * uTimeout - 这个时间过后,气球自动消失(好像不启作用)
  8. * uCallbackMessage - 消息标识
  9. ***************************************/
  10. BOOL CMyCatchFun::ShowBalloonTip(
  11. CWnd* pWnd,
  12. LPCTSTR szMsg,
  13. LPCTSTR szTitle,
  14. UINT uTimeout,
  15. UINT uCallbackMessage
  16. )
  17. {
  18. m_nid.cbSize = sizeof(NOTIFYICONDATA);
  19. m_nid.uTimeout = uTimeout;
  20. m_nid.uVersion = NOTIFYICON_VERSION;
  21. m_nid.dwInfoFlags = NIIF_INFO; //如果前面修改错误,这里会发生"未定义标识符"错误
  22. m_nid.uFlags = NIF_MESSAGE|NIF_INFO|NIF_ICON;
  23. m_nid.uID = IDR_MAINFRAME;
  24. m_nid.hWnd = pWnd->m_hWnd;
  25. m_nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  26. m_nid.uCallbackMessage = uCallbackMessage;
  27. _tcscpy(m_nid.szInfoTitle,szTitle);
  28. _tcscpy(m_nid.szInfo,szMsg);
  29. return Shell_NotifyIcon(NIM_MODIFY,&m_nid);
  30. }

4.修改气球提示信息

  1. void CMyDlg::OnButton1()
  2. {
  3. _tcscpy(m_nid.szInfoTitle,"提醒你");
  4. _tcscpy(m_nid.szInfo,"内容改变");
  5. m_nid.uTimeout=1000;
  6. m_nid.uVersion=NOTIFYICON_VERSION;
  7. Shell_NotifyIcon(NIM_MODIFY,&m_nid);
  8. }

为了更好的说明问题 再给出一个例子

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);


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值