很多程序都在任务栏上的时钟边上创建了自己的图标,使得自己的程序的用户界面更加的友好.本文就说明了如果在任务栏上的系统通知区为自己的程序创建一个图标,并在其上响应鼠标事件.
1.首先先在任务栏上创建图标.
定义一全局变量
NOTIFYICONDATA nd;
//这里面的NOTIFYICONDATA是一个存着通知区图标有关信息的节构,一会我们要填充它.
在程序的初始化过程中(比如在对话框程序中,可以在OnInitDialog函数中),我们填充刚才定义的节构,如下:
nd.cbSize = sizeof (NOTIFYICONDATA);
nd.hWnd = m_hWnd;
nd.uID = IDI_ICON1;
nd.uFlags = NIF_ICONNIF_MESSAGENIF_TIP;
nd.hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
strcpy(nd.szTip, "文本");
Shell_NotifyIcon(NIM_ADD, &nd);
上面代码中,m_hWnd是当前窗口的句柄,IDI_ICON1为你要显示的图标在资源中的ID,nd.szTip中填充的是当鼠标停在图标上时要显示的Tip中的文字.可以按照你自己的要求填充这些变量.
现在,编译,运行程序,我们看到,通知区已经有了你的图标了.这样,第一步就完成了.
2.为图标加上响应鼠标操作的功能.
在刚才定义NOTIFYICONDATA nd 的地方,再加上一个消息宏:
#define WM_NOTIFYICON WM_USER+1005
在刚才填充NOTIFYICONDATA 结构的地方,也就是OnInitDialog函数中,加入:
nd.uCallbackMessage = WM_NOTIFYICON;
然后手动填加这个消息的映射:
在头文件中:
LONG OnNotifyIcon(WPARAM wParam, LPARAM lParam);
在CPP文件中:
BEGIN_MESSAGE_MAP(CCBabyImageDlg, CDialog)
//{{AFX_MSG_MAP(C*****)
....
....
....
//}}AFX_MSG_MAP
ON_MESSAGE(WM_NOTIFYICON, OnNotifyIcon) //这句是我们要加入的
现在就可以写这个回调函数了:
LONG C*****Dlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
switch ( lParam )
{
case WM_RBUTTONDOWN:
{
CMenu m_PopupMenu;
CPoint Point;
CMenu *hh;
m_PopupMenu.LoadMenu(IDR_MENU1);
hh=m_PopupMenu.GetSubMenu(0);
GetCursorPos( &Point );
SetForegroundWindow();
hh->TrackPopupMenu(
TPM_LEFTALIGN TPM_RIGHTBUTTON,
Point.x, Point.y, this);
//MessageBox("DFHJKDLJFKL",NULL,MB_OK);
}
break;
case WM_LBUTTONDBLCLK:
case WM_LBUTTONDOWN:
ShowWindow(SW_SHOW);
break;
break;
}
return 0;
}
上面这个函数中,case WM_RBUTTONDOWN:是单击右键
case WM_LBUTTONDBLCLK:是双击左键
case WM_LBUTTONDOWN:是单击左键,你可以在它们里面填加自己需要的内容.
而IDR_MENU1是你需要弹出的菜单.在资源中可以创建它.
不过这里有个问题,就是在你创建菜单资源的时候,要把你需要的项目放入菜单的第二级中,第一级就随便写什么都可以了.
到此,这个程序就几乎完成了.不过还有一点小问题,当程序退出或者你需要的时候要把这个图标除掉,这很简单,在退出过程中加入下面代码:
Shell_NotifyIcon(NIM_DELETE, &nd);
当执行到这句时,图标便会被除掉了.
(全文完)
公告(重要):
本blog中的源码和其它文件均以ZIP格式压缩.
请使用下载工具下载文件链接(推荐用FlashGet或类似工具),否则可能会出现下载的压缩包不完整,无法解压的情况.
订阅:
博文评论 (Atom)
文章分类
- MFC (3)
较早的文档
这里是我学习编程中的一些心得体会,方法技巧等.
很高兴能与你分享这些.
我的联系方式:checkabc@gmail.com
没有评论:
发表评论