托盘程序开发

托盘程序

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();
}

原文地址:https://www.cnblogs.com/17bdw/p/10354679.html