百度空间 | 百度首页 
               
 
查看文章
 
windows托盘程序和泡泡提示简单攻略收藏
2008-08-08 13:40

很多初学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 主框架类中定义的:

   1. BOOL CMainFrame::AddToTray()//初始化主框架时调用
   2. {
   3.     nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);//NOTIFYICONDATA nid;
   4.                                    //NOTIFYICONDATA结构请参考MSDN
   5.     nid.hWnd=this->m_hWnd;
   6.     nid.uID=IDR_MAINFRAME;
   7.     nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
   8.     nid.uCallbackMessage=WM_TRAYMENU;//消息名
   9.     nid.hIcon=LoadIcon(AfxGetInstanceHandle(),
10.                        MAKEINTRESOURCE(IDR_MAINFRAME));
11.     sprintf(nid.szTip,"我的程序名");
12.     Shell_NotifyIcon(NIM_ADD,&nid);//添加托盘图标
13.     return TRUE;
14. }
15.
16. void CMainFrame::RemoveFromTray()//在销毁的时候调用,
17.                    //否则程序意外退出后需要鼠标移上去托盘图标才会消失
18. {
19.     nid.uFlags = 0;
20.     Shell_NotifyIcon(NIM_DELETE, &nid);//移除托盘图标
21. }
22. /*例如:ShowBalloonTip("欢迎登录","我的程序名",4000,NIIF_INFO);*/
23. BOOL CMainFrame::ShowBalloonTip(LPCTSTR szMsg, LPCTSTR szTitle, UINT uTimeout, DWORD dwInfoFlags)
24. {
25. nid.cbSize=sizeof(NOTIFYICONDATA);
26. nid.uFlags = NIF_INFO;//提示类型 ,用于显示泡泡左上方不同图标,
27.                            //另外还有NIIF_ERROR等
28. nid.uTimeout = uTimeout;//提示时间
29. nid.dwInfoFlags = dwInfoFlags;
30. strcpy(nid.szInfo,szMsg ? szMsg : _T(""));//提示信息
31. strcpy(nid.szInfoTitle,szTitle ? szTitle : _T(""));//提示标题
32. return Shell_NotifyIcon(NIM_MODIFY, &nid);
33. }
34.
35.
36. /*响应在托盘上的动作*/
37. void CMainFrame::OnTrayMenu(WPARAM wParam, LPARAM lParam)
38. {
39. if(wParam!=IDR_MAINFRAME)
40.    return ;
41. switch(lParam)
42. {
43. case WM_RBUTTONUP://右键起来时弹出快捷菜单
44. {
45.
46.    POINT point;
47.    ::GetCursorPos(&point);//得到鼠标位置
48.    CMenu menu;
49.    menu.LoadMenu(IDR_MENU_TRAY);//你的菜单资源
50.    CMenu* file_menu = menu.GetSubMenu(0);
51.    ASSERT(file_menu);
52.
53.    this->SetForegroundWindow();
54.    file_menu->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x,
55.                              point.y, this);
56.    menu.DestroyMenu();//资源回收
57.   }
58.   break;
59.   case WM_LBUTTONUP://单击左键的处理
60.   {
61.    ShowWindow(SW_SHOW);//简单的显示主窗口,为了使托盘程序比较专业,
62.                        //最小化时进行了ShowWindow(SW_HIDE);
63.   }
64.   break;
65.   }
66. }

将这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

(完)


类别:windows/.net | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu