1.定义成员变量
NOTIFYICONDATA NotifyIcon;//托盘图标
2.初始化创建托盘图标
NotifyIcon.cbSize = sizeof(NOTIFYICONDATA);
NotifyIcon.hIcon = this->m_hIcon;
NotifyIcon.hWnd = this->m_hWnd;
lstrcpy(NotifyIcon.szTip, L"TEST"); //鼠标放上去显示文字
NotifyIcon.uCallbackMessage = WM_NOTIFYICON;//自定义托盘图标消息
NotifyIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
Shell_NotifyIcon(NIM_ADD, &NotifyIcon);
3.自定义消息、消息响应函数,添加消息映射
#ifndef WM_NOTIFYICON
#define WM_NOTIFYICON WM_USER+101 //托盘图标自定义消息
#endif
afx_msg LRESULT OnNotifyIcon(WPARAM wParam,LPARAM lParam);//托盘图标响应函数
ON_MESSAGE(WM_NOTIFYICON, OnNotifyIcon)//托盘图标消息映射
4.响应托盘图标消息函数
LRESULT CMy123Dlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam) //托盘图标响应函数
{
switch (lParam)
{
case WM_LBUTTONDBLCLK://鼠标左键双击
{
//ShowWindow(SW_SHOW);
break;
}
case WM_RBUTTONDOWN://单击鼠标右键弹出菜单
{
CMenu menu;
menu.LoadMenu(IDR_MENU);//菜单ID
CPoint pos;
GetCursorPos(&pos);
CMenu* pMenu = menu.GetSubMenu(0);
if (NULL != pMenu)
{
SetForegroundWindow();//无此句弹出的菜单不会隐藏
pMenu->TrackPopupMenu (TPM_RIGHTALIGN|TPM_LEFTBUTTON, pos.x, pos.y, this);
menu.DestroyMenu();
}
break;
}
default:
break;
}
return 0;
}
5.响应系统消息,重写OnCommand
BOOL CLoadDbDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类
switch (wParam)
{//此处执行右键弹出菜单
case ID_SHOW:
{
ModifyStyleEx(WS_EX_TOOLWINDOW, WS_EX_APPWINDOW);
SetWindowPos(&wndNoTopMost,(iScreenX-Rect.left-Rect.right)/2 ,(iScreenY-Rect.top-Rect.bottom)/2 ,0 ,0, SWP_NOSIZE | SWP_SHOWWINDOW);
break;
}
case ID_EXIT:
{
if(IDYES != MessageBox(_T("您是否确定退出应用程序LoadDb?"), _T("温馨提示"), MB_YESNOCANCEL| MB_ICONQUESTION|MB_DEFBUTTON2))
{
break;
}
Shell_NotifyIcon(NIM_DELETE, &NotifyIcon); //删除托盘图标
CDialog::OnCancel();
break;
}
default:
break;
}
return CDialog::OnCommand(wParam, lParam);
}
NOTIFYICONDATA NotifyIcon;//托盘图标
2.初始化创建托盘图标
NotifyIcon.cbSize = sizeof(NOTIFYICONDATA);
NotifyIcon.hIcon = this->m_hIcon;
NotifyIcon.hWnd = this->m_hWnd;
lstrcpy(NotifyIcon.szTip, L"TEST"); //鼠标放上去显示文字
NotifyIcon.uCallbackMessage = WM_NOTIFYICON;//自定义托盘图标消息
NotifyIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
Shell_NotifyIcon(NIM_ADD, &NotifyIcon);
3.自定义消息、消息响应函数,添加消息映射
#ifndef WM_NOTIFYICON
#define WM_NOTIFYICON WM_USER+101 //托盘图标自定义消息
#endif
afx_msg LRESULT OnNotifyIcon(WPARAM wParam,LPARAM lParam);//托盘图标响应函数
ON_MESSAGE(WM_NOTIFYICON, OnNotifyIcon)//托盘图标消息映射
4.响应托盘图标消息函数
LRESULT CMy123Dlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam) //托盘图标响应函数
{
switch (lParam)
{
case WM_LBUTTONDBLCLK://鼠标左键双击
{
//ShowWindow(SW_SHOW);
break;
}
case WM_RBUTTONDOWN://单击鼠标右键弹出菜单
{
CMenu menu;
menu.LoadMenu(IDR_MENU);//菜单ID
CPoint pos;
GetCursorPos(&pos);
CMenu* pMenu = menu.GetSubMenu(0);
if (NULL != pMenu)
{
SetForegroundWindow();//无此句弹出的菜单不会隐藏
pMenu->TrackPopupMenu (TPM_RIGHTALIGN|TPM_LEFTBUTTON, pos.x, pos.y, this);
menu.DestroyMenu();
}
break;
}
default:
break;
}
return 0;
}
5.响应系统消息,重写OnCommand
BOOL CLoadDbDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类
switch (wParam)
{//此处执行右键弹出菜单
case ID_SHOW:
{
ModifyStyleEx(WS_EX_TOOLWINDOW, WS_EX_APPWINDOW);
SetWindowPos(&wndNoTopMost,(iScreenX-Rect.left-Rect.right)/2 ,(iScreenY-Rect.top-Rect.bottom)/2 ,0 ,0, SWP_NOSIZE | SWP_SHOWWINDOW);
break;
}
case ID_EXIT:
{
if(IDYES != MessageBox(_T("您是否确定退出应用程序LoadDb?"), _T("温馨提示"), MB_YESNOCANCEL| MB_ICONQUESTION|MB_DEFBUTTON2))
{
break;
}
Shell_NotifyIcon(NIM_DELETE, &NotifyIcon); //删除托盘图标
CDialog::OnCancel();
break;
}
default:
break;
}
return CDialog::OnCommand(wParam, lParam);
}