最小化到系统托盘图标流程:点击窗口最小化->自动隐藏任务栏图标,并在托盘图标那边自动添加->双击托盘图标可自动显示窗口->也可右键托盘图标,选择相应菜单操作。
窗口最小化处理:通过WindowProc处理SC_MINIMIZE消息,进行添加系统托盘图标。
LRESULT CshelliconDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_SYSCOMMAND:
if (SC_MINIMIZE == wParam)
{
AddShellIcon(); // 添加系统托盘图标
ModifyStyleEx(0, WS_EX_TOPMOST); // 去除任务栏图标
ShowWindow(SW_HIDE); // 窗体隐藏
return 0;
}
break;
default:
break;
}
return CDialog::WindowProc(message, wParam, lParam);
}
void CshelliconDlg::AddShellIcon()
{
// TODO: 在此添加控件通知处理程序代码
if (m_bAddShellIcon) return; // 标志位,用于标识是否已经添加托盘图标,防止重复操作。
NOTIFYICONDATA data;
data.cbSize = sizeof(NOTIFYICONDATA);//结构体的大小
data.hWnd = m_hWnd;//接收托盘消息的窗口句柄
data.uID = IDR_MAINFRAME;//定义的托盘图标ID
data.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;//设置属性,下面的三个属性是否有效
data.uCallbackMessage = WM_ONTRAY;//自定义的消息,使用#define WM_ONTRAY WM_USER + 1
data.hIcon = m_hIcon;//显示在系统托盘上的图标
TCHAR lpszTip[] = _T("shellicon");
lstrcpyn(data.szTip, lpszTip, sizeof(lpszTip));//图标上的提示字符串
Shell_NotifyIcon(NIM_ADD, &data);// 向任务栏的状态栏发送添加托盘图标的消息
m_bAddShellIcon = TRUE;
}
托盘图标点击事件响应,通过 此消息类型进行处理
data.uCallbackMessage = WM_ONTRAY;
LRESULT DealMsg(WPARAM wParam, LPARAM lParam);
ON_MESSAGE(WM_ONTRAY, DealMsg)
UINT uMouseMsg = (UINT)lParam;
if (WM_LBUTTONDBLCLK == uMouseMsg)
{
ShowWindow(SW_SHOWNOACTIVATE);
}
else if (WM_RBUTTONDOWN == uMouseMsg)
{
CMenu menu;
VERIFY(menu.LoadMenu(IDR_MENU1));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CPoint point;
GetCursorPos(&point);
// 加挂右键菜单
int iCmd = pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RETURNCMD, point.x, point.y, this);
switch (iCmd)
{
case ID_SHOW:
ShowWindow(SW_SHOWNOACTIVATE);
break;
case ID_HIDE:
CloseWindow();
ShowWindow(SW_HIDE);
break;
case ID_CLOSE:
SendMessage(WM_CLOSE);
break;
default:
break;
}
}
return 0;
窗口关闭退出,自动删除系统托盘图标。(注:如果不进行删除,则图标会被缓存,直到鼠标移动到此图标才会自动消失)
void CshelliconDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
NOTIFYICONDATA data;
data.cbSize = sizeof(NOTIFYICONDATA);
data.hWnd = m_hWnd;
data.uID = IDR_MAINFRAME;
Shell_NotifyIcon(NIM_DELETE, &data);
CDialogEx::OnClose();
}
至此,最小化到系统托盘图标功能全部完善。 @_@