MFC程序最小化到托盘

网上搜的代码确实能实现最小化到托盘,但关闭程序时,托盘图标还在,原因是没删除图标,需屏幕刷屏才消失!

其实删除挺简单的,处理一下关闭窗口消息,使用NIM_DELETE就行了,具体看代码...

首先建立基于对话框的MFC应用程序工程testDlg,接下来

一,自定义一个消息WM_SHOWTASK,并关联消息映射函数OnShowTask()

// 定义消息  
#define WM_SHOWTASK (WM_USER + 1)  
   
// 关联消息映射函数  
// 位于BEGIN_MESSAGE_MAP与END_MESSAGE_MAP之间  
    ON_MESSAGE(WM_SHOWTASK,OnShowTask)  
   
// 当然要声明和定义OnShowTask()  
// 声明  
    LRESULT OnShowTask(WPARAM wParam, LPARAM lParam) ; 
<pre name="code" class="cpp">LRESULT CtestdlgDlg::OnShowTask(WPARAM wParam, LPARAM lParam)   
//wParam接收的是图标的ID,lParam接收的是鼠标的动作  
{   
	if(wParam != IDR_MAINFRAME)   
		return 1;
	switch(lParam)
	{
	case WM_LBUTTONDOWN:
		this->ShowWindow(SW_SHOW); // 显示主窗口  WM_LBUTTONDBLCLK
		break;
	case WM_RBUTTONUP:               //右键起来时弹出菜单
		{
			LPPOINT lpoint = new tagPOINT;
			::GetCursorPos(lpoint);                    // 得到鼠标位置

			CMenu menu;
			menu.CreatePopupMenu();                    // 声明一个弹出式菜单
			menu.AppendMenu(MF_STRING, WM_DESTROY, "退出");//Appends a new item to the end ofthis menu
			//Displays a floating pop-up menu at the specifiedlocation and tracks the selection of items on the pop-up menu
			menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x ,lpoint->y,this);
			HMENU hmenu = menu.Detach();
			menu.DestroyMenu();
			delete lpoint;
			break;
		}
	}
	return 0;   
}


 
二,SC_MINIMIZE、SC_CLOSE消息处理,重载WM_SYSCOMMAND消息处理 

void CtestDlgDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if(nID == SC_MINIMIZE) // 最小化窗口
	{
		NOTIFYICONDATA nid; 
		nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA); 
		nid.hWnd = this->m_hWnd; 
		nid.uID = IDR_MAINFRAME; 
		nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ; 
		nid.uCallbackMessage = WM_SHOWTASK;         // 自定义的消息名称 
		nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME)); 
		strcpy_s(nid.szTip, "程序窗口标题");        // 信息提示条
		Shell_NotifyIcon(NIM_ADD, &nid);            // 在托盘区添加图标 
		ShowWindow(SW_HIDE);                        // 隐藏主窗口 
		return;
	}
	elseif(nID == SC_CLOSE) // 关闭窗口
	{
		NOTIFYICONDATA nd;
		nd.cbSize    = sizeof (NOTIFYICONDATA);
		nd.hWnd    = this->m_hWnd;
		nd.uID   =   IDR_MAINFRAME;
		Shell_NotifyIcon(NIM_DELETE, &nd);    // 托盘图标不显示
	}
	CDialog::OnSysCommand(nID, lParam);
}


原文:http://blog.csdn.net/lightboat09/article/details/6069792

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值