您的位置:首页 > 其它

VC实现系统托盘程序

2010-07-06 21:34 302 查看
系统托盘主要用到一个Shell_NotifyIcon函数,一个NOTIFYICONDATA类型
说一下大概思路:1.先定义一个自定义消息ID;2.准备好一个图标,作为系统托盘图标;3.定义一个NOTIFYICONDATA类型(不能为局部变量,否则程序退出时无法删除图标)4.调用NotifyIcon函数显示系统托盘

创建一个基于对话框的程序

在对话框头文件中添加以下代码
#define WM_NOTIFYICON WM_USER+5 // 自定义消息ID
#define IDI_ICON IDR_MAINFRAME  // 系统托盘图标ID(用于管理图标)


在对话框类中添加变量
1 NOTIFYICONDATA m_NotfiyIconData;


在对话框初始化函数中添加以下代码
m_NotifyIconData.cbSize=sizeof(NOTIFYICONDATA); // 结构体的大小
m_NotifyIconData.hIcon=this->m_hIcon;    // 图标句柄
m_NotifyIconData.hWnd=this->m_hWnd;  // 窗口句柄
strcpy(m_NotifyIconData.szTip,"Hello World");   // 鼠标指向图标时所显示的消息
m_NotifyIconData.uFlags=NIF_MESSAGE|NIF_TIP|NIF_ICON;
m_NotifyIconData.uID=IDI_ICON;  // 图标ID(用于管理图标,也可以自定义)
Shell_NotifyIcon(NIM_ADD,&m_NotifyIconData);    // 显示图标


至此已经完成了系统托盘的功能了,运行看看。但程序退出时,图标不会删除,在对话框类中添加WM_DESTORY消息,添加以下代码
Shell_NotifyIcon(NIM_DELETE,&m_NotifyIconData); // 程序退出时删除图标


现在再运行看看,退出时可以删除图标了

现在实现点击系统托盘图标时弹出消息框

在对话框类中添加自定义消息映射
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)       //{{AFX_MSG_MAP(CTestDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_DESTROY()
ON_MESSAGE(WM_NOTIFYICON, OnIconNotification)       // ......
//}}AFX_MSG_MAP
END_MESSAGE_MAP()


添加函数定义
BOOL OnIconNotification(WPARAM wParam,LPARAM lParam);


添加函数
BOOL CTestDlg::OnIconNotification(WPARAM wParam, LPARAM lParam)
{
if(wParam!=m_NotifyIconData.uID)    // 不是自己的图标发来的消息,退出
return FALSE;
switch(lParam)  // 过滤消息
{
case WM_LBUTTONDOWN:    // 鼠标左键在图标按下
{
AfxMessageBox("Hello World");   // 弹出消息框
}
break;
}
return TRUE;
}


这样就制作完成了,运行,点击程序的系统托盘图标,就会弹出消息框。也可以根据些方法制作其它功能,如右键菜单等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: