1、在头文件中自定义消息:#define WM_SHOWTASK WM_USER+1以及声明消息响应函数: afx_msg LRESULT onShowTask(WPARAM wParam, LPARAM lParam);
声明一个结构体变量:NOTIFYICONDATA nid;
2、在cpp文件消息映射中添加: ON_MESSAGE(WM_SHOWTASK , onShowTask)
3、最小化到托盘函数:
- void CVS2010_SerialPortDlg::OnBnClickedButton2()
- {
- nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
- nid.hWnd=this->m_hWnd;
- nid.uID=IDR_MAINFRAME; //通过多次调用,你可以使用不同的uID将多个图标关联到一个窗口hWnd,例如QQ修改登录状态时,图标也会变
- nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; //此成员表明具体哪些其他成员为合法数据(即哪些成员起作用)
- nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称
- //应用程序定义的消息标示。当托盘图标区域发生鼠标事件或者使用键盘选择或激活图标时,
- //系统将使用此标示向由hWnd成员标示的窗口发送消息。消息响应函数的wParam参数标示了
- //消息事件发生的任务栏图标,lParam参数根据事件的不同,包含了鼠标或键盘的具体消息,
- //例如当鼠标指针移过托盘图标时,lParam将为WM_MOUSEMOVE。
- nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); //图标的句柄
- strcpy(nid.szTip,”VS2010_SerialPortDlg”); //信息提示条
- Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标
- ShowWindow(SW_HIDE); //隐藏主窗口,像QQ一登录就会有托盘和主界面同时存在,这样的话不需要隐藏主界面
- }
void CVS2010_SerialPortDlg::OnBnClickedButton2()
{
nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
nid.hWnd=this->m_hWnd;
nid.uID=IDR_MAINFRAME; //通过多次调用,你可以使用不同的uID将多个图标关联到一个窗口hWnd,例如QQ修改登录状态时,图标也会变
nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; //此成员表明具体哪些其他成员为合法数据(即哪些成员起作用)
nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称
//应用程序定义的消息标示。当托盘图标区域发生鼠标事件或者使用键盘选择或激活图标时,
//系统将使用此标示向由hWnd成员标示的窗口发送消息。消息响应函数的wParam参数标示了
//消息事件发生的任务栏图标,lParam参数根据事件的不同,包含了鼠标或键盘的具体消息,
//例如当鼠标指针移过托盘图标时,lParam将为WM_MOUSEMOVE。
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); //图标的句柄
strcpy(nid.szTip,"VS2010_SerialPortDlg"); //信息提示条
Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标
ShowWindow(SW_HIDE); //隐藏主窗口,像QQ一登录就会有托盘和主界面同时存在,这样的话不需要隐藏主界面
}
4、消息响应函数onShowTask原型:
- LRESULT CVS2010_SerialPortDlg::onShowTask(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();//声明一个弹出式菜单
- //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已
- //隐藏),将程序结束。
- menu.AppendMenu(MF_STRING,WM_DESTROY,”关闭”);
- menu.AppendMenu(MF_STRING,WM_RESHOW,”打开”);//自己定义的命令,需要手动添加命令响应函数
- //确定弹出式菜单的位置
- menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
- //资源回收
- HMENU hmenu=menu.Detach();
- menu.DestroyMenu();
- delete lpoint;
- }
- break;
- case WM_LBUTTONUP://左键起来时打开界面
- {
- ShowWindow(SW_SHOW);//显示主窗口
- //DeleteTray();//删除托盘
- }
- break;
- case WM_LBUTTONDBLCLK://左键双击,添加相应的功能
- break;
- }
- return 0;
- }
LRESULT CVS2010_SerialPortDlg::onShowTask(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();//声明一个弹出式菜单
//增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已
//隐藏),将程序结束。
menu.AppendMenu(MF_STRING,WM_DESTROY,"关闭");
menu.AppendMenu(MF_STRING,WM_RESHOW,"打开");//自己定义的命令,需要手动添加命令响应函数
//确定弹出式菜单的位置
menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
//资源回收
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
delete lpoint;
}
break;
case WM_LBUTTONUP://左键起来时打开界面
{
ShowWindow(SW_SHOW);//显示主窗口
//DeleteTray();//删除托盘
}
break;
case WM_LBUTTONDBLCLK://左键双击,添加相应的功能
break;
}
return 0;
}
5、删除托盘函数:
void CVS2010_SerialPortDlg::DeleteTray()
{
Shell_NotifyIcon(NIM_DELETE, &nid); //在托盘区删除图标
}
6、RESHOW命令响应函数:
void CVS2010_SerialPortDlg::OnReshow(){
ShowWindow(SW_SHOW);
//DeleteTray();
}