本文以实例代码的形式讲述了在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( );
经测试可行!非常感谢! |
|