www.pudn.com > src.zip > MainFrm.cpp


// MainFrm.cpp : implementation of the CMainFrame class 
// 
 
#include "stdafx.h" 
#include "msg.h" 
#include "Client.h" 
#include "lookdlg.h" 
#include "talkdlg.h" 
#include "frienddetail.h" 
#include "modifypidlg.h" 
#include "searchdlg.h" 
#include "SendToalldlg.h" 
#include "multisenddlg.h" 
#include "ShowOnlinedlg.h" 
#include "SendBroadcastDlg.h" 
#include "ShowAddMsgDlg.h" 
#include "ShowBroadcastDlg.h" 
#include "addfrienddlg.h" 
 
#include "MainFrm.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame 
 
IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd) 
 
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) 
	//{{AFX_MSG_MAP(CMainFrame) 
	ON_WM_CREATE() 
	ON_WM_SETFOCUS() 
	ON_WM_GETMINMAXINFO() 
	ON_WM_CLOSE() 
	ON_WM_TIMER() 
	ON_COMMAND(ID_SEND_MESSAGE, OnSendMessage) 
	ON_UPDATE_COMMAND_UI(ID_SEND_MESSAGE, OnUpdateSendMessage) 
	ON_COMMAND(ID_SEND_EMAIL, OnSendEmail) 
	ON_UPDATE_COMMAND_UI(ID_SEND_EMAIL, OnUpdateSendEmail) 
	ON_COMMAND(ID_FRIEND_DETAIL, OnFriendDetail) 
	ON_COMMAND(ID_PERSON_HOMEPAGE, OnPersonHomepage) 
	ON_UPDATE_COMMAND_UI(ID_PERSON_HOMEPAGE, OnUpdatePersonHomepage) 
	ON_COMMAND(ID_OFFLINE, OnOffline) 
	ON_COMMAND(ID_ONHIDE, OnOnhide) 
	ON_COMMAND(ID_ONLINE, OnOnline) 
	ON_COMMAND(ID_SEARCH, OnSearch) 
	ON_COMMAND(ID_PERSONINFO_SETUP, OnPersoninfoSetup) 
	ON_COMMAND(ID_MULTISEND, OnMultisend) 
	ON_COMMAND(ID_SENDTO_ALL, OnSendtoAll) 
	ON_COMMAND(ID_MESSAGE_MANAGE, OnMessageManage) 
	ON_COMMAND(ID_SHOW_ONLINE, OnShowOnline) 
	ON_COMMAND(ID_SEND_BROADCAST, OnSendBroadcast) 
	ON_COMMAND(ID_ADD_FRIEND, OnAddFriend) 
	//}}AFX_MSG_MAP 
	ON_MESSAGE(WM_MY_TRAY_NOTIFICATION,OnTrayNotification) 
	ON_MESSAGE(WM_HOTKEY,OnHotKey) 
	ON_MESSAGE(WM_OUTBAR_NOTIFY, OnOutbarNotify) 
	ON_MESSAGE(WM_RECIEVE_MSG,ProcRecv) 
	ON_MESSAGE(WM_ADDFRIEND_REFRESH,OnAddFriendRefresh) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame construction/destruction 
 
CMainFrame::CMainFrame() 
{ 
	m_pSearch=NULL;	 
	m_pModifyPI=NULL; 
	m_pMultiSend=NULL; 
	m_pSendToAll=NULL;		 
	m_pShowOnline=NULL; 
	m_pSendBroad=NULL;	 
	m_pShowNotice=NULL; 
	m_pAddFriendDlg=NULL; 
	m_bRecvTotal=FALSE; 
} 
 
CMainFrame::~CMainFrame() 
{ 
} 
 
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1) 
		return -1;	 
			 
	DWORD dwf = CGfxOutBarCtrl::fDragItems|CGfxOutBarCtrl::fEditGroups|CGfxOutBarCtrl::fEditItems|CGfxOutBarCtrl::fRemoveGroups| 
		CGfxOutBarCtrl::fRemoveItems|CGfxOutBarCtrl::fAddGroups|CGfxOutBarCtrl::fAnimation;	 
		 
	m_wndBar.Create(WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), this,AFX_IDW_PANE_FIRST, dwf); 
	m_wndBar.SetOwner(this);	 
	 
	m_wndBar.SetImageList(&GetApp()->m_imaLarge, CGfxOutBarCtrl::fLargeIcon); 
	m_wndBar.SetImageList(&GetApp()->m_imaSmall, CGfxOutBarCtrl::fSmallIcon); 
	m_wndBar.AddFolder("我的好友", 0);	 
	m_wndBar.AddFolder("陌生人", 1); 
	m_wndBar.AddFolder("黑名单", 2); 
	 
	UserInfo* pInfo; 
	CString str; 
	for(int i=1;im_aUserInfo.GetSize();i++) 
	{ 
		pInfo=GetApp()->m_aUserInfo.GetAt(i); 
		if(pInfo->HaveDetail) 
			m_wndBar.AddItem(0,pInfo->Name,pInfo->PhotoId,pInfo->Id); 
		else 
		{ 
			str.Format("%d",pInfo->Id); 
			m_wndBar.AddItem(0,str,0,pInfo->Id); 
		} 
	} 
	m_wndBar.SetSelFolder(0); 
 
	BOOL result1=::RegisterHotKey(m_hWnd,1001,MOD_CONTROL|MOD_ALT,'X'); 
	BOOL result2=::RegisterHotKey(m_hWnd,1002,MOD_CONTROL|MOD_ALT,'x'); 
	BOOL result3=::RegisterHotKey(m_hWnd,1003,MOD_CONTROL|MOD_ALT,'m'); 
	BOOL result4=::RegisterHotKey(m_hWnd,1004,MOD_CONTROL|MOD_ALT,'M'); 
	if(!result1&&!result2&&!result3&&!result4) 
	{ 
		//AfxMessageBox(IDS_HOTKEY_REG_FAIL); 
	}	 
 
	m_TrayIcon.SetNotificationWnd(this,WM_MY_TRAY_NOTIFICATION); 
	str=GetApp()->m_strCurUserDir; 
	str=str.Left(str.GetLength()-1); 
	m_TrayIcon.SetIcon(IDR_OFFLINE,str);	 
 
	str.Format("ID:%d",GetApp()->m_uCurrentUserID); 
	SetWindowText(str); 
	CMenu* pMenu=GetMenu(); 
	menu1.Attach(pMenu->GetSubMenu(0)->GetSafeHmenu()); 
	menu2.Attach(pMenu->GetSubMenu(1)->GetSafeHmenu()); 
	menu1.LoadToolBarResource(IDR_TOOLBAR1); 
	menu2.LoadToolBarResource(IDR_TOOLBAR2); 
	menu1.RemapMenu(&menu1); 
	menu2.RemapMenu(&menu2); 
	 
	return 0; 
} 
 
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	if( !CFrameWnd::PreCreateWindow(cs) ) 
		return FALSE; 
	 
	cs.dwExStyle|=WS_EX_TOOLWINDOW|WS_EX_TOPMOST; 
	cs.lpszClass = AfxRegisterWndClass(0); 
	cs.x=650; 
	cs.y=50; 
	cs.cx=90; 
	cs.cy=500; 
	return TRUE; 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame diagnostics 
 
#ifdef _DEBUG 
void CMainFrame::AssertValid() const 
{ 
	CFrameWnd::AssertValid(); 
} 
 
void CMainFrame::Dump(CDumpContext& dc) const 
{ 
	CFrameWnd::Dump(dc); 
} 
 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame message handlers 
void CMainFrame::OnSetFocus(CWnd* pOldWnd) 
{ 
	// forward focus to the view window 
	m_wndBar.SetFocus(); 
} 
 
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) 
{ 
	// let the view have first crack at the command 
	if (m_wndBar.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) 
		return TRUE; 
 
	// otherwise, do default handling 
	return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); 
} 
 
 
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)  
{ 
	lpMMI->ptMinTrackSize.x = 90; 
	lpMMI->ptMaxTrackSize.x=200; 
	lpMMI->ptMinTrackSize.y=200; 
	CFrameWnd::OnGetMinMaxInfo(lpMMI); 
} 
 
LRESULT CMainFrame::OnHotKey(WPARAM wParam,LPARAM lParam) 
{ 
	if (wParam== 1001||wParam==1002) 
	{ 
		ShowWindow(SW_NORMAL);  
		SetForegroundWindow(); 
		return 1; 
	} 
	else if(wParam== 1003||wParam==1004) 
	{ 
		SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0); 
		return 1; 
	} 
	return 0; 
} 
 
LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)  
{ 
	if(message==WM_SYSCOMMAND) 
	{ 
		if(wParam==SC_MINIMIZE) 
		{ 
			ShowWindow(SW_HIDE); 
			return 0; 
		} 
		else if(wParam==SC_CLOSE) 
		{ 
			ShowWindow(SW_HIDE); 
			return 0; 
		} 
	} 
			 
	return CFrameWnd::WindowProc(message, wParam, lParam);	 
} 
 
LRESULT CMainFrame::OnTrayNotification(WPARAM wp,LPARAM lp) 
{ 
	return m_TrayIcon.OnTrayNotification(wp,lp); 
} 
 
void CMainFrame::OnClose()  
{ 
	::UnregisterHotKey(m_hWnd,1001);  
	::UnregisterHotKey(m_hWnd,1002);  
	::UnregisterHotKey(m_hWnd,1003);  
	::UnregisterHotKey(m_hWnd,1004);  
	CFrameWnd::OnClose(); 
} 
 
LRESULT CMainFrame::OnOutbarNotify(WPARAM wParam, LPARAM lParam) 
{ 
	switch (wParam) 
	{ 
		case NM_OB_ITEMCLICK: 
		// cast the lParam to an integer to get the clicked item 
			{ 
				nGroupFlag=m_wndBar.iSelFolder;				 
				nCurSelID = m_wndBar.GetItemData(lParam); 
				nCurSelIndex=lParam; 
				CMenu menu; 
				CGfxPopupMenu cMenu; 
				menu.LoadMenu(IDR_POPMENU); 
				cMenu.Attach(menu.GetSubMenu(0)->GetSafeHmenu()); 
				if(nGroupFlag==1) 
				{ 
					cMenu.AppendMenu(MF_STRING,ID_ADD_FRIEND,"加为好友"); 
				}				 
				cMenu.LoadToolBarResource(IDR_TOOLBAR3); 
				cMenu.RemapMenu(&cMenu);				 
				CPoint mouse; 
				GetCursorPos(&mouse);				 
				cMenu.TrackPopupMenu(TPM_LEFTALIGN,mouse.x,mouse.y,this);						 
			}		 
			return 1; 
		case NM_OB_ITEMDCLICK: 
			{ 
				nGroupFlag=m_wndBar.iSelFolder;				 
				nCurSelID = m_wndBar.GetItemData(lParam); 
				nCurSelIndex=lParam; 
				SendMessage(WM_COMMAND,ID_SEND_MESSAGE,0);				 
			} 
			return 1; 
		case NM_OB_ONLABELENDEDIT: 
		// cast the lParam to an OUTBAR_INFO * struct; it will contain info about the edited item 
		// return 1 to do the change and 0 to cancel it 
			{ 
				OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam; 
				//TRACE2("Editing item %d, new text:%s\n", pOI->index, pOI->cText); 
			} 
		return 1; 
 
		case NM_OB_ONGROUPENDEDIT: 
		// cast the lParam to an OUTBAR_INFO * struct; it will contain info about the edited folder 
		// return 1 to do the change and 0 to cancel it 
			{ 
				OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam; 
				TRACE2("Editing folder %d, new text:%s\n", pOI->index, pOI->cText); 
			} 
		return 1; 
 
		case NM_OB_DRAGITEM: 
		// cast the lParam to an OUTBAR_INFO * struct; it will contain info about the dragged items 
		// return 1 to do the change and 0 to cancel it 
			{ 
				OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam; 
				TRACE2("Drag item %d at position %d\n", pOI->iDragFrom, pOI->iDragTo); 
			} 
		return 1; 
	} 
	return 0; 
} 
 
LRESULT CMainFrame::ProcRecv(WPARAM wParam,LPARAM lParam) 
{ 
	CData* pData=(CData*)wParam; 
	UINT index=pData->index; 
	int & iOnlineState=GetApp()->m_bOnlineState; 
 
	switch(index) 
	{ 
	case SEND_MSG_TO_FRIEND: 
		{ 
			//recv from friend or server 
			if(iOnlineState==0)break; 
			CMsg1 msg; 
			CopyDataBuf(&msg,pData); 
			if(!msg.LoadFromBuf()) 
			{ 
				TRACE0("msg.LoadFromBuf error!\n"); 
				break; 
			} 
 
			int mindex=0; 
			SaveMsg* pMsg=new SaveMsg; 
			pMsg->type=NORMAL_MSG; 
			pMsg->ID=msg.MyId; 
			pMsg->Time=msg.Time; 
			pMsg->Msg=msg.Msg; 
 
			UserInfo *pInfo=NULL; 
			FriendState *pState=NULL; 
			if(FindInArray(GetApp()->m_aUserInfo,GetApp()->m_aUserState,msg.MyId,pInfo,pState)) 
			{ 
				pState->aMsg.Add(pMsg);			 
			}			 
			else 
			{ 
				// 陌生人			 
				if(FindInArray(GetApp()->m_aStranger,GetApp()->m_aStrangerState,msg.MyId,pInfo,pState)) 
				{ 
					pState->aMsg.Add(pMsg); 
				} 
				else 
				{ 
					pInfo=new UserInfo;					 
					pInfo->Id=msg.MyId; 
					pInfo->HaveDetail=0; 
					pState=new FriendState;					 
					pState->IP=msg.tarIP; 
					pState->Port=msg.nPort; 
					pState->OnlineState=1; 
					pState->aMsg.Add(pMsg); 
					GetApp()->m_aStranger.Add(pInfo);					 
					GetApp()->m_aStrangerState.Add(pState); 
					GetApp()->m_aStranger.GetSize(); 
					CString str; 
					str.Format("%d",pInfo->Id); 
					m_wndBar.AddItem(1,str,0,pInfo->Id);					 
					m_wndBar.Invalidate(); 
				} 
			} 
			if(pState->pRecv==NULL) 
			{ 
				pState->pRecv=new CLookDlg; 
				pState->pRecv->Create(CLookDlg::IDD,GetDesktopWindow()); 
			} 
			pState->pRecv->PostMessage(WM_RECVMSG,(WPARAM)pInfo,(LPARAM)pState);			 
			 
			break; 
		} 
	case SOMEONE_ONHIDE: 
		{				 
			if(iOnlineState==0)break; 
 
			CNoticeMsg msg; 
			CopyDataBuf(&msg,pData); 
 
			if(!msg.LoadFromBuf())break; 
 
			UserInfo *pInfo=NULL; 
			FriendState *pState=NULL; 
			if(FindInArray(GetApp()->m_aUserInfo,GetApp()->m_aUserState,msg.MyId,pInfo,pState)) 
			{ 
				pState->OnlineState=2; 
				pState->IP=msg.IP; 
				pState->Port=msg.Port; 
				m_wndBar.SetOnlineImage(msg.MyId,FALSE); 
				m_wndBar.Invalidate(); 
			}			 
			break; 
		} 
	case SOMEONE_ONLINE: 
		{ 
			if(iOnlineState==0)break; 
 
			CNoticeMsg msg; 
			CopyDataBuf(&msg,pData); 
 
			if(!msg.LoadFromBuf())break; 
 
			UserInfo *pInfo=NULL; 
			FriendState *pState=NULL; 
			if(FindInArray(GetApp()->m_aUserInfo,GetApp()->m_aUserState,msg.MyId,pInfo,pState)) 
			{ 
				pState->OnlineState=1; 
				pState->IP=msg.IP; 
				pState->Port=msg.Port; 
				m_wndBar.SetOnlineImage(msg.MyId); 
				m_wndBar.Invalidate(); 
			}						 
			break; 
		} 
	case SOMEONE_OFFLINE: 
		{ 
			if(iOnlineState==0)break; 
			UserInfo *pInfo=NULL; 
			FriendState *pState=NULL; 
			if(FindInArray(GetApp()->m_aUserInfo,GetApp()->m_aUserState,pData->MyId,pInfo,pState)) 
			{ 
				pState->OnlineState=0;				 
				m_wndBar.SetOnlineImage(pData->MyId,FALSE);	 
				m_wndBar.Invalidate(); 
			}			 
			break; 
		} 
	case ONLINE_OK: 
		{ 
			if(!GetApp()->m_bOnlineState) 
				SetTimer(1,TimerSpanClient,NULL); 
			GetApp()->m_bOnlineState=1; 
			CString str=GetApp()->m_strCurUserDir;			 
			str=str.Left(str.GetLength()-1); 
			m_TrayIcon.SetIcon(IDR_ONLINE,str);			 
			AfxBeginThread(RequestFriendDetail,0,THREAD_PRIORITY_BELOW_NORMAL);			 
			break; 
		} 
	case ONHIDE_OK: 
		{ 
			if(!GetApp()->m_bOnlineState) 
				SetTimer(1,TimerSpanClient,NULL); 
			GetApp()->m_bOnlineState=2; 
			CString str=GetApp()->m_strCurUserDir;				 
			str=str.Left(str.GetLength()-1); 
			m_TrayIcon.SetIcon(IDR_ONHIDE,str); 
			AfxBeginThread(RequestFriendDetail,0,THREAD_PRIORITY_BELOW_NORMAL);			 
			break; 
		} 
	case ALL_FRIEND_ID: 
		{ 
			if(iOnlineState==0)break; 
			CMsg2 msg; 
			CopyDataBuf(&msg,pData); 
			if(!msg.LoadFromBuf()) 
				break;			 
			 
			CString str1; 
			for(int i=0;im_aUserInfo,msg.aFriendId.GetAt(i))!=-1) 
					continue; 
 
				UserInfo* pInfo=new UserInfo;				 
				pInfo->Id=msg.aFriendId.GetAt(i); 
				str1.Format("%d",pInfo->Id); 
				pInfo->HaveDetail=0; 
				lstrcpy(pInfo->Name,str1); 
				FriendState* pState=new FriendState;					 
				pState->OnlineState=0; 
				GetApp()->m_aUserInfo.Add(pInfo);					 
				GetApp()->m_aUserState.Add(pState); 
				GetApp()->m_aUserInfo.GetSize();				 
				 
				m_wndBar.AddItem(0,str1,0,pInfo->Id); 
			}		 
			m_wndBar.Invalidate(); 
			break; 
		} 
	case ONLINE_FRIEND:		 
		{ 
			//current all online friend 
			if(iOnlineState==0)break; 
			CMsgOnlineFriend msg; 
			CopyDataBuf(&msg,pData); 
			if(!msg.LoadFromBuf())break; 
			 
			UserInfo *pInfo=NULL; 
			FriendState *pState=NULL; 
			for(int i=0;im_aUserInfo,GetApp()->m_aUserState,msg.aFriendId.GetAt(i),pInfo,pState)) 
				{ 
					pState->OnlineState=msg.aFriendState.GetAt(i); 
					pState->IP=msg.aFriendIP.GetAt(i); 
					pState->Port=msg.aFriendPort.GetAt(i); 
					if(pState->OnlineState==1) 
						m_wndBar.SetOnlineImage(msg.aFriendId.GetAt(i)); 
				} 
			} 
			m_wndBar.Invalidate();			 
			break; 
		} 
	case RE_FRIEND_DETAIL: 
		{ 
			if(iOnlineState==0)break; 
			CMsgPerson msg; 
			CopyDataBuf(&msg,pData); 
			if(!msg.LoadFromBuf())break; 
 
			TRACE1("Friend Detail %d\n",msg.MyId); 
			UserInfo *pInfo=NULL;			 
			if(FindInArray(GetApp()->m_aUserInfo,pData->MyId,pInfo)) 
			{ 
				pInfo->HaveDetail=1; 
				pInfo->CanbeAdd=msg.Canbeadd; 
				pInfo->Sex=msg.Sex; 
				pInfo->PhotoId=msg.PhotoId; 
				lstrcpy(pInfo->Address,msg.Address); 
				lstrcpy(pInfo->Age,msg.Age);			 
				lstrcpy(pInfo->Department,msg.Department); 
				lstrcpy(pInfo->Description,msg.Description); 
				lstrcpy(pInfo->Email,msg.Email); 
				lstrcpy(pInfo->Fax,msg.Fax); 
				lstrcpy(pInfo->Homepage,msg.Homepage); 
				lstrcpy(pInfo->Phone,msg.Phone); 
				lstrcpy(pInfo->Name,msg.Name);				 
				m_wndBar.ModifyItem(pInfo->Id,pInfo->PhotoId,pInfo->Name); 
				m_wndBar.Invalidate(); 
			} 
			else if(FindInArray(GetApp()->m_aStranger,pData->MyId,pInfo)) 
			{ 
				pInfo->HaveDetail=1; 
				pInfo->CanbeAdd=msg.Canbeadd; 
				pInfo->Sex=msg.Sex; 
				pInfo->PhotoId=msg.PhotoId; 
				lstrcpy(pInfo->Address,msg.Address); 
				lstrcpy(pInfo->Age,msg.Age);			 
				lstrcpy(pInfo->Department,msg.Department); 
				lstrcpy(pInfo->Description,msg.Description); 
				lstrcpy(pInfo->Email,msg.Email); 
				lstrcpy(pInfo->Fax,msg.Fax); 
				lstrcpy(pInfo->Homepage,msg.Homepage); 
				lstrcpy(pInfo->Phone,msg.Phone); 
				lstrcpy(pInfo->Name,msg.Name);				 
				m_wndBar.ModifyItem(pInfo->Id,pInfo->PhotoId,pInfo->Name); 
				m_wndBar.Invalidate(); 
			}			 
			break; 
		} 
	case BE_ADDED_AS_FRIEND: 
	case FRIEND_IDENTITY_VALIDATE: 
		{			 
			if(iOnlineState==0)break; 
			CMsg1 msg; 
			CopyDataBuf(&msg,pData); 
			if(!msg.LoadFromBuf())break; 
			 
			SaveMsg * pMsg=new SaveMsg; 
			if(index==BE_ADDED_AS_FRIEND)pMsg->type=BEADDED_MSG; 
			else pMsg->type=ID_CHECK_MSG; 
 
			pMsg->ID=msg.MyId; 
			pMsg->Time=msg.Time; 
			pMsg->Msg=msg.Msg; 
			GetApp()->m_aSysMsg.Add(pMsg); 
			GetApp()->m_aOtherMsg.Add(pMsg); 
 
			if(m_pShowOther==NULL) 
			{ 
				m_pShowOther=new CShowAddMsgDlg; 
				m_pShowOther->Create(CShowAddMsgDlg::IDD,GetDesktopWindow()); 
			} 
			//m_pShowOther->PostMessage(); 
			 
			 
			TRACE0("R: BE_ADDED_AS_FRIEND\n"); 
			break; 
		} 
	case SYSTEM_BROADCAST: 
	case ACCEPT_AS_FRIEND: 
	case REFUSE_AS_FRIEND: 
		{ 
			if(iOnlineState==0)break; 
			CMsg1 msg; 
			CopyDataBuf(&msg,pData); 
			if(!msg.LoadFromBuf())break; 
			 
			SaveMsg * pMsg=new SaveMsg; 
			pMsg->type=NOTICE_MSG; 
			pMsg->ID=msg.MyId; 
			pMsg->Time=msg.Time; 
			pMsg->Msg=msg.Msg; 
			GetApp()->m_aSysMsg.Add(pMsg); 
			GetApp()->m_aNoticeMsg.Add(pMsg); 
			 
			if(m_pShowNotice==NULL) 
			{ 
				m_pShowNotice=new CShowBroadcastDlg; 
				m_pShowNotice->Create(CShowBroadcastDlg::IDD,GetDesktopWindow()); 
			} 
			m_pShowNotice->PostMessage(WM_SHOW_NOTICE); 
			 
			break; 
		} 
	case TOTAL_ONLINE: 
		{ 
			if(iOnlineState==0)break; 
			CMsg3 msg; 
			CopyDataBuf(&msg,pData); 
			if(!msg.LoadFromBuf())break; 
			 
			if(msg.Value>0) 
			{ 
				GetApp()->m_nTotalOnline=msg.Value; 
				CString str; 
				str.Format("%d人在线",msg.Value); 
				SetWindowText(str); 
			} 
			m_bRecvTotal=TRUE; 
			TRACE0("R: TOTAL_ONLINE\n"); 
			break; 
		}	 
	case NAME_NOT_FOUND_BY_NAME: 
		{			 
			if(iOnlineState==0)break; 
			break; 
		}	 
	case FOUND_FRIEND_BY_ID: 
		{ 
			if(iOnlineState==0)break; 
			CMsgPerson msg; 
			CopyDataBuf(&msg,pData); 
			if(!msg.LoadFromBuf())break; 
			 
			for(int i=0;iHaveDetail=1; 
			pInfo->CanbeAdd=msg.Canbeadd; 
			pInfo->Sex=msg.Sex; 
			pInfo->PhotoId=msg.PhotoId; 
			lstrcpy(pInfo->Address,msg.Address); 
			lstrcpy(pInfo->Age,msg.Age);			 
			lstrcpy(pInfo->Department,msg.Department); 
			lstrcpy(pInfo->Description,msg.Description); 
			lstrcpy(pInfo->Email,msg.Email); 
			lstrcpy(pInfo->Fax,msg.Fax); 
			lstrcpy(pInfo->Homepage,msg.Homepage); 
			lstrcpy(pInfo->Phone,msg.Phone); 
			lstrcpy(pInfo->Name,msg.Name);			 
			m_aTempInfo.Add(pInfo); 
			 
			break; 
		} 
	case ID_NOT_FOUND_BY_ID: 
		{ 
			if(iOnlineState==0)break; 
			 
			break; 
		}	 
	case RE_ADD_AS_FRIEND: 
		{ 
			if(iOnlineState==0)break; 
			CMsg3 msg; 
			CopyDataBuf(&msg,pData); 
			if(!msg.LoadFromBuf())break; 
 
 
			 
			break; 
		}		 
	} 
 
	if(pData) 
		delete pData;	 
	return 0; 
} 
 
void CMainFrame::OnTimer(UINT nIDEvent)  
{ 
	if(nIDEvent==1&&GetApp()->m_bOnlineState) 
	{ 
/*		CString str; 
		if(m_bRecvTotal) 
		{ 
			m_bRecvTotal=FALSE;			 
		} 
		else 
		{ 
			GetApp()->m_bOnlineState=0;					 
			str.Format("%d",GetApp()->m_uCurrentUserID);		 
			m_TrayIcon.SetIcon(IDR_OFFLINE,str); 
			for(int i=0;im_aUserState.GetSize();i++) 
				GetApp()->m_aUserState.GetAt(i)->OnlineState=0; 
			m_wndBar.SetOfflineState();			 
			KillTimer(1); 
		}		 
		str.Format("ID:%d",GetApp()->m_uCurrentUserID); 
		SetWindowText(str);		 
*/	}	 
} 
 
void CMainFrame::OnSendMessage()  
{	 
	UserInfo *pInfo=NULL; 
	FriendState *pState=NULL; 
	if(nGroupFlag==0||nGroupFlag>2) 
	{ 
		FindInArray(GetApp()->m_aUserInfo,GetApp()->m_aUserState,nCurSelID,pInfo,pState);	 
	} 
	else 
	{ 
		FindInArray(GetApp()->m_aStranger,GetApp()->m_aStrangerState,nCurSelID,pInfo,pState); 
	} 
	if(pState->pTalk==NULL) 
	{ 
		pState->pTalk=new CTalkDlg; 
		pState->pTalk->Create(CTalkDlg::IDD,GetDesktopWindow()); 
	} 
	pState->pTalk->SendMessage(WM_SEND_MSG,(WPARAM)pInfo,(LPARAM)pState);	 
} 
 
void CMainFrame::OnUpdateSendMessage(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(GetApp()->m_bOnlineState); 
} 
 
void CMainFrame::OnSendEmail()  
{ 
	UserInfo *pInfo=NULL; 
	FriendState *pState=NULL; 
	if(nGroupFlag==0||nGroupFlag>2) 
	{ 
		FindInArray(GetApp()->m_aUserInfo,GetApp()->m_aUserState,nCurSelID,pInfo,pState);	 
	} 
	else 
	{ 
		FindInArray(GetApp()->m_aStranger,GetApp()->m_aStrangerState,nCurSelID,pInfo,pState); 
	} 
	CString str(pInfo->Email); 
	ShellExecute(NULL,"open","mailto:"+str,NULL,NULL,SW_SHOW);	 
} 
 
void CMainFrame::OnUpdateSendEmail(CCmdUI* pCmdUI)  
{ 
	UserInfo *pInfo=NULL; 
	FriendState *pState=NULL; 
	if(nGroupFlag==0||nGroupFlag>2) 
	{ 
		FindInArray(GetApp()->m_aUserInfo,GetApp()->m_aUserState,nCurSelID,pInfo,pState);	 
	} 
	else 
	{ 
		FindInArray(GetApp()->m_aStranger,GetApp()->m_aStrangerState,nCurSelID,pInfo,pState); 
	} 
	 
	BOOL enabled=pInfo->HaveDetail==1&&lstrlen(pInfo->Email)>0; 
	pCmdUI->Enable(enabled); 
} 
 
void CMainFrame::OnFriendDetail()  
{ 
	UserInfo *pInfo=NULL; 
	FriendState *pState=NULL; 
	if(nGroupFlag==0||nGroupFlag>2) 
	{ 
		FindInArray(GetApp()->m_aUserInfo,GetApp()->m_aUserState,nCurSelID,pInfo,pState);	 
	} 
	else 
	{ 
		FindInArray(GetApp()->m_aStranger,GetApp()->m_aStrangerState,nCurSelID,pInfo,pState); 
	} 
	if(pState->pFInfo==NULL) 
	{ 
		pState->pFInfo=new CFriendDetailDlg; 
		pState->pFInfo->Create(CFriendDetailDlg::IDD,GetDesktopWindow()); 
	} 
	pState->pFInfo->SendMessage(WM_SHOW_FRIEND_DETAIL,(WPARAM)pInfo,(LPARAM)pState);	 
} 
 
void CMainFrame::OnPersonHomepage()  
{		 
	UserInfo *pInfo=NULL; 
	FriendState *pState=NULL; 
	if(nGroupFlag==0||nGroupFlag>2) 
	{ 
		FindInArray(GetApp()->m_aUserInfo,GetApp()->m_aUserState,nCurSelID,pInfo,pState);	 
	} 
	else 
	{ 
		FindInArray(GetApp()->m_aStranger,GetApp()->m_aStrangerState,nCurSelID,pInfo,pState); 
	} 
	CString str(pInfo->Homepage); 
	ShellExecute(NULL,"open","http://"+str,NULL,NULL,SW_SHOW);		 
} 
 
void CMainFrame::OnUpdatePersonHomepage(CCmdUI* pCmdUI)  
{ 
	UserInfo *pInfo=NULL; 
	FriendState *pState=NULL; 
	if(nGroupFlag==0||nGroupFlag>2) 
	{ 
		FindInArray(GetApp()->m_aUserInfo,GetApp()->m_aUserState,nCurSelID,pInfo,pState);	 
	} 
	else 
	{ 
		FindInArray(GetApp()->m_aStranger,GetApp()->m_aStrangerState,nCurSelID,pInfo,pState); 
	} 
	 
	BOOL enabled=pInfo->HaveDetail==1&&lstrlen(pInfo->Homepage)>0; 
	pCmdUI->Enable(enabled); 
} 
 
void CMainFrame::OnOffline()  
{ 
 	if(GetApp()->m_bOnlineState) 
	{ 
		CData msg; 
		msg.index=OFFLINE; 
		msg.MyId=GetApp()->m_uCurrentUserID; 
		msg.tarIP=GetApp()->m_uServerIP; 
		msg.nPort=GetApp()->m_uServerPort; 
 
		GetApp()->m_Socket.SendDataDirect(&msg); 
		GetApp()->m_bOnlineState=0; 
		CString str; 
		str.Format("%d",GetApp()->m_uCurrentUserID);		 
		m_TrayIcon.SetIcon(IDR_OFFLINE,str); 
		for(int i=0;im_aUserState.GetSize();i++) 
			GetApp()->m_aUserState.GetAt(i)->OnlineState=0; 
		m_wndBar.SetOfflineState(); 
		KillTimer(1); 
		str.Format("ID:%d",GetApp()->m_uCurrentUserID); 
		SetWindowText(str);		 
	}	 
} 
 
void CMainFrame::OnOnhide()  
{ 
	if(GetApp()->m_bOnlineState==2)return; 
 
	CData msg; 
	msg.index=ONHIDE; 
	msg.MyId=GetApp()->m_uCurrentUserID; 
	msg.tarIP=GetApp()->m_uServerIP; 
	msg.nPort=GetApp()->m_uServerPort; 
	GetApp()->m_Socket.SendDataDirect(&msg); 
} 
 
void CMainFrame::OnOnline()  
{ 
	if(GetApp()->m_bOnlineState==1)return; 
	CData msg; 
	msg.index=ONLINE; 
	msg.MyId=GetApp()->m_uCurrentUserID; 
	msg.tarIP=GetApp()->m_uServerIP; 
	msg.nPort=GetApp()->m_uServerPort; 
	GetApp()->m_Socket.SendDataDirect(&msg); 
} 
 
void CMainFrame::OnSearch()  
{ 
	if(GetApp()->m_bOnlineState==0) 
	{ 
		AfxMessageBox(IDS_NOT_LOGIN_SERVER); 
		return; 
	} 
 
	if(m_pSearch==NULL) 
	{ 
		m_pSearch=new CSearchDlg; 
		m_pSearch->Create(CSearchDlg::IDD,GetDesktopWindow()); 
	} 
	m_pSearch->ShowWindow(SW_NORMAL);	 
} 
 
void CMainFrame::OnPersoninfoSetup()  
{ 
	if(m_pModifyPI==NULL) 
	{ 
		m_pModifyPI=new CModifyPIDlg; 
		m_pModifyPI->Create(CModifyPIDlg::IDD,GetDesktopWindow()); 
	} 
	m_pModifyPI->SendMessage(WM_SHOW_FRIEND_DETAIL,(WPARAM)(GetApp()->m_aUserInfo.GetAt(0)),0);		 
} 
 
void CMainFrame::OnMultisend()  
{ 
	if(GetApp()->m_bOnlineState==0) 
	{ 
		AfxMessageBox(IDS_NOT_LOGIN_SERVER); 
		return; 
	} 
 
	if(m_pMultiSend==NULL) 
	{ 
		m_pMultiSend=new CMultiSendDlg; 
		m_pMultiSend->Create(CMultiSendDlg::IDD,GetDesktopWindow()); 
	} 
	m_pMultiSend->ShowWindow(SW_NORMAL);		 
} 
 
void CMainFrame::OnSendtoAll()  
{ 
	if(GetApp()->m_bOnlineState==0) 
	{ 
		AfxMessageBox(IDS_NOT_LOGIN_SERVER); 
		return; 
	} 
	if(m_pSendToAll==NULL) 
	{ 
		m_pSendToAll=new CSendToAllDlg; 
		m_pSendToAll->Create(CSendToAllDlg::IDD,GetDesktopWindow()); 
	} 
	m_pSendToAll->ShowWindow(SW_NORMAL);	 
} 
 
void CMainFrame::OnMessageManage()  
{ 
	AfxMessageBox(IDS_NOT_FINISH);	 
} 
 
void CMainFrame::OnShowOnline()  
{ 
	if(GetApp()->m_bOnlineState==0) 
	{ 
		AfxMessageBox(IDS_NOT_LOGIN_SERVER); 
		return; 
	} 
 
	if(m_pShowOnline==NULL) 
	{ 
		m_pShowOnline=new CShowOnlineDlg; 
		m_pShowOnline->Create(CShowOnlineDlg::IDD,GetDesktopWindow()); 
	} 
	m_pShowOnline->ShowWindow(SW_NORMAL);	 
} 
 
void CMainFrame::OnSendBroadcast()  
{ 
	if(GetApp()->m_bOnlineState==0) 
	{ 
		CString str; 
		str.LoadString(IDS_NOT_LOGIN_SERVER); 
		MessageBox(str); 
		return; 
	} 
	if(m_pSendBroad==NULL) 
	{ 
		m_pSendBroad=new CSendBroadcastDlg; 
		m_pSendBroad->Create(CSendBroadcastDlg::IDD,GetDesktopWindow()); 
	} 
	m_pSendBroad->ShowWindow(SW_NORMAL);	 
} 
 
LRESULT CMainFrame::OnAddFriendRefresh(WPARAM wParam,LPARAM lParam) 
{ 
	DWORD uFriendID=wParam; 
	if(uFriendID<=0)return 0; 
	if(FindInArray(GetApp()->m_aUserInfo,uFriendID)!=-1)return 0; 
 
	UserInfo* pInfo=NULL; 
	FriendState* pState=NULL; 
	int rindex=FindInArray(GetApp()->m_aStranger,uFriendID); 
	if(rindex!=-1) 
	{ 
		pInfo=GetApp()->m_aStranger.GetAt(rindex);		 
		pState=GetApp()->m_aStrangerState.GetAt(rindex); 
		GetApp()->m_aStranger.RemoveAt(rindex); 
		GetApp()->m_aStrangerState.RemoveAt(rindex); 
		m_wndBar.RemoveAItem(1,uFriendID,FALSE); 
	} 
	else 
	{ 
		pInfo=new UserInfo;				 
		pInfo->Id=uFriendID;	 
		pInfo->HaveDetail=0; 
		pInfo->PhotoId=0; 
		itoa(uFriendID,pInfo->Name,10);	 
		pState=new FriendState; 
		pState->OnlineState=0; 
	} 
	GetApp()->m_aUserInfo.Add(pInfo);					 
	GetApp()->m_aUserState.Add(pState);	 
	m_wndBar.AddItem(0,pInfo->Name,pInfo->PhotoId,pInfo->Id);	 
	m_wndBar.Invalidate(); 
	if(!pInfo->HaveDetail) 
	{ 
		CMsg1 msg; 
		msg.index=FRIEND_DETAIL; 
		msg.MyId=GetApp()->m_uCurrentUserID; 
		msg.tarIP=GetApp()->m_uServerIP; 
		msg.nPort=GetApp()->m_uServerPort; 
		msg.FriendId=uFriendID; 
		GetApp()->m_Socket.SendDataDirect(&msg); 
	} 
	return 1; 
} 
 
void CMainFrame::OnAddFriend()  
{ 
 	if(m_pAddFriendDlg==NULL) 
	{ 
		m_pAddFriendDlg=new CAddFriendDlg; 
		m_pAddFriendDlg->Create(CAddFriendDlg::IDD); 
	} 
	m_pAddFriendDlg->uID=nCurSelID; 
	if(m_pAddFriendDlg->SendMessage(WM_NOTICE_ADDFRIEND)) 
	m_wndBar.RemoveAItem(1,nCurSelIndex); 
} 
 
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)  
{ 
	if(pMsg->message==WM_KEYDOWN) 
	{ 
		if(pMsg->wParam>'0' &&pMsg->wParam<'5'&&GetKeyState(VK_CONTROL)&0x80) 
		{ 
			nCurSelIndex=pMsg->wParam-'1'; 
			nGroupFlag=m_wndBar.iSelFolder;				 
			nCurSelID = m_wndBar.GetItemData(nCurSelIndex); 
			if(nCurSelID!=0)SendMessage(WM_COMMAND,ID_SEND_MESSAGE,0);		 
			return 1; 
		}		 
	} 
	return CFrameWnd::PreTranslateMessage(pMsg); 
}