VC实现系统托盘图标
描述:
本文以实例代码的形式讲述了在VC中系统托盘图标的实现。
技术实现:
在VC中实现系统托盘图标主要用到一个Shell_NotifyIcon系统API。在本文中我们以对话框程序为例子实现系统托盘图标,步骤如下:
1. 在StdAfx.h中定义消息ID,如:
#define MYWM_NOTIFYICON WM_USER+1
2. 定义一个全局NOTIFYICONDATA变量,如:
NOTIFYICONDATA g_nd;
3. 实现添加系统托盘图标函数,如:
void CZTXClientDlg::AddSystrayIcon()
{
// 将图标放入系统托盘
g_nd.cbSize = sizeof (NOTIFYICONDATA);
g_nd.hWnd = m_hWnd;
g_nd.uID = IDR_MAINFRAME;
g_nd.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
g_nd.uCallbackMessage= MYWM_NOTIFYICON;
g_nd.hIcon = m_hIcon;
strcpy(g_nd.szTip, "知天下娱乐中心[V1.1]");
Shell_NotifyIcon(NIM_ADD, &g_nd);
}
4. 实现删除系统托盘图标函数,如:
void CZTXClientDlg::DelSystrayIcon()
{
Shell_NotifyIcon(NIM_DELETE, &g_nd);
}
5. 重载WindowProc函数,如:
LRESULT CZTXClientDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
switch( message )
{
case MYWM_NOTIFYICON:
if(lParam==WM_LBUTTONDBLCLK)
{
AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);
}else if(lParam==WM_RBUTTONDOWN)
{
CMenu menu;
//载入事先定义的选单
menu.LoadMenu(IDR_TRADEMEMU);
CMenu*pMenu=menu.GetSubMenu(0);
CPoint pos;
GetCursorPos(&pos);
//加入SetForegroundWindow的目的为使用户点菜单之外时菜单可以消失
::SetForegroundWindow(m_hWnd);
pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());
}
break;
}
return CDialog::WindowProc(message, wParam, lParam);
}
6. OK,现在在我们的OnInitDialog函数中加入如下代码:
AddSystrayIcon( );
7. 在窗口关闭函数中加入如下代码:
DelSystrayIcon( );
经测试可行!非常感谢!