1.首先自定义函数
//添加任务栏托盘图标,Tray托盘
BOOL CChatRoomDlg::TrayMyIcon(BOOL bAdd)//bAdd为TRUE就添加,bAdd为FALSE就不添加。
{
BOOL bRet = FALSE;
NOTIFYICONDATA tnd;
tnd.cbSize = sizeof(NOTIFYICONDATA);
tnd.hWnd = GetSafeHwnd();//就是m_hWnd
tnd.uID = IDR_MAINFRAME;
if(bAdd == TRUE)
{
tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;//uFlags这个参数为了标识下面的哪个参数可用
tnd.uCallbackMessage = WM_TRAYICON_MSG;//NIF_MESSAGE,任务栏托盘图标在被鼠标点击时触发的消息
tnd.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));//NIF_ICON
//_tcscpy_s(tnd.szTip,sizeof(tnd.szTip),_T("聊天室v1.0"));//NIF_TIP
memcpy(tnd.szTip,_T("聊天室v1.0"),sizeof(tnd.szTip));
ShowWindow(SW_MINIMIZE);//把窗口最小化。
ShowWindow(SW_HIDE);//只是把程序窗口隐藏了。(界面的可视化设计其实就是一层窗户纸,捅破了就好了)
bRet = Shell_NotifyIcon(NIM_ADD,&tnd);//添加任务栏托盘图标
}
else
{
ShowWindow(SW_SHOWNA);//显示窗口
SetForegroundWindow();//把程序窗口设置成前景图标
bRet = Shell_NotifyIcon(NIM_DELETE,&tnd);//删除任务栏托盘图标
}
return bRet;
}
2.下面的函数是自定义的动态菜单的命令响应函数,在命令响应函数中调用TrayMyIcon();函数就可以实现点击该菜单时,程序界面消失,在任务栏托盘中显示一个图标。
//添加任务栏托盘图标
void CChatRoomDlg::OnMenuitemtray()
{
TrayMyIcon();
}
3.添加鼠标移动到任务栏托盘图标上时的自定义消息
#define WM_TRAYICON_MSG (WM_USER+100)//任务栏图标显示的消息(nd.uCallbackMessage = WM_TRAYICON_MSG;)
在消息映射中添加消息和消息响应函数的映射
ON_MESSAGE(WM_TRAYICON_MSG, OnTrayCallBackMsg)
下面是定义的是响应该消息的回调函数
//任务栏托盘图标的响应函数,鼠标只要放到任务栏托盘图标,就会触发WM_TRAYICON_MSG,消息调用这个函数
LRESULT CChatRoomDlg::OnTrayCallBackMsg(WPARAM wparam, LPARAM lparam)
{
switch(lparam)
{
case WM_RBUTTONUP://鼠标右键单击的消息
{
CMenu mMenu,*pMenu = NULL;
CPoint pt;
mMenu.LoadMenu(IDR_MENU2);
pMenu = mMenu.GetSubMenu(0);
GetCursorPos(&pt);
SetForegroundWindow();//不加这一段代码可能出现右键菜单不消失的现象
pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,pt.x,pt.y,this);
break;
}
case WM_LBUTTONDBLCLK://鼠标左键双击的消息
{
ShowWindow(SW_RESTORE);
}
SetForegroundWindow();
TrayMyIcon(FALSE);
break;
default:
break;
}
return NULL;
}
至此就可以实现程序任务栏托盘图标的显示了,可以在switch中增加其他的消息响应。