程序最小化到托盘
一、说明 部分
1、所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分。在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。
2、SDK API函数 Shell_NotifyIcon 详细参数说明查看MSDN
BOOL Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA lpdata
);
该函数的作用:
Sends a message to the taskbar's status area. 发送消息到任务栏的状态区域
3、相关结构体,NOTIFYICONDATA
typedef struct _NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
TCHAR szTip[64];
DWORD dwState;
DWORD dwStateMask;
TCHAR szInfo[256];
union {
UINT uTimeout;
UINT uVersion;
};
TCHAR szInfoTitle[64];
DWORD dwInfoFlags;
GUID guidItem;
HICON hBalloonIcon;
} NOTIFYICONDATA, *PNOTIFYICONDATA;
二、使用部分
最小化:将窗口隐藏,在托盘区增加一个图标
步骤:
1、定义 NOTIFYICONDATA 变量
2、在需要最小化的地方 初始这个变量
其中一个参数 uCallbackMessage 需要定义一个消息
3、自定义消息、在消息中响应对托盘的处理
4、(可选) 程序关闭后,清除托盘图标
重载 DestroyWindow 函数
四、代码示例:
1、定义
NOTIFYICONDATA m_notify;
2、初始
m_notify.cbSize = sizeof(NOTIFYICONDATA);
m_notify.hWnd = this->m_hWnd;
m_notify.uID = IDR_MAINFRAME;
m_notify.hIcon = ::LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(m_notify.szTip,"Just Test");
m_notify.uCallbackMessage = WM_USER_NOTIFYICON;
m_notify.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
Shell_NotifyIcon(NIM_ADD,&m_notify);
3、定义消息
#define WM_USER_NOTIFYICON WM_USER+1
LRESULT XXXX::OnNotifyMsg( WPARAM wParam,LPARAM lParam )
{ //wParam接收的是图标的ID,而lParam接收的是鼠标的行为
if(wParam != IDR_MAINFRAME)
return 1;
switch(lParam)
{
case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”
{
LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);//得到鼠标位置
CMenu menu;
menu.CreatePopupMenu();//声明一个弹出式菜单
menu.AppendMenu(MF_STRING,WM_DESTROY,"关闭");
//确定弹出式菜单的位置
menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
//资源回收
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
delete lpoint;
}
break;
case WM_LBUTTONDBLCLK://双击左键的处理
{
this->ShowWindow(SW_SHOW);//简单的显示主窗口
}
break;
}
return 0;
}
处理消息的另外一种方式 重载 WindowProc 函数 来处理这个消息
LRESULT XXXX::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
switch(message)
{ // 处理消息
case WM_USER_NOTIFYICON:
if(lParam==WM_LBUTTONDBLCLK)
{
//鼠标双击时主窗口出现
if(AfxGetApp()->m_pMainWnd->IsWindowVisible()) //判断窗口当前状态
{
AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE); //隐藏窗口
}
else
{
AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW); //显示窗口
}
}
else if(lParam==WM_RBUTTONDOWN)
{ //鼠标右键单击弹出选单
CMenu menu;
menu.LoadMenu(IDR_MENU1); //载入事先定义的选单
CMenu *pMenu=menu.GetSubMenu(0);
CPoint pos;
GetCursorPos(&pos);
pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());
}
break;
case WM_SYSCOMMAND: // 系统消息
if(wParam==SC_MINIMIZE)
{
AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);
return 0;
}
if (wParam==SC_CLOSE)
{
::Shell_NotifyIcon(NIM_DELETE,&m_notify);
}
break;
}
return CDialog::WindowProc(message, wParam, lParam);
}
清除图标
BOOL XXXX::DestroyWindow()
{
// 清除托盘图标
Shell_NotifyIcon(NIM_DELETE,&m_NotifyIcon);
return CDialog::DestroyWindow();
}
为什么在DestroyWindow中清除:本人前面关于程序退出有说明点击打开链接
http://blog.csdn.net/whh_tg/article/details/8467954