码迷,mamicode.com
首页 > 其他好文 > 详细

系统托盘

时间:2015-06-24 12:37:08      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

为程序添加系统托盘
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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!