MFC隐藏任务栏图标并显示到托盘

MFC隐藏任务栏图标并显示到托盘

参考链接:https://blog.csdn.net/vipzjh/article/details/52211407

在对话框头文件中定义消息ID (用于处理点击托盘图标) :

#define WM_SHOWTASK WM_USER+666

对话框头文件添加成员声明:

protected:
//start----------------------图标显示至托盘--------------------------------
	NOTIFYICONDATA m_nid;
	void ToTray();
	afx_msg LRESULT onShowTask(WPARAM wParam, LPARAM lParam);
//end-----------------------图标显示至托盘--------------------------------

对话框CPP添加自定义消息绑定:

BEGIN_MESSAGE_MAP(CUserDlg,CDialog)
	//......................
	ON_MESSAGE(WM_SHOWTASK,onShowTask)
END_MESSAGE_MAP()

对话框CPP文件实现ToTray:

void CLaserMarkingManagerDlg::ToTray()
{
	m_nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
	m_nid.hWnd = this->m_hWnd;
	m_nid.uID = IDR_MAINFRAME;
	m_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
	m_nid.uCallbackMessage = WM_SHOWTASK;

	//自定义的消息名称 WM_SHOWTASK 头函数中定义为WM_USER+1
	m_nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
	strcpy(m_nid.szTip, "托盘图标");//当鼠标放在上面时,所显示的内容
	Shell_NotifyIcon(NIM_ADD, &m_nid);//在托盘区添加图标
}

对话框CPP文件实现onShowTask:

LRESULT CLaserMarkingManagerDlg::onShowTask(WPARAM wParam, LPARAM lParam)
{
	if (wParam != IDR_MAINFRAME)
		return 1;
	switch (lParam)
	{
	case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”
	{
		LPPOINT lpoint = new tagPOINT;
		::GetCursorPos(lpoint);//得到鼠标位置
		CMenu menu;
		menu.CreatePopupMenu();//声明一个弹出式菜单
		//增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已
		//隐藏),将程序结束。
		menu.AppendMenu(MF_STRING, WM_DESTROY, "退出");
		//确定弹出式菜单的位置
		SetForegroundWindow();
		menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x, lpoint->y, this);
		//资源回收
		HMENU hmenu = menu.Detach();
		menu.DestroyMenu();
		delete lpoint;
	}
	break;
	case WM_LBUTTONDBLCLK://双击左键的处理
	{
		//删除WS_EX_TOOLWINDOW风格,改为WS_EX_APPWINDOW(显示任务栏图标)	
		ModifyStyleEx( WS_EX_TOOLWINDOW, WS_EX_APPWINDOW);
		this->ShowWindow(SW_SHOWNORMAL);//简单的显示主窗口
	}
	break;
	}
	return 0;
}

OnInitDialog函数中调用ToTray():

//删除WS_EX_APPWINDOW风格,改为WS_EX_TOOLWINDOW**(隐藏任务栏图标)**	
ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);
//图标显示至托盘
ToTray();
ShowWindow(SW_MINIMIZE); //初始最小化显示

为使应用程序退出时图标消失,在类向导添加WM_DESTROY消息,
在OnDestroy()函数中加入:

::Shell_NotifyIcon(NIM_DELETE,&m_nid);

(1)不使用系统的最小化按钮,自己拖按钮做隐藏功能:

void CLaserMarkingManagerDlg::OnBnClickedHide()
{
	//删除WS_EX_APPWINDOW风格,改为WS_EX_TOOLWINDOW(隐藏任务栏图标)	
	ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);WS_EX_APPWINDOW
	ShowWindow(SW_MINIMIZE);
}

(2)或者添加消息WM_SYSCOMMAND

void C***Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    // TODO:  在此添加消息处理程序代码和/或调用默认值
    if (SC_MAXIMIZE == nID)
       {
        ...............
       }
        
    if (SC_MINIMIZE == nID)
    {
       //删除WS_EX_APPWINDOW风格,改为WS_EX_TOOLWINDOW(隐藏任务栏图标)	
		ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);WS_EX_APPWINDOW
    }

    CDialogEx::OnSysCommand(nID, lParam);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值