在VC中使用托盘机制,在系统托盘中显示一个图标,用户在图标单击右键时,显示一个简单的菜单。
1,新建一个简单的对话框工程;
2,建立一个菜单,ID命名为IDR_MENUPOP;
3,在对话框类源文件中定义一个托盘响应消息和一个托盘结构变量:
#define WM_SHOWTASK (WM_USER+101) //自定义托盘响应消息
NOTIFYICONDATA struct_Nid; //托盘结构变量
4,在对话框头文件的消息映射函数定义托盘响应消息函数:
afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);
5,在对话框源文件消息映射部分,将托盘处理函数和消息相关联:
ON_MESSAGE(WM_SHOWTASK,onShowTask)
6,托盘响应函数
//托盘响应
LRESULT CATSTServerDlg::onShowTask(WPARAM wParam,LPARAM lParam)
{
switch(lParam)
{
case WM_RBUTTONUP:
{
CMenu menu;
if(!menu.LoadMenu(IDR_MENUPOP)) break;
CMenu* pSubMenu = menu.GetSubMenu(0);
if(!pSubMenu) break;
CPoint pos;
GetCursorPos(&pos);
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,pos.x,pos.y, this, NULL);
menu.DestroyMenu();
}
break;
case WM_LBUTTONDBLCLK:
{
//ShowWindow(SW_SHOW);
}
break;
}
return 0;
}
7,在对话框初始函数中加入对托盘的初始化处理
//向托盘添加图标
struct_Nid.cbSize = sizeof(struct_Nid);
struct_Nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
struct_Nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
strcpy(struct_Nid.szTip,"通讯服务程序");
struct_Nid.uCallbackMessage = WM_SHOWTASK;
struct_Nid.uID = 10;
struct_Nid.hWnd =m_hWnd;
Shell_NotifyIcon(NIM_ADD, &struct_Nid);
8,系统退出时删除托盘图标
//退出时删除托盘图标
Shell_NotifyIcon(NIM_DELETE,&struct_Nid);