系统环境:Windows 7
软件环境:vc++6.0 SP6
本次目的:实现系统托盘、气泡提示、右键菜单的效果
系统托盘的效果,大家应该都见过,比如QQ、杀毒软件之类的都会在任务栏驻留图标。
废话少说先上几张图片看看是不是你们要的:
下面就来好好的玩下托盘吧!
1:新建一个对话框程序,这不用教了吧。
2:如果你要做气泡提示的效果的话,就要先修改SHELLAPI.h文件
主要修改后的代码如下:
typedef struct _NOTIFYICONDATAA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
#if (_WIN32_IE < 0x0500)
CHAR szTip[64];
#else
CHAR szTip[128];
#endif
#if (_WIN32_IE >= 0x0500)
DWORD dwState;
DWORD dwStateMask;
CHAR szInfo[256];
union {
UINT uTimeout;
UINT uVersion;
} DUMMYUNIONNAME;
CHAR szInfoTitle[64];
DWORD dwInfoFlags;
#endif
#if (_WIN32_IE >= 0x600)
GUID guidItem;
#endif
} NOTIFYICONDATAA, *PNOTIFYICONDATAA;
typedef struct _NOTIFYICONDATAW {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
#if (_WIN32_IE < 0x0500)
WCHAR szTip[64];
#else
WCHAR szTip[128];
#endif
#if (_WIN32_IE >= 0x0500)
DWORD dwState;
DWORD dwStateMask;
WCHAR szInfo[256];
union {
UINT uTimeout;
UINT uVersion;
} DUMMYUNIONNAME;
WCHAR szInfoTitle[64];
DWORD dwInfoFlags;
#endif
#if (_WIN32_IE >= 0x600)
GUID guidItem;
#endif
} NOTIFYICONDATAW, *PNOTIFYICONDATAW;
在对话框头文件中声明变量:NOTIFYICONDATA m_nid;再在实现文件中声明自定义消息变量:#define WM_SHOWTASK (WM_USER +1);
然后在消息映射函数里面添加一条声明消息:
afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);
3:在对话框实现文件CPP里面在BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP 之间加入
ON_MESSAGE(WM_SHOWTASK,onShowTask)
4:在对话框初始化函数中加入气泡提示代码
m_nid.cbSize=sizeof(NOTIFYICONDATA);
m_nid.hWnd=m_hWnd;
m_nid.uFlags=NIF_MESSAGE|NIF_INFO|NIF_ICON;
m_nid.uID=100;
m_nid.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_nid.dwInfoFlags=NIIF_INFO;
_tcscpy(m_nid.szInfoTitle,"托盘软件");//显示的标题信息
_tcscpy(m_nid.szInfo,"欢迎使用");//显示的内部信息
Shell_NotifyIcon(NIM_ADD,&m_nid);
5、引入菜单Menu,在资源视图中加入菜单IDR_MENU1如图:
在menu中加入三个子菜单,如图:添加后系统会自动在resource.h文件中加入定义如图:
6、为这三个子菜单添加三个响应事件。在对话框头文件中加入 afx_msg void OnShow();afx_msg void OnHide(); afx_msg void OnExit();三个函数的声明,然后在实现文件中在
BEGIN_MESSAGE_MAP(CTipDlg, CDialog)
//{{AFX_MSG_MAP(CTipDlg)和
//}}AFX_MSG_MAP
END_MESSAGE_MAP()之间加入:
ON_COMMAND(ID_SHOW, OnShow)
ON_COMMAND(ID_EXIT, OnExit)
ON_COMMAND(ID_HIDE, OnHide)
在分别实现这三个函数的代码即可:
void CTipDlg::OnShow()
{
//删除任务栏中的图标
//Shell_NotifyIcon(NIM_DELETE , &m_nid);
//显示窗口
ShowWindow(SW_SHOWNORMAL);
UpdateWindow();
}
void CTipDlg::OnHide()
{
//隐藏窗口
ShowWindow(SW_HIDE);
}
void CTipDlg::OnExit()
{
//删除任务栏中的图标
Shell_NotifyIcon(NIM_DELETE, &m_nid);
//关闭窗口
SendMessage(WM_CLOSE);
}
7、初始化NOTIFYICONDATA结构实现将鼠标放在图标上就出现提示信息。在对话框初始化中加入以下代码:
//初始化NOTIFYICONDATA结构
m_nid.cbSize = sizeof(NOTIFYICONDATA);
m_nid.hWnd = m_hWnd;
m_nid.uID = 100;
m_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
m_nid.uCallbackMessage = WM_SHOWTASK;
m_nid.hIcon = (HICON)LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, NULL);
_tcscpy(m_nid.szTip, _T("托盘软件"));
Shell_NotifyIcon(NIM_MODIFY,&m_nid);
8、最后实现监听鼠标事件函数即步骤三中的onShowTask函数。代码如下:
void CTipDlg::onShowTask(WPARAM wParam,LPARAM lParam)//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
{
// TODO: 在此添加控件通知处理程序代码
if (wParam == 100)
{
//WM_LBUTTONDBLCLK 鼠标双击消息
//WM_LBUTTONDOWN 鼠标单击消息
if ((lParam==WM_LBUTTONDOWN))
{
//删除任务栏中的图标
//Shell_NotifyIcon(NIM_DELETE, &m_nid);
//显示窗口
ShowWindow(SW_SHOWNORMAL);
UpdateWindow();
}
//WM_RBUTTONDOWN 鼠标右键事件
else if ((lParam == WM_RBUTTONDOWN))
{
//显示快捷子菜单
CMenu menu;
if (!menu.LoadMenu(IDR_MENU1))
{
return;
}
CPoint point;
GetCursorPos(&point);
SetForegroundWindow();
CMenu* pSubMenu = menu.GetSubMenu(0);
if (pSubMenu == NULL)
{//在这里出问题
return;
}
pSubMenu->TrackPopupMenu(TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
point.x, point.y, this, NULL);
PostMessage(WM_NULL, 0, 0);
}
}
}
好了,差不多就是这样,第一次写这种博客,水平有限写的不好,不过我已经上传了源代码到csdn上,可以去下。