VC编程:系统托盘、气泡提示
小标 2018-07-23 来源 : 阅读 1797 评论 0

摘要:本文主要向大家介绍了VC编程的系统托盘、气泡提示,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程的系统托盘、气泡提示,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

系统环境:Windows 7
软件环境:Visual Studio 2008 SP1
本次目的:实现系统托盘、气泡提示的效果

      系统托盘的效果,大家应该都见过,比如QQ、杀毒软件之类的都会在任务栏驻留图标,这对于一些软件的用处非常大,易于操作软件并且可以隐藏软件。如下图所示:

 

要实现系统托盘,就要认识NOTIFYICONDATA结构体,如下:

[cpp] view plain copy

1. /***该系统需要处理的任务栏状态区的消息***/  

2. typedef struct _NOTIFYICONDATA {  

3.     DWORD cbSize;        //结构体的大小,以字节为单位  

4.     HWND hWnd;           //窗口的句柄  

5.     UINT uID;            //应用程序定义的任务栏图标的标识符  

6.     UINT uFlags;         //此成员表明具体哪些其他成员为合法数据  

7.     UINT uCallbackMessage;   //应用程序定义的消息标示  

8.     HICON hIcon;         //增加、修改或删除的图标的句柄  

9.     TCHAR szTip[64];     //指向一个以/0结束的字符串的指针  

10.     DWORD dwState;       //Version 5.0,图标的状态  

11.     DWORD dwStateMask;   //Version 5.0. 指明dwState成员的那些位可以被设置或者访问  

12.     TCHAR szInfo[256];   //指向一个以/0结束的字符串的指针,字符串的内容为气球提示内容  

13.     union {  

14.         UINT uTimeout;   //表示气球提示超时的时间,单位为毫秒,此时间后气球提示将消失  

15.         UINT uVersion;   //用来设置使用Windows 95 还是 Windows 2000风格的图标消息接口  

16.     };  

17.     TCHAR szInfoTitle[64];   //指向一个以/0结束的字符串的指针。字符串的内容为气球提示的标题  

18.     DWORD dwInfoFlags;   //设置此成员用来给气球提示框增加一个图标,增加的图标出现在气球提示标题的左侧  

19.     GUID guidItem;       //保留  

20.     HICON hBalloonIcon;  //用于Windows Vista或更高版本的自定义气球图标  

21. } NOTIFYICONDATA, *PNOTIFYICONDATA;  

下面开始实现:
步骤一:建立一基于对话框的工程,名称任意;
步骤二:在对话框头文件添加两个变量,一个NOTIFYICONDATA 变量nid,一个BOOL 变量isNotify,逻辑变量是为了判断托盘是否已经出现。在对话框的初始化OnInitDialog函数添加

isNotify=false;

然后在头文件上面添加#define WM_SHOWTASK (WM_USER+n) ,注意n>100以上。然后在消息映射函数里面添加一条声明消息:

afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);

步骤三:在对话框实现文件CPP里面在BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP 之间加入

ON_MESSAGE(WM_SHOWTASK,onShowTask)

步骤四:接着实现onShowTask ()函数功能,即托盘菜单

[cpp] view plain copy

1. LRESULT CCD_ROM_OPENDlg::onShowTask(WPARAM wParam,LPARAM lParam)//wParam接收的是图标的ID,而lParam接收的是鼠标的行为  

2. {  

3.     if(wParam!=IDR_MAINFRAME)  

4.     return 1;  

5.     switch(lParam)  

6.     {  

7.         case WM_RBUTTONUP:          //右键起来时弹出快捷菜单,这里只有一个"关闭"  

8.         {  

9.             LPPOINT lpoint=new tagPOINT;  

10.             ::GetCursorPos(lpoint);         //得到鼠标位置  

11.             CMenu menu;  

12.             menu.CreatePopupMenu();             //声明一个弹出式菜单           

13.             menu.AppendMenu(MF_STRING,WM_DESTROY,_T("关闭"));   //增加菜单项"关闭",点击则发送消息WM_DESTROY给主窗口(已隐藏),将程序结束。           

14.             menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);//确定弹出式菜单的位置            

15.                         SetForegroundWindow();  

16.             HMENU hmenu=menu.Detach();   //资源回收  

17.             menu.DestroyMenu();  

18.             delete lpoint;  

19.         }break;  

20.         case WM_LBUTTONDBLCLK:    //双击左键的处理  

21.         {  

22.             this->ShowWindow(SW_SHOW);    //简单的显示主窗口完事儿  

23.         }break;  

24.     }  

25.     return 0;  

26. }  

步骤五:添加一个函数实现托盘的实现

[cpp] view plain copy

1. void CCD_ROM_OPENDlg::OnBnClickedButton1()  

2. {  

3.     // TODO: 在此添加控件通知处理程序代码   

4.     if (!isNotify)  

5.     {  

6.         nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);  

7.         nid.hWnd=this->m_hWnd;  

8.         nid.uID=IDR_MAINFRAME;  

9.         nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP|NIF_INFO;  

10.         nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称,注意:这里的消息是用户自定义消息  

11.         nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));  

12.         wcscpy_s(nid.szTip,_T("VC系统托盘程序"));//信息提示条为"计划任务提醒"  

13.         wcscpy_s(nid.szInfo,_T("标题"));  

14.         wcscpy_s(nid.szInfoTitle,_T("内容"));  

15.         nid.dwInfoFlags=NIIF_INFO;  

16.         nid.uTimeout=5000;        

17.         Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标  

18.     }  

19.     //AnimateWindow(1000,AW_HIDE|AW_BLEND);      //可以缓慢消失窗口  

20.    // KillTimer(0);  

21.     ShowWindow(SW_HIDE);//隐藏主窗口  

22. }  

步骤六:将对话框的关闭按钮变成隐藏界面的效果,即要关闭按钮不会关闭程序,在OnSysCommand ()函数里面

[cpp] view plain copy

1. void CCD_ROM_OPENDlg::OnSysCommand(UINT nID, LPARAM lParam)  

2. {  

3.     if ((nID & 0xFFF0) == IDM_ABOUTBOX)  

4.     {  

5.         CAboutDlg dlgAbout;  

6.         dlgAbout.DoModal();  

7.     }  

8.     else if ((nID & 0xFFF0) == SC_CLOSE)      //触发关闭按钮  

9.     {  

10.         //OnClose();           //不进行关闭  

11.         OnBnClickedButton1();     //开启托盘  

12.     }  

13.     else  

14.     {  

15.         CDialog::OnSysCommand(nID, lParam);  

16.     }  

17. }  

步骤七:销毁。在程序关闭的时候,要记得销毁托盘图标,重载OnDestroy ()函数

[cpp] view plain copy

1. void CCD_ROM_OPENDlg::OnDestroy()  

2. {  

3.     CDialog::OnDestroy();  

4.     Shell_NotifyIcon(NIM_DELETE,&nid);  

5.     // TODO: 在此处添加消息处理程序代码  

6. }  

以上就介绍了VC/MFC的学习,希望对VC/MFC有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved