以MFC对话框程序为例,为此对话框程序制作一个系统托盘图标。
1、 首先定义一个 NOTIFYICONDATA 类型的类成员变量 m_NotifyIcon;
2、 在BOOL CxxxDlg::OnInitDialog()函数中对m_NotfyIcon 初始化:
m_NotifyIcon.cbSize = sizeof(NOTIFYICONDATA);
m_NotifyIcon.hWnd = this->GetSafeHwnd();
strcpy(m_NotifyIcon.szTip,"文件夹监视程序");//提示文字
m_NotifyIcon.uCallbackMessage = WM_ICONMESSAGE;//回调消息
m_NotifyIcon.uFlags = NIF_MESSAGE|NIF_TIP|NIF_ICON;//新增标志
m_NotifyIcon.hIcon = m_hIcon;//图标句柄
m_NotifyIcon.uID = IDR_MAINFRAME;
Shell_NotifyIcon(NIM_ADD,&m_NotifyIcon);//为系统托盘增加此图标
3、在 xxxDlg.cpp 文件中增加3个宏定义:
#define WM_ICONMESSAGE WM_USER + 101
#define ID_MENU_EXIT 10005
#define ID_MENU_SHOW 10008
4、重载虚基类函数 LRESULT CxxxDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam),并在函数中增加如下代码
LRESULT CxxxDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类
switch(message)
{
case WM_ICONMESSAGE:
if(lParam == WM_RBUTTONDOWN)
{
CMenu menu;
CPoint point;
GetCursorPos(&point);
menu.CreatePopupMenu();
menu.AppendMenu(MF_STRING, ID_MENU_SHOW, _T("显示/隐藏"));
menu.AppendMenu(MF_SEPARATOR);
menu.AppendMenu(MF_STRING, ID_MENU_EXIT, _T("退出程序"));
menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this, NULL);
menu.DestroyMenu();
}
break;
default:
break;
}
return CDialogEx::DefWindowProc(message, wParam, lParam);
}
5、为程序添加显示/隐藏及退出的操作。增加两个成员函数OnMenuShow()和OnMenuExit();
void CxxxDlg::OnMenuExit(void)
{
SendMessage(WM_CLOSE, 0, 0);//发送关闭程序消息
}
void CxxxDlg::OnMenuShow(void)
{
if(IsWindowVisible())//若当前窗口为显示状态则隐藏,否则反之
{
ShowWindow(SW_HIDE);
}
else
{
ShowWindow(SW_SHOW);
}
}
6、为程序添加上面两个函数的消息映射,在BEGIN_MESSAGE_MAP(CxxxDlg, CDialogEx) 与END_MESSAGE_MAP()之间添加如下代码:
ON_COMMAND(ID_MENU_EXIT, OnMenuExit)
ON_COMMAND(ID_MENU_SHOW, OnMenuShow)
7、 有关 NOTIFYICONDATA 结构体的知识