MFC 托盘模式

为对话框程序增加托盘模式,左键双击托盘图标重新显示窗口,右键单击托盘图标显示下拉菜单,可点击关闭。


1,在对话框类的头文件中添加:
 #define WM_NC WM_USER+1 
 #define IDI_NOTIFYICON 100 
//添加成员函数
afx_msg LRESULT OnNotifyIcon(WPARAM wParam,LPARAM lParam);
void tray();
//添加成员变量
NOTIFYICONDATA NotifyIcon;


2,在类的源文件中实现两个成员函数:

LRESULT CBaiduAppStoreTestDlg::OnNotifyIcon(WPARAM wParam,LPARAM lParam)
{
	if (wParam == IDI_NOTIFYICON)//为创建的托盘图标
    {
		switch(lParam)//消息的类型
        {
			case WM_LBUTTONDBLCLK://双击左键
			{
				this->ShowWindow(SW_SHOWNORMAL);  
			}  
            break;
  
			case WM_RBUTTONDOWN://右击托盘,显示菜单
            {
				LPPOINT lpoint=new tagPOINT;
				::GetCursorPos(lpoint);//得到鼠标位置
				CMenu menu;
				menu.CreatePopupMenu();//声明一个弹出式菜单
				menu.AppendMenu(MF_STRING,WM_DESTROY,L"close");
                //确定弹出式菜单的位置
                menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
                //资源回收
                HMENU hmenu=menu.Detach();
                menu.DestroyMenu();
                delete lpoint;
			   
            }
			break;
		}
	}
    return 0;
}
//创建及初始化托盘
void CBaiduAppStoreTestDlg::tray()
{
	NotifyIcon.cbSize=sizeof(NOTIFYICONDATA);
	NotifyIcon.hIcon=AfxGetApp()->LoadIcon(IDI_ICON1);
	NotifyIcon.hWnd=m_hWnd;
	NotifyIcon.uID = IDI_NOTIFYICON;
	lstrcpy(NotifyIcon.szTip,L"BaiduUserTestClient");
	NotifyIcon.uCallbackMessage=WM_NC;
	NotifyIcon.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP;
	Shell_NotifyIcon(NIM_ADD,&NotifyIcon);
}


3,注册消息:
ON_MESSAGE(WM_NC,OnNotifyIcon)


4,卸载托盘:
Shell_NotifyIcon(NIM_DELETE, &NotifyIcon);


5,托盘的调用:
如果需要程序运行时托盘一直出现,则在初始化函数中调用tray()即可。
如果要点击最小化按钮时转到托盘,则需在OnSysCommand()函数中拦截最小化事件:
if(nID==SC_MINIMIZE) 

   tray();
}

你可能感兴趣的:(MFC 托盘模式)