www.pudn.com > MultiLineChatRoomVCSrc.zip > MyTreeView.cpp


// MyTreeView.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "ChatClient.h" 
#include "MyTreeView.h" 
#include "ClientLog.h" 
#include "SendMessageDlg.h" 
#include "ClientFormView.h" 
#include "MainFrm.h" 
#include "ShowMessage.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CMyTreeView 
 
IMPLEMENT_DYNCREATE(CMyTreeView, CTreeView) 
 
CMyTreeView::CMyTreeView():m_Tree(GetTreeCtrl()) 
{ 
 
} 
 
CMyTreeView::~CMyTreeView() 
{ 
 
} 
 
 
BEGIN_MESSAGE_MAP(CMyTreeView, CTreeView) 
	//{{AFX_MSG_MAP(CMyTreeView) 
	ON_WM_CREATE() 
	ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick) 
	ON_COMMAND(ID_JOININROOM, OnJoininroom) 
	ON_COMMAND(ID_MENU_SEND, OnMenuSend) 
	ON_WM_LBUTTONDBLCLK() 
	ON_NOTIFY_REFLECT(NM_RDBLCLK, OnRclick) 
	ON_NOTIFY_REFLECT(NM_DBLCLK, OnRclick) 
	ON_COMMAND(ID_MENU_TRANSEFILE, OnMenuTransefile) 
	//}}AFX_MSG_MAP 
	ON_MESSAGE(WM_FILETIME,OnFileTime) 
	ON_MESSAGE(WM_ADDNEWROOM,AddNewRoom) 
	ON_MESSAGE(WM_NEWCLIENTCOMEIN,OnNewClientIn) 
	ON_MESSAGE(WM_USERLOGOUT,OnClientOut) 
	ON_MESSAGE(WM_SAYINPRIVATE,OnSayInPrivate) 
	ON_MESSAGE(WM_FILETRANCE,OnFileTrance) 
	ON_MESSAGE(WM_ACCEPTFILE,OnAcceptFile) 
 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CMyTreeView drawing 
 
void CMyTreeView::OnDraw(CDC* pDC) 
{ 
	CDocument* pDoc = GetDocument(); 
	// TODO: add draw code here 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMyTreeView diagnostics 
 
#ifdef _DEBUG 
void CMyTreeView::AssertValid() const 
{ 
	CTreeView::AssertValid(); 
} 
 
void CMyTreeView::Dump(CDumpContext& dc) const 
{ 
	CTreeView::Dump(dc); 
} 
#endif //_DEBUG 
extern CChatClientApp theApp; 
void CMyTreeView::AddNewRoom(WPARAM wParam,LPARAM lParam) 
{ 
		//CString 
	CMainFrame * m_pMainFrame = (CMainFrame *)AfxGetMainWnd(); 
	ASSERT_VALID(m_pMainFrame); 
	ASSERT(m_pMainFrame != NULL); 
	//CClientFormView *pFormView = m_pMainFrame->GetFormView(); 
	//pFormView->SetDlgItemText(IDC_SELFNAME,theApp.m_skMainSocket.GetUserName()); 
	Message *m_pNewRoom = (Message *)wParam; 
	CString strRoom = m_pNewRoom ->strRoom; 
	m_Tree.InsertItem(strRoom,2,3,m_ParentItem); 
	m_Tree.Expand(m_ParentItem,TVE_EXPAND); 
	 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMyTreeView message handlers 
 
int CMyTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CTreeView::OnCreate(lpCreateStruct) == -1) 
		return -1; 
 
 
	// TODO: Add your specialized creation code here 
	m_ImageList.Create(IDB_IMAGELIST,16,4,RGB(255,0,255)); 
	m_Tree.SetImageList(&m_ImageList,TVSIL_NORMAL); 
	m_ParentItem = m_Tree.InsertItem("聊天室列表",2,3); 
	 
	return 0; 
} 
extern CChatClientApp theApp; 
 
void CMyTreeView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	 
	CMenu menu; 
 
	CMenu * pContextMenu;  
	POINT point; 
	GetCursorPos(&point); 
//	CTreeView::OnLButtonDown(0,point); 
	ScreenToClient(&point); 
	 
	HTREEITEM hItem = m_Tree.GetSelectedItem(); 
	CRect rect; 
	m_Tree.GetItemRect(hItem,&rect,TRUE); 
 
	if(rect.PtInRect(point)) 
	{ 
		if(m_Tree.GetParentItem(hItem) == m_ParentItem) 
		{ 
			menu.LoadMenu(IDR_JOINROOM); 
			pContextMenu = menu.GetSubMenu(0); 
			ClientToScreen(&point); 
			 
			pContextMenu->TrackPopupMenu(TPM_LEFTBUTTON   ,point.x,point.y ,this); 
		} 
		else 
		{ 
			if(hItem != m_ParentItem && m_Tree.GetItemText(hItem) != theApp.m_skMainSocket.GetUserName() && theApp.m_skMainSocket.GetState() == HAVELOGIN) 
			{ 
				HTREEITEM hParent = m_Tree.GetParentItem(hItem); 
				CString strRoom = m_Tree.GetItemText(hParent); 
				if(strRoom == theApp.m_skMainSocket.GetRoomName()) 
				{ 
					menu.LoadMenu(IDR_CLIENT); 
					pContextMenu = menu.GetSubMenu(0); 
					ClientToScreen(&point); 
					 
					pContextMenu->TrackPopupMenu(TPM_LEFTBUTTON   ,point.x,point.y ,this); 
					 
				} 
				else 
					AfxMessageBox("处于不同的房间内,不能执行此项操作"); 
			} 
 
		} 
	} 
 
 
	*pResult = 0; 
} 
extern CChatClientApp theApp; 
void CMyTreeView::OnJoininroom()  
{ 
	// TODO: Add your command handler code here 
	Message msObj; 
	HTREEITEM hItem; 
	 
	if(theApp.m_skMainSocket.GetState() == NOTLOGIN) 
	{ 
	//构造msobj 
	 
 
		hItem = m_Tree.GetSelectedItem(); 
		CString strRoomName = m_Tree.GetItemText(hItem); 
		CString strUsrName = theApp.m_skMainSocket.GetUserName(); 
	//	theApp.m_skMainSocket.SetUserName(strUsrName); 
		theApp.m_skMainSocket.SetRoomName(strRoomName); 
		theApp.m_skMainSocket.SetState(HAVELOGIN); 
	 
 
		msObj.iType = USERLOG; 
		msObj.iSubType = USERLOGIN; 
		int iLen = strRoomName.GetLength(); 
		iLen > 20 ? 20: iLen; 
		lstrcpy(msObj.strRoom,strRoomName.GetBuffer(iLen)); 
		strRoomName.ReleaseBuffer(); 
		 
		iLen = strUsrName.GetLength(); 
		iLen > 20 ? 20 : iLen; 
		lstrcpy(msObj.strName,strUsrName.GetBuffer(iLen)); 
		strUsrName.ReleaseBuffer(); 
		 
		iLen = theApp.m_skMainSocket.Send(&msObj,sizeof(msObj)); 
		if(iLen < sizeof(msObj)) 
		{ 
			AfxMessageBox("发送失败"); 
			return; 
		}	 
	} 
	else 
		if(theApp.m_skMainSocket.GetState() == HAVELOGIN) 
		{ 
			HTREEITEM hItem = m_Tree.GetSelectedItem(); 
			CString strRoomName = m_Tree.GetItemText(hItem); 
			if(strRoomName != theApp.m_skMainSocket.GetRoomName()) 
			{ 
				 
				HTREEITEM hItem = m_Tree.GetChildItem(m_ParentItem); 
							 
				msObj.iType = USERSESSION; 
				msObj.iSubType = CHANGEROOM; 
				//用户名 
				CString strTemp; 
				strTemp =  theApp.m_skMainSocket.GetUserName(); 
				int iLen = strTemp.GetLength(); 
				iLen > 20 ? 20:iLen; 
				lstrcpy(msObj.strName,strTemp.GetBuffer(iLen)); 
				strTemp.ReleaseBuffer(); 
				//旧房件名 
				strTemp = theApp.m_skMainSocket.GetRoomName(); 
				iLen = strTemp.GetLength(); 
				iLen > 20 ? 20 : iLen; 
				lstrcpy(msObj.strRoom,strTemp.GetBuffer(iLen)); 
				strTemp.ReleaseBuffer(); 
				//新房间名 
				hItem = m_Tree.GetSelectedItem(); 
				strTemp = m_Tree.GetItemText(hItem); 
				iLen = strTemp.GetLength(); 
				iLen > 20 ? 20 :iLen; 
				lstrcpy(msObj.strContent,strTemp.GetBuffer(iLen)); 
				strTemp.ReleaseBuffer(); 
				 
				if(theApp.m_skMainSocket.Send(&msObj,sizeof(msObj)) != sizeof(msObj)) 
				{ 
					AfxMessageBox("发送错误"); 
				} 
				theApp.m_skMainSocket.SetRoomName(m_Tree.GetItemText(hItem)); 
			} 
		}			 
	return; 
	 
} 
void CMyTreeView::OnClientOut(WPARAM wParam, LPARAM lParam) 
{ 
	Message msObj = *(Message*)wParam; 
	CString strRoom = msObj.strRoom; 
	CString strUsrName = msObj.strName; 
	HTREEITEM	hItem = m_Tree.GetChildItem(m_ParentItem); 
	BOOL bFind = FALSE; 
	while(hItem && !bFind) 
	{ 
		CString strNodeName = m_Tree.GetItemText(hItem); 
		if(strNodeName == strRoom) 
		{ 
			//查找用户名的那一项 
			HTREEITEM hChildItem = m_Tree.GetChildItem(hItem); 
			while(hChildItem) 
			{ 
				CString strUserNode = m_Tree.GetItemText(hChildItem); 
				if(strUserNode == strUsrName) 
				{ 
					m_Tree.DeleteItem(hChildItem); 
					m_Tree.Expand(hItem,TVE_EXPAND); 
					bFind = TRUE; 
					break; 
				} 
				hChildItem = m_Tree.GetNextItem(hChildItem,1); 
			} 
			 
		 
		} 
		hItem = m_Tree.GetNextItem(hItem,1); 
	} 
} 
void CMyTreeView::OnNewClientIn(WPARAM wParam, LPARAM lParam) 
{ 
	Message msObj = *(Message*)wParam; 
	CString strRoom = msObj.strRoom; 
	CString strUsrName = msObj.strName; 
	if(strRoom == theApp.m_skMainSocket.GetRoomName() && strUsrName == theApp.m_skMainSocket.GetUserName()) 
	{ 
		CClientFormView * m_pFormView =(CClientFormView *) ((CMainFrame * )AfxGetMainWnd())->GetFormView(); 
		ASSERT(m_pFormView != NULL); 
		ASSERT_VALID(m_pFormView); 
		m_pFormView ->SetDlgItemText(IDC_SELFNAME,strUsrName); 
		m_pFormView ->SetDlgItemText(IDC_ROOMNAME,strRoom); 
		return; 
	} 
 
	HTREEITEM hItem = m_Tree.GetChildItem(m_ParentItem); 
	while(hItem) 
	{ 
		CString strNodeName = m_Tree.GetItemText(hItem); 
		CString strTemp = theApp.m_skMainSocket.GetUserName(); 
		if(strNodeName == strRoom) 
		{ 
			if(strUsrName != strTemp) 
			{ 
				m_Tree.InsertItem(strUsrName,0,1,hItem); 
				m_Tree.Expand(hItem,TVE_EXPAND); 
				break; 
			} 
		} 
		hItem = m_Tree.GetNextItem(hItem,1); 
	} 
 
 
} 
 
void CMyTreeView::OnMenuSend()  
{ 
	// TODO: Add your command handler code here 
	CSendMessageDlg Dlg; 
	 
	if(Dlg.DoModal() == IDOK) 
	{ 
		if(Dlg.m_strSentence.GetLength()) 
		{ 
			if(Dlg.m_strSentence.GetLength == 0) 
				return; 
			Message msObj; 
			memset(&msObj,0,sizeof(Message)); 
			msObj.iType = USERSESSION; 
			msObj.iSubType = SAYINPRIVATE; 
			CString strTemp  = theApp.m_skMainSocket.GetRoomName(); 
			int iLen = strTemp.GetLength(); 
			lstrcpy(msObj.strRoom,strTemp.GetBuffer(iLen)); 
			strTemp.ReleaseBuffer(); 
			strTemp = Dlg.m_strSentence; 
			iLen = strTemp.GetLength(); 
			iLen > 1024 ? 1024 : iLen; 
			lstrcpy(msObj.strContent,strTemp.GetBuffer(iLen)); 
			strTemp.ReleaseBuffer(); 
			//自己的名字 
			strTemp = theApp.m_skMainSocket.GetUserName(); 
			iLen = strTemp.GetLength(); 
			iLen > 20 ? 20:iLen; 
			lstrcpy(msObj.strName,strTemp.GetBuffer(iLen)); 
			strTemp.ReleaseBuffer(); 
			//说话对象的名字 
			HTREEITEM hItem = m_Tree.GetSelectedItem(); 
			strTemp = m_Tree.GetItemText(hItem); 
			iLen = strTemp.GetLength(); 
			iLen > 20 ? 20 : iLen; 
			lstrcpy(msObj.strClientName,strTemp.GetBuffer(iLen)); 
			strTemp.ReleaseBuffer(); 
 
			 iLen = theApp.m_skMainSocket.Send(&msObj,sizeof(Message)); 
 
 
		} 
		 
	} 
 
	return;	 
} 
void CMyTreeView::OnSayInPrivate(WPARAM wParam,LPARAM lParam) 
{ 
	Message msObj = *(Message *)wParam; 
	CString strContent  = msObj.strContent; 
	CString strName = msObj.strName; 
//	AfxMessageBox("ok"); 
	CShowMessage Dlg(strContent,strName); 
	Dlg.DoModal(); 
	return; 
} 
 
BOOL CMyTreeView::PreCreateWindow(CREATESTRUCT& cs)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	cs.style |= TVS_HASLINES; 
	cs.style |= TVS_LINESATROOT; 
	cs.style |= TVS_HASBUTTONS; 
	return CTreeView::PreCreateWindow(cs); 
} 
 
void CMyTreeView::OnMenuTransefile()  
{ 
	// TODO: Add your command handler code here 
	Message msObj; 
	memset(&msObj,0,sizeof(Message)); 
	msObj.iType = USERSESSION; 
	msObj.iSubType = FILETRANCE; 
	 
	CString strTemp  = theApp.m_skMainSocket.GetRoomName(); 
	int iLen = strTemp.GetLength(); 
	lstrcpy(msObj.strRoom,strTemp.GetBuffer(iLen)); 
	strTemp.ReleaseBuffer(); 
/*	strTemp = Dlg.m_strSentence; 
	iLen = strTemp.GetLength(); 
	iLen > 1024 ? 1024 : iLen; 
	lstrcpy(msObj.strContent,strTemp.GetBuffer(iLen)); 
	strTemp.ReleaseBuffer(); 
	theApp.m_skMainSocket.Send(&msObj,sizeof(Message));*/ 
	//自己的名字 
	strTemp = theApp.m_skMainSocket.GetUserName(); 
	iLen = strTemp.GetLength(); 
	iLen > 20 ? 20:iLen; 
	lstrcpy(msObj.strName,strTemp.GetBuffer(iLen)); 
	strTemp.ReleaseBuffer(); 
	//说话对象的名字 
	HTREEITEM hItem = m_Tree.GetSelectedItem(); 
	strTemp = m_Tree.GetItemText(hItem); 
	iLen = strTemp.GetLength(); 
	iLen > 20 ? 20 : iLen; 
	lstrcpy(msObj.strClientName,strTemp.GetBuffer(iLen)); 
	strTemp.ReleaseBuffer(); 
	iLen = theApp.m_skMainSocket.Send(&msObj,sizeof(Message)); 
	return; 
 
} 
void CMyTreeView::OnFileTrance(WPARAM wParam,LPARAM lParam) 
{ 
	Message msObj = *(Message *)wParam; 
	CString strTitle = msObj.strName; 
	strTitle+="给你传送文件,接受?"; 
	if(AfxMessageBox(strTitle,IDRETRY) == IDYES) 
	{ 
		msObj.iSubType = ACCEPTFILE; 
	} 
	else 
		msObj.iSubType = DECLINEFILE; 
	msObj.iType = USERSESSION; 
	 
	CString strName = msObj.strName; 
	CString strClientName = msObj.strClientName; 
	 
	int iLen = strName.GetLength(); 
	iLen > 20 ? 20 : iLen; 
	lstrcpy(msObj.strClientName,strName.GetBuffer(iLen)); 
	strName.ReleaseBuffer(); 
	iLen = strClientName.GetLength(); 
	iLen > 20 ? 20 :iLen; 
	lstrcpy(msObj.strName,strClientName.GetBuffer(iLen)); 
	strClientName.ReleaseBuffer(); 
	 
	theApp.m_skMainSocket.Send(&msObj,sizeof(Message)); 
	 
	 
 
	return; 
 
} 
void CMyTreeView::OnAcceptFile(WPARAM wParam,LPARAM lParam) 
{ 
	CFileDialog Dlg(TRUE,"*.*"); 
	Message  msObj = *(Message *)wParam; 
 
	if(Dlg.DoModal() == IDOK) 
	{ 
		//把ClientName和Name名字互相交换 
		CString strName = msObj.strName; 
		CString strClientName = msObj.strClientName; 
		 
		int iLen = strName.GetLength(); 
		iLen > 20 ? 20 : iLen; 
		lstrcpy(msObj.strClientName,strName.GetBuffer(iLen)); 
		strName.ReleaseBuffer(); 
		iLen = strClientName.GetLength(); 
		iLen > 20 ? 20 :iLen; 
		lstrcpy(msObj.strName,strClientName.GetBuffer(iLen)); 
		strClientName.ReleaseBuffer(); 
		 
		 
		CString strFile = Dlg.GetFileName(); 
		CFile FileToSend; 
		if(FileToSend.Open(strFile,CFile::modeRead && CFile::typeBinary)) 
		{ 
			 
			msObj.iType = FILETIME; 
			msObj.iSubType = FILETIMEBEGIN; 
			iLen = strFile.GetLength(); 
			iLen > 1024 ? 1024: iLen; 
			lstrcpy(msObj.strContent,strFile.GetBuffer(iLen)); 
			strFile.ReleaseBuffer(); 
			theApp.m_skMainSocket.Send(&msObj,sizeof(Message)); 
			Sleep(100); 
			char FileContent[1024]; 
			memset(FileContent,0,1024); 
			DWORD dwFileLength = FileToSend.GetLength(); 
			 
			while(dwFileLength>0) 
			{ 
				iLen = FileToSend.Read(FileContent,1024); 
				msObj.iSubType = FILECONTENTLEN; 
				CString strTemp; 
				strTemp.Format("%d",iLen); 
				int iTempLen = strTemp.GetLength(); 
				iTempLen > 1024?1024:iTempLen; 
				lstrcpy(msObj.strContent,strTemp.GetBuffer(iTempLen)); 
				strTemp.ReleaseBuffer(); 
 
				theApp.m_skMainSocket.Send(&msObj,sizeof(Message)); 
 
				Sleep(100); 
			//	if(iLen == 1024) 
				msObj.iSubType = FILETIMEDURING; 
			//	else 
			//		msObj.iSubType = FILETIMEEND; 
				lstrcpy(msObj.strContent,FileContent); 
				theApp.m_skMainSocket.Send(&msObj,sizeof(Message)); 
				Sleep(100); 
				dwFileLength -= iLen; 
 
			} 
			msObj.iSubType = FILETIMEEND; 
			theApp.m_skMainSocket.Send(&msObj,sizeof(Message)); 
			FileToSend.Close(); 
				 
	 
			 
		} 
	 
		 
		 
	} 
	return; 
} 
void CMyTreeView::OnFileTime(WPARAM wParam,LPARAM lParam) 
{ 
 
	Message  msObj = *(Message *)wParam; 
	CString strTemp; 
	char  FileContent[1024]; 
	int iLen = 0; 
	CFile FileToSave; 
	CFileDialog Dlg(FALSE,"*.*"); 
	switch(msObj.iSubType) 
	{ 
	default: 
		break; 
	case FILETIMEBEGIN: 
		if(Dlg.DoModal() == IDOK) 
		{ 
			strTemp = Dlg.GetPathName(); 
		} 
		else 
			strTemp = msObj.strContent; 
		if(FileToSave.Open(strTemp,CFile::modeCreate && CFile::typeBinary)) 
		{ 
		} 
		break; 
	case FILECONTENTLEN: 
		strTemp = msObj.strContent; 
		iLen = atoi(strTemp.GetBuffer(strTemp.GetLength())); 
		break; 
	case FILETIMEDURING: 
		memset(FileContent,0,1024); 
		theApp.m_skMainSocket.Receive(FileContent,iLen); 
		if(iLen) 
		FileToSave.Write(FileContent,1); 
		break; 
	case FILETIMEEND: 
		memset(FileContent,0,1024); 
		theApp.m_skMainSocket.Receive(FileContent,iLen); 
		if(iLen) 
			FileToSave.Write(FileContent,1); 
		FileToSave.Close(); 
		AfxMessageBox("文件传送完毕"); 
 
		break; 
 
	} 
	return; 
}