标签:
为程序添加系统托盘
1:创建菜单资源 ID: IDR_MENU_NOTIFY
2:添加子菜单
显示 IDM_NOTIFY_SHOW
退出 IDM_NOTIFY_CLOSE
3:查看MSDN Shell_NotifyIcon
BOOL Shell_NotifyIcon( //向系统托盘中加入图标
DWORD dwMessage, //状态
PNOTIFYICONDATA lpdata //含有图标 消息响应 的一个结构体);
4:认识NOTIFYICONDATA 结构体:
typedef struct _NOTIFYICONDATA {
DWORD cbSize; //结构体自身大小 这里一定要进行初始化
HWND hWnd; //托盘的父窗口 托盘发出的消息由哪一个窗口响应
UINT uID; //显示图标的ID
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;
5:定义上述结构变量为类的成员变量 并在OnInitDialog函数中进行初始化添加代码
nid.cbSize = sizeof(NOTIFYICONDATA); //大小赋值
nid.hWnd = m_hWnd; //父窗口 是被定义在父类CWnd类中
nid.uID = IDR_MAINFRAME; //icon ID
nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; //托盘所拥有的状态
nid.uCallbackMessage = UM_ICONNOTIFY; //回调消息
nid.hIcon = m_hIcon; //icon 变量
CString str="Remote远程协助软件........."; //气泡提示
lstrcpyn(nid.szTip, (LPCSTR)str, sizeof(nid.szTip) / sizeof(nid.szTip[0]));
Shell_NotifyIcon(NIM_ADD, &nid); //显示托盘
6:声明自定义的回调消息:
UM_ICONNOTIFY 在Stdafx.h中添加 这里也使用枚举因为我们在工程的后期会有很多的自定义消息
如下:enum
{
UM_ICONNOTIFY=WM_USER+1
};
7:声明消息处理函数:
afx_msg void OnIconNotify(WPARAM wParam,LPARAM lParam); ---->这里很重要
8:添加消息响应:
ON_MESSAGE(UM_ICONNOTIFY, (LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM))OnIconNotify) 注:vc里面不需要(LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM))
9:实现消息响应函数
void CRemoteDlg::OnIconNotify(WPARAM wParam, LPARAM lParam)
{
switch ((UINT)lParam)
{
case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
if (!IsWindowVisible())
ShowWindow(SW_SHOW);
else
ShowWindow(SW_HIDE);
break;
case WM_RBUTTONDOWN:
CMenu menu;
menu.LoadMenu(IDR_MENU_NOTIFY);
CPoint point;
GetCursorPos(&point);
SetForegroundWindow(); //设置当前窗口
menu.GetSubMenu(0)->TrackPopupMenu(
TPM_LEFTBUTTON|TPM_RIGHTBUTTON,
point.x, point.y, this, NULL);
PostMessage(WM_USER, 0, 0);
break;
}
}
10:添加我们系统托盘的菜单响应函数 注意类的名称。
void CRemoteDlg::OnNotifyShow() ID_NOTIFY_SHOW
{
// TODO: 在此添加命令处理程序代码
ShowWindow(SW_SHOW);
}
11:void CRemoteDlg::OnNotifyClose() ID_NOTIFY_EXIT
{
// TODO: 在此添加命令处理程序代码
PostMessage(WM_CLOSE);
}
12:编译运行。我们发现系统的托盘图标不能迅速销毁
解决方案:
添加一个系统托盘的消息
afx_msg void OnClose();
ON_WM_CLOSE()
void CRemoteDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
Shell_NotifyIcon(NIM_DELETE, &nid);
CDialogEx::OnClose();
}
到此我们的托盘的大概设置就完毕了。
标签:
原文地址:http://www.cnblogs.com/zhaowan/p/4597354.html