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(); }