1.定义自定义消息ID(可在StdAfx.h或主窗体的类型声明文件中):
#define
WM_USER_NOTIFYICON WM_USER + 0x100
2.在主窗体的类型声明文件(如:MainFrame.h)加入NOTIFYICONDATA类型成员变量:
NOTIFYICONDATA m_nid;
3.在主窗体中处理WM_CREATE消息:
int
CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == - 1 )
return - 1 ;
m_nid.cbSize = sizeof (NOTIFYICONDATA);
m_nid.hWnd = this -> m_hWnd;
m_nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; // 标志位
m_nid.uCallbackMessage = WM_USER_NOTIFYICON; // 自定义消息
m_nid.uID = IDR_MAINFRAME; // 资源ID
CString szToolTip = _T( " ToolTip " );
_tcscpy(m_nid.szTip, szToolTip); // 提示信息
HICON hIcon;
hIcon = AfxGetApp() -> LoadIcon(IDR_MAINFRAME); // 图标
m_nid.hIcon = hIcon;
::Shell_NotifyIcon(NIM_ADD, & m_nid);
if (hIcon)
::DestroyIcon(hIcon);
return 0 ;
}
{
if (CWnd::OnCreate(lpCreateStruct) == - 1 )
return - 1 ;
m_nid.cbSize = sizeof (NOTIFYICONDATA);
m_nid.hWnd = this -> m_hWnd;
m_nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; // 标志位
m_nid.uCallbackMessage = WM_USER_NOTIFYICON; // 自定义消息
m_nid.uID = IDR_MAINFRAME; // 资源ID
CString szToolTip = _T( " ToolTip " );
_tcscpy(m_nid.szTip, szToolTip); // 提示信息
HICON hIcon;
hIcon = AfxGetApp() -> LoadIcon(IDR_MAINFRAME); // 图标
m_nid.hIcon = hIcon;
::Shell_NotifyIcon(NIM_ADD, & m_nid);
if (hIcon)
::DestroyIcon(hIcon);
return 0 ;
}
4.重载WindowProc虚函数:
LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_USER_NOTIFYICON: // 自定义消息
if (lParam == WM_LBUTTONDBLCLK) // 鼠标双击时出现主窗口
{
ShowWindow(SW_HIDE);
}
else if (lParam == WM_RBUTTONDOWN) // 鼠标右键单击时弹出菜单
{
CMenu menu;
menu.LoadMenu(IDR_TRAY); // 载入菜单
CMenu * pMenu = menu.GetSubMenu( 0 );
CPoint pos;
GetCursorPos( & pos);
pMenu -> TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pos.x, pos.y,
AfxGetMainWnd());
}
break ;
case WM_SYSCOMMAND:
if (wParam == SC_MINIMIZE) // 最小化时隐藏主窗体
{
ShowWindow(SW_HIDE);
return 0 ;
}
break ;
}
return CWnd::WindowProc(message, wParam, lParam);
}
{
switch (message)
{
case WM_USER_NOTIFYICON: // 自定义消息
if (lParam == WM_LBUTTONDBLCLK) // 鼠标双击时出现主窗口
{
ShowWindow(SW_HIDE);
}
else if (lParam == WM_RBUTTONDOWN) // 鼠标右键单击时弹出菜单
{
CMenu menu;
menu.LoadMenu(IDR_TRAY); // 载入菜单
CMenu * pMenu = menu.GetSubMenu( 0 );
CPoint pos;
GetCursorPos( & pos);
pMenu -> TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pos.x, pos.y,
AfxGetMainWnd());
}
break ;
case WM_SYSCOMMAND:
if (wParam == SC_MINIMIZE) // 最小化时隐藏主窗体
{
ShowWindow(SW_HIDE);
return 0 ;
}
break ;
}
return CWnd::WindowProc(message, wParam, lParam);
}
5.在主窗体中处理WM_DESTORY消息:
void
CMainFrame::OnDestroy()
{
CWnd::OnDestroy();
::Shell_NotifyIcon(NIM_DELETE, & m_nid);
}
{
CWnd::OnDestroy();
::Shell_NotifyIcon(NIM_DELETE, & m_nid);
}