www.pudn.com > PBMS.rar > MyTray.cpp


// MyTray.cpp: implementation of the MyTray class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "MyTray.h" 
#include  
/////////////////////////////////////////////////////////////////////// 
//------------------Copyright@wolfsky	2003-3-25--------------------- 
//MyTray类接口说明:在这里这是基于MFC程序可以用的代码. 
//要为一个应用程序做一个托盘,可以在MYAAP类或CMainFrame中申明一个MyTray对象 
//当点击程序某菜单或是某按钮后为了变成托盘,并将主窗口隐藏,这一切工作都由该类封装好了,用户只需 
//在点击后的处理程序(推荐在按钮处理程序或截获最小化处理程序处)处先通过设置对象属性mmtay.Property(), 
//然后mmtray.SetIcon()即可,不过在MYAPP类或CMainFrame中要重载 
//WindosProc函数,在里面处理WM_MYTRAY(自己定义的,而非系统, 
//可以随便定义)消息,所谓WM_MYTRAY消息是当前用户点击托盘后,系统产生的 
//消息。 
//第二步:做一个菜单,是当点击托盘图标后产生的菜单,并用Class Wizard 
//将该菜单添加到MYAPP类或CMainFrame中,在MYAPP类或CMainFrame中用 
//class Wizard为菜单上的各项做处理。 
//注:这里有一个技巧:由于在该类中把菜单第一项设为默认项,即使用该类 
//可以把双击图标要产生的消息放在这个菜单第一项! 
//如本例中的OnFileResume和OnFileMin 
//必须mmtray.DealMessage(WPARAM wParam, LPARAM lParam)来处理各种消息。 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
//hwnd:托盘所对应的窗口,uID:图标ID值,tip:提示信息 
//message:操作托盘图标时系统返回的消息 
MyTray::MyTray(HMENU hmenu2,HINSTANCE h,HWND hwnd,UINT uID,UINT message,CHAR *tip) 
{ 
	hmenu = hmenu2; 
	hInst = h; 
	nid.cbSize=sizeof(NOTIFYICONDATA); 
	nid.hWnd=hwnd; 
	nid.uID=uID; 
	nid.uCallbackMessage=message;//操作托盘图标时系统返回的消息 
	nid.hIcon=LoadIcon(hInst,LPSTR(uID)); 
	nid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP; 
	strcpy(nid.szTip,tip); 
} 
MyTray::MyTray() 
{ 
	nid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP; 
} 
MyTray::~MyTray() 
{ 
	DeleteIcon(); 
} 
 
void MyTray::SetIcon() 
{ 
	ShowWindow(nid.hWnd,SW_HIDE);//使主窗口隐藏 
	Shell_NotifyIcon(NIM_ADD,&nid);	//在任务栏中加入一个图标 
} 
 
void MyTray::DeleteIcon() 
{ 
	Shell_NotifyIcon(NIM_DELETE,&nid);	//在任务栏中加入一个图标 
} 
 
void MyTray::DealMessage(WPARAM wParam, LPARAM lParam) 
{ 
	UINT uID; 
	uID = wParam;//定义任务栏中图标的ID值。 
	UINT uMsg; 
	uMsg = lParam;//定义当用户对任务栏图标进行操作时,程序windows向程序发送的消息。 
	POINT	point; 
	GetCursorPos(&point); 
	if(uID==nid.uID) 
	{ 
		switch(uMsg) 
		{ 
		//若是右击图标,则显示菜单 
		case WM_RBUTTONDOWN://如果是单击右键 
			GetCursorPos(&point);//获得单击的坐标位置 
			SetForegroundWindow(nid.hWnd);//这句话很重要,用来按ESC后,菜单消失 
			//把菜单第一项设置为默认项,即双击图标时系统产生的消息 
			SetMenuDefaultItem(GetSubMenu(hmenu,0), 0, TRUE); 
			TrackPopupMenuEx(GetSubMenu(hmenu,0),TPM_VERTICAL|TPM_LEFTALIGN,point.x,point.y,nid.hWnd,NULL);//在单击的位置上显示弹出菜单 
			break; 
		//若是单击菜单,把消息传递给主窗口,并由主窗口处理相应消息 
		case WM_LBUTTONDBLCLK: 
			//这里是一个非常好的技巧!用来一个框口将信息传递给另一个窗口中 
			SendMessage(nid.hWnd,WM_COMMAND,GetMenuItemID(GetSubMenu(hmenu,0),0),0); 
			break; 
		} 
	} 
} 
 
//menuID:右击托盘图标后显示的菜单,uID:图标ID值,tip:提示信息 
//message:操作托盘图标时系统返回的消息 
void MyTray::SetProper(UINT menuID,UINT uID,UINT message,CHAR *tip) 
{ 
	hInst = AfxGetInstanceHandle() ; 
 
	hmenu = CreateMenu(); 
	hmenu = LoadMenu(hInst,LPCTSTR(menuID)); 
 
	nid.hWnd=(AfxGetApp()->m_pMainWnd)->GetSafeHwnd(); 
	 
	nid.uID=uID; 
	nid.uCallbackMessage=message;//操作托盘图标时系统返回的消息 
	nid.hIcon=LoadIcon(hInst,LPSTR(uID)); 
	strcpy(nid.szTip,tip); 
} 
 
void MyTray::SetTip(char * tip) 
{ 
	strcpy(nid.szTip,tip);	 
} 
 
void MyTray::SetInst(HINSTANCE	h) 
{ 
	hInst = h; 
} 
 
//DEL void MyTray::SetMenu(HMENU h) 
//DEL { 
//DEL 	hmenu = h; 
//DEL } 
 
void MyTray::ResumeMain() 
{ 
	//最大化主框架 
	ShowWindow(nid.hWnd,SW_SHOWMAXIMIZED); 
	DeleteIcon();	 
}