MFC 最小化托盘的相关处理

程序最小化到托盘

一、说明 部分

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

2、SDK  API函数 Shell_NotifyIcon  详细参数说明查看MSDN

BOOL Shell_NotifyIcon(          
    DWORD dwMessage,
    PNOTIFYICONDATA lpdata
);

该函数的作用:

Sends a message to the taskbar's status area.  发送消息到任务栏的状态区域

3、相关结构体,NOTIFYICONDATA

typedef struct _NOTIFYICONDATA {
    DWORD cbSize;
    HWND hWnd;
    UINT uID;
    UINT uFlags;
    UINT uCallbackMessage;
    HICON hIcon;
    TCHAR szTip[64];
    DWORD dwState;
    DWORD dwStateMask;
    TCHAR szInfo[256];
    union {
        UINT uTimeout;
        UINT uVersion;
    };
    TCHAR szInfoTitle[64];
    DWORD dwInfoFlags;
    GUID guidItem;
    HICON hBalloonIcon;
} NOTIFYICONDATA, *PNOTIFYICONDATA;


二、使用部分

最小化:将窗口隐藏,在托盘区增加一个图标

步骤:

1、定义 NOTIFYICONDATA   变量

2、在需要最小化的地方   初始这个变量

     其中一个参数  uCallbackMessage  需要定义一个消息

3、自定义消息、在消息中响应对托盘的处理

4、(可选) 程序关闭后,清除托盘图标

       重载 DestroyWindow  函数

四、代码示例:

1、定义

NOTIFYICONDATA m_notify;

2、初始

	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,"Just Test");
	m_notify.uCallbackMessage = WM_USER_NOTIFYICON;
	m_notify.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
	Shell_NotifyIcon(NIM_ADD,&m_notify);

3、定义消息

#define WM_USER_NOTIFYICON WM_USER+1
LRESULT XXXX::OnNotifyMsg( WPARAM wParam,LPARAM lParam )
{ //wParam接收的是图标的ID,而lParam接收的是鼠标的行为   
	if(wParam != IDR_MAINFRAME)
		return 1;
	switch(lParam)
	{
	case  WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”      
           {       
            LPPOINT    lpoint=new    tagPOINT;     
            ::GetCursorPos(lpoint);//得到鼠标位置      
              CMenu    menu;     
            menu.CreatePopupMenu();//声明一个弹出式菜单      
              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://双击左键的处理      
        {     
            this->ShowWindow(SW_SHOW);//简单的显示主窗口      
        }     
        break;     

        }
	return 0;
}

处理消息的另外一种方式 重载 WindowProc 函数 来处理这个消息

LRESULT XXXX::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	// TODO: Add your specialized code here and/or call the base class
	switch(message)
	{ // 处理消息
 	case WM_USER_NOTIFYICON:
            if(lParam==WM_LBUTTONDBLCLK)  
 			
           {   
             //鼠标双击时主窗口出现    
               if(AfxGetApp()->m_pMainWnd->IsWindowVisible()) //判断窗口当前状态   
             {  
                 AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE); //隐藏窗口   
             }  
             else  
             {  
                 AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW); //显示窗口   
             }  
 			
         }   
         else if(lParam==WM_RBUTTONDOWN)  
         { //鼠标右键单击弹出选单    
             CMenu menu;   
             menu.LoadMenu(IDR_MENU1); //载入事先定义的选单    
             CMenu *pMenu=menu.GetSubMenu(0);   
             CPoint pos;   
             GetCursorPos(&pos);   
             pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());   
         }   
 		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);
}

清除图标

BOOL XXXX::DestroyWindow() 
{
	// 清除托盘图标
	Shell_NotifyIcon(NIM_DELETE,&m_NotifyIcon);

	return CDialog::DestroyWindow();
}

为什么在DestroyWindow中清除:本人前面关于程序退出有说明点击打开链接                        

http://blog.csdn.net/whh_tg/article/details/8467954

   

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值