MFC程序最小化到托盘

1.新建一个基于对话框的程序

2.在StdAfx.h增加自定义的消息:

#define WM_USER_NOTIFYICON WM_USER+1

3.增加一个私有成员变量:

private:
        NOTIFYICONDATA m_notify;

4.在OnInitDialog()中添加下面代码:

	m_notify.cbSize=sizeof NOTIFYICONDATA;
	m_notify.hWnd=this->m_hWnd;	
	m_notify.uID=IDR_MAINFRAME;
	m_notify.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
	strcpy(m_notify.szTip,"最小化图标指向时的提示字符!");
	m_notify.uCallbackMessage = WM_USER_NOTIFYICON;
	m_notify.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP; //OK,下面就是托盘产生了. 
	Shell_NotifyIcon(NIM_ADD,&m_notify);

5. 在**Dlg.h文件的protected中定义消息的那些代码中增加:

afx_msg LRESULT OnNotifyMsg(WPARAM wparam,LPARAM lparam);

6.在**Dlg.cpp中找到下面部分代码,添加:ON_MESSAGE(WM_USER_NOTIFYICON,OnNotifyMsg),如下:

BEGIN_MESSAGE_MAP(CNotifyiconDlg, CDialog)
	//{{AFX_MSG_MAP(CNotifyiconDlg)
                 ...
	//添加下面一句代码:
	ON_MESSAGE(WM_USER_NOTIFYICON,OnNotifyMsg)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

7.在**Dlg.cpp中添加消息响应函数(注意:我建的工程名为:1,所以是CMy1Dlg,具体根据自己的情况更改):

//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
LRESULT  CMy1Dlg::OnNotifyMsg(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,"关闭");     
			//确定弹出式菜单的位置   
			menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);   
			//资源回收   
			HMENU    hmenu=menu.Detach();   
			menu.DestroyMenu();   
			delete    lpoint;   
		}
		break; 
		case WM_LBUTTONDBLCLK://双击左键的处理   
		{
			/**********************这段代码不太管用********************************
			//鼠标双击时主窗口出现 
			if(AfxGetApp()->m_pMainWnd->IsWindowVisible()) //判断窗口当前状态
			{
				AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE); //隐藏窗口
			}
			if(!AfxGetApp()->m_pMainWnd->IsWindowVisible()) //判断窗口当前状态
			{
				AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW); //显示窗口
			}
			**************************************************************/
			this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿   
		}   
		break;   
    }    
	return 0;
}

8.添加WindowProc(UINT message, WPARAM wParam, LPARAM lParam)消息响应函数,以处理其他一些消息。注意该函数里不要在添加case WM_USER_NOTIFYICON,因为这些已经通过OnNotifyMsg(WPARAM wparam,LPARAM lparam)响应。(注意:我建的工程名为:1,所以是CMy1Dlg,具体根据自己的情况更改)

LRESULT CMy1Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	// TODO: Add your specialized code here and/or call the base class
	switch(message) //判断消息类型
	{
		//相应右键菜单的关闭命令
		case WM_DESTROY: 
			::Shell_NotifyIcon(NIM_DELETE,&m_notify); //关闭时删除系统托盘图标
			break;
		case WM_SYSCOMMAND:   
			//如果是系统消息    
			if(wParam==SC_MINIMIZE)  
			{   
				//接收到最小化消息时主窗口隐藏    
				AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);   
				return 0;   
			}   
			if(wParam==SC_CLOSE)  
			{  
				::Shell_NotifyIcon(NIM_DELETE,&m_notify); //关闭时删除系统托盘图标   
			}  
			break;
	}
	return CDialog::WindowProc(message, wParam, lParam);
}

Over!

源代码下载:

http://download.csdn.net/detail/c_s_d_n_user/5307245

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值