参考:http://blog.csdn.net/csf111/article/details/6980508
我的目的是:sdi或mdi程序实现最小化到托盘。
开发工具vs2010,由于代码比较少,就不上传工程了,不过我会详细叙述怎么做,希望能帮到别人。
过程:
1、新建一个mdi工程。
2、自定义消息#define WM_TO_TRAY_MSG (WM_USER + 2)//最小化到托盘 ,为了方便,这个放在CMainframe头文件。
3、初始化,此函数在OnCreate中调用。
void CMainFrame::RegisterNotify()
{
m_notifyIcon.cbSize=sizeof NOTIFYICONDATA;
m_notifyIcon.hWnd=this->m_hWnd;
m_notifyIcon.uID=IDR_MAINFRAME;
m_notifyIcon.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(m_notifyIcon.szTip,"托盘图标");
m_notifyIcon.uCallbackMessage = WM_TO_TRAY_MSG;
m_notifyIcon.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP; //OK,下面就是托盘产生了.
Shell_NotifyIcon(NIM_ADD,&m_notifyIcon);
}
4、在CMainframe类中重载WindowProc函数。方法:在类视图中找到CMainframe类,单击,在属性窗口中选择“重写”图标,找到函数WindowProc,添加即可。
LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类
switch(message) //判断消息类型
{
case WM_TO_TRAY_MSG:
//如果是用户定义的消息
if(lParam==WM_LBUTTONDBLCLK)
{
//鼠标双击时主窗口出现
if(this->IsWindowVisible()) //判断窗口当前状态
{
this->ShowWindow(SW_HIDE); //隐藏窗口
}
else
{
this->ShowWindow(SW_SHOW); //显示窗口
}
}
else if(lParam==WM_RBUTTONDOWN)
{ //鼠标右键单击弹出选单
CMenu menu;
menu.LoadMenu(IDR_MENU_TRAY); //载入事先定义的选单
CMenu *pMenu=menu.GetSubMenu(0);
CPoint pos;
GetCursorPos(&pos);
pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,this);
}
break;
case WM_SYSCOMMAND:
//如果是系统消息
if(wParam==SC_MINIMIZE)
{
//接收到最小化消息时主窗口隐藏
// this->ShowWindow(SW_HIDE);
// return 0;
}
if(wParam==SC_CLOSE)
{
// ::Shell_NotifyIcon(NIM_DELETE,&m_notifyIcon); //关闭时删除系统托盘图标
this->ShowWindow(SW_HIDE);
}
break;
}
return CMDIFrameWndEx::WindowProc(message, wParam, lParam);
}
5、IDR_MENU_TRAY是菜单ID。菜单项,ID_MENU_SHOW_WIN,显示窗口;ID_MENU_CLOSE_APP,关闭程序。
对应的事件处理程序是:
void CMainFrame::OnMenuShowWin()
{
// TODO: 在此添加命令处理程序代码
this->ShowWindow(SW_SHOW);
}
void CMainFrame::OnMenuCloseApp()
{
// TODO: 在此添加命令处理程序代码
::Shell_NotifyIcon(NIM_DELETE,&m_notifyIcon); //关闭时删除系统托盘图标
CMDIFrameWndEx::OnClose();
}