MFC支持将任务图标放在系统任务托盘中显示,通过NOTIFYICONDATA结构体实现,下面具体阐述其实现方法:
1.定义结构体变量
NOTIFYICONDATA m_NotifyIcon;
2.结构体成员变量赋值
m_NotifyIcon.cbSize = sizeof(NOTIFYICONDATA); // 结构大小
m_NotifyIcon.hWnd = this->m_hWnd; // 接收托盘消息的窗口句柄
m_NotifyIcon.uID = IDR_MAINFRAME; // 应用程序中定义的托盘图标ID
m_NotifyIcon.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); // 托盘图标句柄
wcscpy(m_NotifyIcon.szTip,_T("SunjianDlg System Icon Test")); // 图标显示提示字符串
m_NotifyIcon.uCallbackMessage = WM_USER_NOTIFY; // 自定义消息,接收图标发送的消息
m_NotifyIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; // 设置属性
结构体成员变量还有其他其他内容项,经常使用的是以上几项内容。
3.执行添加任务栏图标程序
Shell_NotifyIcon(NIM_ADD,&m_NotifyIcon);
NIM_ADD 表示添加图标;NIM_DELETE表示删除图标;NIM_MODIFY表示修改图标
4.结束后删除图标
Shell_NotifyIcon(NIM_DELETE,&m_NotifyIcon);
其中任务栏图标和应用程序通过先前定义的自定义消息(也可使用系统消息)进行通信,
// 托盘图标消息响应函数,其中wParam参数标示了消息事件发生的任务栏图标ID,
// lParam参数根据事件的不同,包含了鼠标或键盘的具体消息。
LRESULT CSunjianDlgTestDlg::OnNotifyMsg(WPARAM wparam, LPARAM lparam)
{
if( wparam != IDR_MAINFRAME )
{
return -1;
}
switch(lparam)
{
case WM_LBUTTONDOWN:
{
if( TRUE == m_ShowFlag )
{
m_ShowFlag = FALSE;
ShowWindow(SW_HIDE);
}
else
{
m_ShowFlag = TRUE;
ShowWindow(SW_SHOW);
}
}
break;
case WM_RBUTTONDOWN:
{
// 注意:菜单是弹出式菜单,菜单索引项是弹出式菜单,子菜单不是
CMenu menu;
menu.LoadMenuW(IDR_MENU2);
CMenu* pPopup = menu.GetSubMenu(0); // 获取菜单句柄,参数表示菜单位置,索引值
POINT pt;
GetCursorPos(&pt);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,pt.x,pt.y,this); // 其中可添加TPM_RETURNCMD选项,返回值表示选中的菜单ID项
pPopup->DestroyMenu(); // 菜单销毁 // 在此直接使用菜单项处理程序
}
break;
}
}