⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mytreeview.cpp

📁 QQ示例源码
💻 CPP
字号:
// MyTreeView.cpp : implementation file
//

#include "stdafx.h"
#include "CChatServer.h"
#include "MyTreeView.h"
#include "ClientSocket.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_WM_TIMER()
	//}}AFX_MSG_MAP

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

/////////////////////////////////////////////////////////////////////////////
// CMyTreeView message handlers

void CMyTreeView::OnInitialUpdate() 
{
	CTreeView::OnInitialUpdate();
	
	
}
extern CCChatServerApp theApp;
int CMyTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CTreeView::OnCreate(lpCreateStruct) == -1)
		return -1;
	

		// TODO: Add your specialized creation code here
	m_ImageList.Create(IDB_IMAGELIST,32,1,RGB(255,0,255));
	m_Tree.SetImageList(&m_ImageList,TVSIL_NORMAL);
	m_ParentItem = m_Tree.InsertItem("聊天室列表",2,3);

	POSITION pos = theApp.m_ChatRoomList.GetHeadPosition();
	for(int i = 0; i < theApp.m_ChatRoomList.GetCount(); i ++)
	{
		CString * m_pstrRoom = static_cast <CString *>(theApp.m_ChatRoomList.GetNext(pos));
		m_Tree.InsertItem(m_pstrRoom->GetBuffer(8),2,3,m_ParentItem);
	//	m_pstrRoom = static_cast <CString *>(theApp.m_ChatRoomList.GetNext(pos));
	}
	m_Tree.Expand(m_ParentItem,TVE_EXPAND);
	
	return 0;
}
void CMyTreeView::OnClientOut(Message 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);
	}
	//向所有用户发送用户退出消息
	//重新构造msObj
	msObj .iType = USERLOG;
	msObj .iSubType = USERLOGOUT;
	int iLen = strUsrName.GetLength();
	iLen > 20 ? 20 : iLen;
	lstrcpy(msObj .strName,strUsrName.GetBuffer(iLen));
	strUsrName.ReleaseBuffer();
	iLen = strRoom.GetLength();
	iLen > 20 ? 20 : iLen;
	lstrcpy(msObj .strRoom,strRoom.GetBuffer(iLen));
	strRoom.ReleaseBuffer();
	g_cs.Lock();
	CPtrList * m_pClientList = theApp.m_pClientSocketList;
	POSITION pos = m_pClientList ->GetHeadPosition();
	if(pos)
	{
		CClientSocket *  m_pClientSocket;
		for(int i = 0; i < m_pClientList ->GetCount(); i++)
		{
			m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
			CString strTemp = m_pClientSocket ->GetRoomName();
			m_pClientSocket ->Send(&msObj,sizeof(Message));
			
			Sleep(100);
			
		}
	}
	g_cs.Unlock();

}
void CMyTreeView::OnNewClientIn(Message wParam, LPARAM lParam)
{
	Message msObj = wParam;
	CString strRoom = msObj.strRoom;
	CString strUsrName = msObj.strName;
	HTREEITEM hItem = m_Tree.GetChildItem(m_ParentItem);
	while(hItem)
	{
		CString strNodeName = m_Tree.GetItemText(hItem);
		if(strNodeName == strRoom)
		{
			m_Tree.InsertItem(strUsrName,0,1,hItem);
			m_Tree.Expand(hItem,TVE_EXPAND);
			break;
		}
		hItem = m_Tree.GetNextItem(hItem,1);
	}

	//给所有的用户发送消息
	msObj .iType = USERLOG;
	msObj .iSubType = USERLOGIN;
	int iLen = strUsrName.GetLength();
	iLen > 20 ? 20 : iLen;
	lstrcpy(msObj .strName,strUsrName.GetBuffer(iLen));
	strUsrName.ReleaseBuffer();
	iLen = strRoom.GetLength();
	iLen > 20 ? 20 : iLen;
	lstrcpy(msObj .strRoom,strRoom.GetBuffer(iLen));
	strRoom.ReleaseBuffer();
	g_cs.Lock();
	CPtrList * m_pClientList = theApp.m_pClientSocketList;
	int iCount = m_pClientList->GetCount();
	POSITION pos = m_pClientList ->GetHeadPosition();
	
	if(pos)
	{	 
		for(int i = 0; i < m_pClientList ->GetCount(); i++)
		{
			CClientSocket *m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
			iLen = m_pClientSocket ->Send(&msObj,sizeof(Message));
			
			Sleep(100);
	
			
		}
	}
	g_cs.Unlock();
	return;

}
void CMyTreeView::OnChangeRoom(Message wParam, LPARAM lParam)
{
	Message msObj = wParam;
	CString strName = msObj .strName;
	CString strNewRoom = msObj.strContent;
	int iType = msObj .iType;
	int iSubType = msObj.iSubType;

	OnClientOut(msObj,0);

	msObj .iSubType = iSubType;
	msObj .iType = iType;
	int iLen = strName.GetLength();
	iLen > 20 ? 20 : iLen;
	lstrcpy(msObj .strName,strName.GetBuffer(iLen));

	iLen = strNewRoom.GetLength();
	iLen > 20 ? 20 : iLen;
	lstrcpy(msObj .strRoom,strNewRoom.GetBuffer(iLen));
	strNewRoom.ReleaseBuffer();
	OnNewClientIn(msObj,lParam);
	return;

}
void CMyTreeView::OnSendInPrivate(Message wParam,LPARAM lParam)
{
	Message msObj = wParam;
	CString strUserName = msObj.strName;
	CString strClientName = msObj.strClientName;
	g_cs.Lock();
	CPtrList * m_pClientList = theApp.m_pClientSocketList;
	int iCount = m_pClientList->GetCount();
	POSITION pos = m_pClientList ->GetHeadPosition();
	//找到用户发送
	if(pos)
	{	 
		for(int i = 0; i < m_pClientList ->GetCount(); i++)
		{
			CClientSocket *m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
			CString strName = m_pClientSocket ->GetUserName();
			if(strName == strClientName )
			{
				m_pClientSocket ->Send(&msObj,sizeof(Message));
				CString strOut;
				strOut.Format("%d %d %s %s\n",msObj.iType,msObj.iSubType,msObj.strRoom,msObj.strName);
				TRACE0(strOut);

				g_cs.Unlock();
				return;
			}
			
		}
	}
	g_cs.Unlock();
	return;
}


void CMyTreeView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	
	CTreeView::OnTimer(nIDEvent);
}

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -