系统托盘图标

对话框

资源里面添加右键菜单资源

// 头文件添加
CMenu m_menu;
NOTIFYICONDATA m_notifyData;
LRESULT OnTrayNotify(WPARAM wParam, LPARAM lParam);
void CvideoHelperDlg::OnTraymenuRestore();
void CvideoHelperDlg::OnTraymenuExit();
void CvideoHelperDlg::OnTraymenuStartService();
void CvideoHelperDlg::OnTraymenuStopService();

// 源文件添加
#define WM_TRAY_MESSAGE (WM_APP + 100)

ON_MESSAGE(WM_TRAY_MESSAGE, OnTrayNotify)
ON_COMMAND(ID_RMENU_SHOWWINDOW, &CvideoHelperDlg::OnTraymenuRestore)
ON_COMMAND(ID_RMENU_EXIT, &CvideoHelperDlg::OnTraymenuExit)
ON_COMMAND(ID_RMENU_STARTSERVICE, &CvideoHelperDlg::OnTraymenuStartService)
ON_COMMAND(ID_RMENU_STOPSERVICE, &CvideoHelperDlg::OnTraymenuStopService)

void CvideoHelperDlg::OnTraymenuRestore()
{
ShowWindow(SW_SHOW);
ShowWindow(SW_RESTORE);
Shell_NotifyIcon(NIM_DELETE, &m_notifyData);
}

void CvideoHelperDlg::OnTraymenuExit()
{
Shell_NotifyIcon(NIM_DELETE, &m_notifyData);
clean4quit();
OnOK();
}

LRESULT CvideoHelperDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
switch ((UINT)lParam)
{
case WM_LBUTTONUP:
OnTraymenuRestore();
break;
case WM_RBUTTONUP:
case WM_CONTEXTMENU:
CPoint pt;
GetCursorPos(&pt);
SetForegroundWindow();//for pop up menu but not click
//m_menu is the member of CTrayMinDlg as CMenu m_menu;
m_menu.GetSubMenu(0)->TrackPopupMenu(TPM_BOTTOMALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, pt.x, pt.y, this);
break;
}
return 0;
}

OnInitDialog
m_menu.LoadMenu(IDR_MENU_TRAY);
//m_bMinimized = FALSE;
ZeroMemory(&m_notifyData, sizeof(NOTIFYICONDATA));
m_notifyData.cbSize = sizeof(NOTIFYICONDATA);
m_notifyData.hWnd = this->m_hWnd;
m_notifyData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
m_notifyData.uID = IDR_MAINFRAME;
m_notifyData.uCallbackMessage = WM_TRAY_MESSAGE;
m_notifyData.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
_tcscpy_s(&m_notifyData.szTip[0], 128, TEXT("服务器程序"));

// 最小化窗口
PostMessage(WM_SYSCOMMAND, SC_MINIMIZE);

void CvideoHelperDlg::OnDestroy()
{
CDialogEx::OnDestroy();
Shell_NotifyIcon(NIM_DELETE, &m_notifyData);
}

void CvideoHelperDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);

//minimized to system tray && (FALSE == m_bMinimized)
if (nType == SIZE_MINIMIZED)
{
if (FALSE == Shell_NotifyIcon(NIM_ADD, &m_notifyData))
{
MessageBox(TEXT("Unable to set tray icon"), TEXT("Error"));
return;
}
ShowWindow(SW_HIDE);
}
}