1 在你的主对话框头文件中添加一个NOTIFYICONDATA结构
NOTIFYICONDATA NotfityData;
当然你也可以把它定义为一个全局变量。
2 在主对话框的初始化中对其进行赋值,赋值过程如下
NotfityData.cbSize = sizeof(NOTIFYICONDATA);
NotfityData.hIcon = AfxGetApp()->LoadIcon(IDI_ICON_TEST);
NotfityData.hWnd = this->m_hWnd;
lstrcpyn(NotfityData.szTip,TEXT("MY TRAY"),sizeof(NotfityData.szTip));
NotfityData.uCallbackMessage = WM_NC;
NotfityData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
Shell_NotifyIcon(NIM_ADD, &NotfityData);
其中hicon是要显示的小图标,如果用应用程序自己默认图标,就选IDR_MAINFRAM;
sztip是鼠标移到托盘上时显示的数字,自己随便写都可以,这里我们用MY TRAY代替;
uCallbackMessage是个很重要的字段,指定为一个自定义的消息,托盘的相关消息将通过这个发出;也就是首先自定一个消息,这里是WM_NC。(自定义消息就是在文件的头部#define WM_NC WM_USER+120)
Shell_NotifyIcon是设置托盘类型,这里设为NIM_ADD,就是添加托盘了。
3.在程序结束时,比如添加对话框的OnClose()响应,在其中将托盘关闭:
Shell_NotifyIcon(NIM_DELETE, &NotfityData);
到这里其实就可以显示托盘了,但是为了让托盘能够合理工作,还需要继续做下去哦。
4.在程序中添加WM_NC也就是我们设定的与托盘相关的自定义消息的响应函数。
主要有三步:首先在头文件中添加申明:afx_msg LRESULT OnTrayNotification(WPARAM wparam, LPARAM lparam);
其次在消息映射表中添加映射关联:ON_MESSAGE(WM_NC,OnTrayNotification)
最后实现该响应函数:
LRESULT CTrayIconTestDlg::OnTrayNotification(WPARAM wParam, LPARAM IParam)
{
switch (IParam )
{
case WM_RBUTTONUP:
{
CPoint pt;
GetCursorPos(&pt);
CMenu menu;
menu.LoadMenu(IDR_MENU_TRAY);
CMenu *pMenu = menu.GetSubMenu(0);
pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,pt.x,pt.y,this);
menu.DestroyMenu();
}
break;
case WM_LBUTTONDOWN:
{
ShowWindow(SW_SHOW);
}
}
return 0;
}
可以随便实现自己想要的消息,这里我们实现了左键摁下和右键弹起的消息,左键摁下我们会SHOW窗口,右键弹起时会显示一个菜单。嫌麻烦就只获取左键摁下也行。
5.如果实现了上述的右键弹出菜单的话,我们一般在菜单上含有一个exit的菜单项,我们添加该菜单项的COMMAND消息如下:
void CTrayIconTestDlg::OncomRang()
{
SendMessage(WM_CLOSE);
// TODO: Add your command handler code here
}
这样,当我们右键点击托盘,弹出含有exit项的菜单,点击exit,程序也可以退出了。到这里,托盘应用程序就实现了,如果还不清楚,我发了源码,可以去下载。