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

阅读更多
文章标签: mfc C++ vs2008
个人分类: MFC笔记
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭