托盘程序
OninitDialog()
在主界面的OninitDialog()函数里添加代码
BOOL CMFC07trayiconDlg::OnInitDialog()
{
// TODO: 在此添加额外的初始化代码
NOTIFYICONDATA m_tnid;
m_tnid.cbSize = sizeof(NOTIFYICONDATA);//设置结构大小//
m_tnid.hWnd = this->m_hWnd;//设置图标对应的窗口
m_tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;//图标属性
m_tnid.uCallbackMessage = WM_ICON_NOTIFY;//应用程序定义的回调消息ID
CString szToolTip;
szToolTip = _T("INeed 客户端程序");
_tcscpy_s(m_tnid.szTip, szToolTip);//帮助信息
m_tnid.uID = IDR_MAINFRAME;//应用程序图标
m_tnid.hIcon = m_hIcon;//图标句柄
PNOTIFYICONDATA m_ptnid = &m_tnid;
::Shell_NotifyIcon(NIM_ADD, m_ptnid);//增加图标到系统盘
}
定义一个自定义的消息。代码放在主界面【.CPP】文件顶部。
#define WM_ICON_NOTIFY WM_USER+100
关闭程序后自动关闭托盘
在主界面对话框中的【属性】-【消息】选项卡里的【WM_CLOSE】添加一OnClose()函数,在程序关闭后,关闭托盘。
void CMFC07trayiconDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
NOTIFYICONDATA nd = { 0 };
nd.cbSize = sizeof(NOTIFYICONDATA);
nd.hWnd = m_hWnd;
nd.uID = IDR_MAINFRAME;
nd.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nd.uCallbackMessage = WM_ICON_NOTIFY;
nd.hIcon = m_hIcon;
Shell_NotifyIcon(NIM_DELETE, &nd);
CDialogEx::OnClose();
}
托盘最小化支持
在【属性】-【Minimize Box】设置为【True】。设置为支持最小化按钮。
在OnSyscommand()函数里,在最后的位置加入
if(nID == SC_MINIMIZE)
{
ShowWindow(FALSE); //隐藏窗口
}
OnSysCommand()代码。
void CMFC07trayiconDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
if (nID == SC_MINIMIZE)
{
ShowWindow(FALSE); //隐藏窗口
}
}
定义消息,托盘菜单实现
在MFC主界面的CPP文件代码里找到【BEGIN_MESSAGE_MAP(CMFC07trayiconDlg, CDialogEx)】这个宏,往里面添加【ON_MESSAGE(WM_ICON_NOTIFY, OnTrayNotification)】,实现之前自定义消息的宏。
BEGIN_MESSAGE_MAP(CMFC07trayiconDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CLOSE()
ON_MESSAGE(WM_ICON_NOTIFY, OnTrayNotification) // 添加的代码
END_MESSAGE_MAP()
在主界面的【.h】文件里声明函数OnTrayNotification()
LRESULT OnTrayNotification(WPARAM wParam, LPARAM lParam);
定义代码:
响应鼠标的左键和右键消息。
LRESULT CMFC07trayiconDlg::OnTrayNotification(WPARAM wParam, LPARAM lParam)
{
switch (lParam)
{
case WM_LBUTTONDOWN:
{
AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
SetForegroundWindow();
break;
}
case WM_RBUTTONUP:
{
POINT point;
HMENU hMenu, hSubMenu;
GetCursorPos(&point); //鼠标位置
hMenu = LoadMenu(NULL,
MAKEINTRESOURCE(IDR_MENU_TRAY)); // 加载菜单
hSubMenu = GetSubMenu(hMenu, 0);//得到子菜单(因为弹出式菜单是子菜单)
SetForegroundWindow(); // 激活窗口并置前
TrackPopupMenu(hSubMenu, 0,
point.x, point.y, 0, m_hWnd, NULL);
}
}
return LRESULT();
}
IDR_MENU_TRAY是加载了一个菜单,所以要自己自定义【恢复 ID_TRAY_RESTORE】、【退出 ID_TRAY_EXIT】
【恢复 ID_TRAY_RESTORE】,OnTrayRestore()
void CmyfirstmfcDlg::OnTrayRestore()
{
AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
SetForegroundWindow();
}
【退出 ID_TRAY_EXIT】,OnTrayExit()
void CMFC07trayiconDlg::OnTrayExit()
{
// TODO: 在此添加命令处理程序代码
OnClose();
}