MFC最小化到系统托盘

最小化到系统托盘图标流程:点击窗口最小化->自动隐藏任务栏图标,并在托盘图标那边自动添加->双击托盘图标可自动显示窗口->也可右键托盘图标,选择相应菜单操作。

窗口最小化处理:通过WindowProc处理SC_MINIMIZE消息,进行添加系统托盘图标。

LRESULT CshelliconDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_SYSCOMMAND:
		if (SC_MINIMIZE == wParam)
		{
			AddShellIcon(); // 添加系统托盘图标
			ModifyStyleEx(0, WS_EX_TOPMOST); // 去除任务栏图标
			ShowWindow(SW_HIDE); // 窗体隐藏
			return 0;
		}
		break;
	default:
		break;
	}

	return CDialog::WindowProc(message, wParam, lParam);
}

void CshelliconDlg::AddShellIcon()
{
	// TODO:  在此添加控件通知处理程序代码
	if (m_bAddShellIcon) return; // 标志位,用于标识是否已经添加托盘图标,防止重复操作。
	
	NOTIFYICONDATA  data;

	data.cbSize = sizeof(NOTIFYICONDATA);//结构体的大小
	data.hWnd = m_hWnd;//接收托盘消息的窗口句柄
	data.uID = IDR_MAINFRAME;//定义的托盘图标ID
	data.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;//设置属性,下面的三个属性是否有效
	data.uCallbackMessage = WM_ONTRAY;//自定义的消息,使用#define WM_ONTRAY WM_USER + 1
	data.hIcon = m_hIcon;//显示在系统托盘上的图标

	TCHAR lpszTip[] = _T("shellicon");
	lstrcpyn(data.szTip, lpszTip, sizeof(lpszTip));//图标上的提示字符串

	Shell_NotifyIcon(NIM_ADD, &data);// 向任务栏的状态栏发送添加托盘图标的消息

	m_bAddShellIcon = TRUE;
}

托盘图标点击事件响应,通过 此消息类型进行处理

data.uCallbackMessage = WM_ONTRAY;
LRESULT DealMsg(WPARAM wParam, LPARAM lParam);
ON_MESSAGE(WM_ONTRAY, DealMsg)

	UINT uMouseMsg = (UINT)lParam;
	if (WM_LBUTTONDBLCLK == uMouseMsg)
	{
		ShowWindow(SW_SHOWNOACTIVATE);
	}
	else if (WM_RBUTTONDOWN == uMouseMsg)
	{
		CMenu menu;
		VERIFY(menu.LoadMenu(IDR_MENU1));
		CMenu* pPopup = menu.GetSubMenu(0);
		ASSERT(pPopup != NULL);
		CPoint point;
		GetCursorPos(&point);
		// 加挂右键菜单
		int iCmd = pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RETURNCMD, point.x, point.y, this);
		switch (iCmd)
		{
		case ID_SHOW:
			ShowWindow(SW_SHOWNOACTIVATE);
			break;
		case ID_HIDE:
			CloseWindow();
			ShowWindow(SW_HIDE);
			break;
		case ID_CLOSE:
			SendMessage(WM_CLOSE);
			break;
		default:
			break;
		}
	}

	return 0;

窗口关闭退出,自动删除系统托盘图标。(注:如果不进行删除,则图标会被缓存,直到鼠标移动到此图标才会自动消失)

void CshelliconDlg::OnClose()
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	NOTIFYICONDATA data;
	data.cbSize = sizeof(NOTIFYICONDATA);
	data.hWnd = m_hWnd;
	data.uID = IDR_MAINFRAME;

	Shell_NotifyIcon(NIM_DELETE, &data);

	CDialogEx::OnClose();
}

至此,最小化到系统托盘图标功能全部完善。 @_@

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值