MFC - 最小化到系统托盘 <--> 右键菜单还原或者关闭
本篇文章不算是自己完全自创。。应该算是多家大侠的集合,留给自己以后参考。
VS2008 - MFC做的最小化到系统托盘
下面是主界面Dlg的 .h文件应该添加的:
.H文件
1
2public:
3 LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);
4 afx_msg void OnSysOpen(); // 系统托盘右键菜单
5 afx_msg void OnSysExit(); // 系统托盘右键菜单
6
7 int m_boolMiniSystemBox;
8 NOTIFYICONDATA m_tnid;
1
2public:
3 LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);
4 afx_msg void OnSysOpen(); // 系统托盘右键菜单
5 afx_msg void OnSysExit(); // 系统托盘右键菜单
6
7 int m_boolMiniSystemBox;
8 NOTIFYICONDATA m_tnid;
主界面Dlg的.CPP文件应该添加:
其中:menu.LoadMenu(IDR_MENU1); 这句的IDR_MENU1是在资源里面创建的菜单。
Code
#define WM_USER_NOTIFYICON WM_USER+1
//
BEGIN_MESSAGE_MAP(CMainDlg, CDialog)
//
//
//
ON_MESSAGE(WM_USER_NOTIFYICON,onShowTask)
ON_COMMAND(ID_SYS_OPEN, &CMainDlg::OnSysOpen)
ON_COMMAND(ID_SYS_EXIT, &CMainDlg::OnSysExit)
END_MESSAGE_MAP()
//
LRESULT CMainDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
LONG l = CDialog::DefWindowProc(message, wParam, lParam);
CString szToolTip;
switch(message)
{
case WM_SYSCOMMAND:
if(m_boolMiniSystemBox == 1&&wParam == SC_MINIMIZE) // 当m_boolMiniSystemBox = 1的时候最小化隐藏
{
m_tnid.cbSize = sizeof(NOTIFYICONDATA);
m_tnid.hWnd = this->m_hWnd;
m_tnid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
m_tnid.uCallbackMessage = WM_USER_NOTIFYICON;
szToolTip = _T("双击显示主界面\r\n或者右键单击");
wcscpy_s(m_tnid.szTip, szToolTip);
m_tnid.uID = IDR_MAINFRAME;
m_tnid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
Shell_NotifyIcon(NIM_ADD, &m_tnid);// NIM_ADD 为加载
ShowWindow(SW_HIDE);
}
break;
}
return l;
}
LRESULT CMainDlg::onShowTask(WPARAM wParam,LPARAM lParam) //wParam接收的是图标的ID,lParam接收的是鼠标的行为
{
if(wParam!=IDR_MAINFRAME)
{
return 1;
}
switch(lParam)
{
case WM_RBUTTONUP://右键弹出菜单
{
POINT point;
CMenu menu;
CMenu* pMenu;
GetCursorPos(&point);
menu.LoadMenu(IDR_MENU1);
pMenu=menu.GetSubMenu(0);
ASSERT(pMenu!=0);
pMenu->TrackPopupMenu (0,point.x,point.y,this);
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
}
break;
case WM_LBUTTONDBLCLK://双击左键显示
{
this->ShowWindow(SW_SHOWNORMAL);
Shell_NotifyIcon(NIM_DELETE, &m_tnid);// NIM_DELETE 为删除
}
break;
}
return 0;
}
void CMainDlg::OnSysOpen()
{
this->ShowWindow(SW_SHOWNORMAL);
Shell_NotifyIcon(NIM_DELETE, &m_tnid);// NIM_DELETE 为删除
}
void CMainDlg::OnSysExit()
{
Shell_NotifyIcon(NIM_DELETE, &m_tnid);// NIM_DELETE 为删除
OnOK();
}
#define WM_USER_NOTIFYICON WM_USER+1
//
BEGIN_MESSAGE_MAP(CMainDlg, CDialog)
//
//
//
ON_MESSAGE(WM_USER_NOTIFYICON,onShowTask)
ON_COMMAND(ID_SYS_OPEN, &CMainDlg::OnSysOpen)
ON_COMMAND(ID_SYS_EXIT, &CMainDlg::OnSysExit)
END_MESSAGE_MAP()
//
LRESULT CMainDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
LONG l = CDialog::DefWindowProc(message, wParam, lParam);
CString szToolTip;
switch(message)
{
case WM_SYSCOMMAND:
if(m_boolMiniSystemBox == 1&&wParam == SC_MINIMIZE) // 当m_boolMiniSystemBox = 1的时候最小化隐藏
{
m_tnid.cbSize = sizeof(NOTIFYICONDATA);
m_tnid.hWnd = this->m_hWnd;
m_tnid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
m_tnid.uCallbackMessage = WM_USER_NOTIFYICON;
szToolTip = _T("双击显示主界面\r\n或者右键单击");
wcscpy_s(m_tnid.szTip, szToolTip);
m_tnid.uID = IDR_MAINFRAME;
m_tnid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
Shell_NotifyIcon(NIM_ADD, &m_tnid);// NIM_ADD 为加载
ShowWindow(SW_HIDE);
}
break;
}
return l;
}
LRESULT CMainDlg::onShowTask(WPARAM wParam,LPARAM lParam) //wParam接收的是图标的ID,lParam接收的是鼠标的行为
{
if(wParam!=IDR_MAINFRAME)
{
return 1;
}
switch(lParam)
{
case WM_RBUTTONUP://右键弹出菜单
{
POINT point;
CMenu menu;
CMenu* pMenu;
GetCursorPos(&point);
menu.LoadMenu(IDR_MENU1);
pMenu=menu.GetSubMenu(0);
ASSERT(pMenu!=0);
pMenu->TrackPopupMenu (0,point.x,point.y,this);
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
}
break;
case WM_LBUTTONDBLCLK://双击左键显示
{
this->ShowWindow(SW_SHOWNORMAL);
Shell_NotifyIcon(NIM_DELETE, &m_tnid);// NIM_DELETE 为删除
}
break;
}
return 0;
}
void CMainDlg::OnSysOpen()
{
this->ShowWindow(SW_SHOWNORMAL);
Shell_NotifyIcon(NIM_DELETE, &m_tnid);// NIM_DELETE 为删除
}
void CMainDlg::OnSysExit()
{
Shell_NotifyIcon(NIM_DELETE, &m_tnid);// NIM_DELETE 为删除
OnOK();
}