MFC程序最小化到托盘

转载 2016年03月21日 17:14:53

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

其实删除挺简单的,处理一下关闭窗口消息,使用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

相关文章推荐

MFC程序最小化到系统托盘

为了使MFC程序(SDI,MDI,DLG)均能最小化到系统托盘,这里运用消息机制来实现系统托盘效果。           那么什么是托盘呢?所谓的“托盘”,在Windows系统界面中,指的就是下面任...
  • csf111
  • csf111
  • 2011年11月17日 10:20
  • 8741

MFC程序最小化右下角托盘的实现

参考:http://blog.csdn.net/csf111/article/details/6980508 我的目的是:sdi或mdi程序实现最小化到托盘。 开发工具vs2010,由于代...

MFC程序最小化托盘显示

以单文档为例: 在CMainFrame中定义全局变量: #define WM_MY_MESSAGE (WM_USER+101) NOTIFYICONDATA ntf; 消息映射如下: BE...

MFC程序最小化到托盘

  • 2013年04月27日 12:23
  • 39KB
  • 下载

Windows编程入门(5)MFC程序最小托盘化

转载自http://blog.csdn.net/csf111/article/details/6980508   为了使MFC程序(SDI,MDI,DLG)均能最小化到系统托盘,这里运用消息机制来实...

MFC程序最小化到通知区域补充

  • 2012年11月20日 14:58
  • 43KB
  • 下载

MFC基于Dialog的窗口程序启动时最小化到托盘

一、托盘是什么 所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分。在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。 二、...

MFC 程序最小化到系统托盘区的一个简单实例 .

转载原文http://blog.csdn.net/jarvischu/article/details/5781294  准备工作:       在开始之前,我们需要弄清出一下东东,当然,你也可...

MFC最小化程序到托盘

 一、NOTIFYICONDATA结构NOTIFYICONDATA结构包含了系统用来处理托盘图标的信息,它包括选择的图标、回调消息、提示消息、图标对应的窗口等内容。其定义为:    typedef s...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC程序最小化到托盘
举报原因:
原因补充:

(最多只允许输入30个字)