www.pudn.com > dataCS.rar > ClientDlg.cpp


// ClientDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "Client.h" 
#include "ClientDlg.h" 
#include "senddlg.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX }; 
	//}}AFX_DATA 
 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
		// No message handlers 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CClientDlg dialog 
 
CClientDlg::CClientDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CClientDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CClientDlg) 
	m_strHost = _T(""); 
	m_strName = _T(""); 
	m_strPwd = _T(""); 
	m_iPort = 0; 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CClientDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CClientDlg) 
	DDX_Control(pDX, IDC_LIST1, m_ctrList); 
	DDX_Text(pDX, IDC_EDIT1, m_strHost); 
	DDX_Text(pDX, IDC_EDIT2, m_strName); 
	DDX_Text(pDX, IDC_EDIT3, m_strPwd); 
	DDX_Text(pDX, IDC_EDIT5, m_iPort); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CClientDlg, CDialog) 
	//{{AFX_MSG_MAP(CClientDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_BUTTON_SEND, OnButtonSend) 
	ON_BN_CLICKED(IDC_BUTTON1, OnLogin) 
	ON_LBN_DBLCLK(IDC_LIST1, OnDblclkList) 
	ON_LBN_SELCHANGE(IDC_LIST1, OnSelchangeList) 
	ON_BN_CLICKED(IDC_BUTTON_NOTICE, OnSendNotice) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CClientDlg message handlers 
 
BOOL CClientDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Add "About..." menu item to system menu. 
 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application's main window is not a dialog 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
	 
	// TODO: Add extra initialization here 
	//Expand(false); 
	m_strHost="192.168.0.3"; 
	m_iPort=1234; 
	UpdateData(FALSE); 
    GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(false); 
	Expand(0); 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CClientDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CClientDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CClientDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
void CClientDlg::OnButtonSend()  
{ 
 
	UpdateData(TRUE);	 
	CString strTo; 
	m_ctrList.GetText(nIndex,strTo); 
	CSendDlg dlg; 
	if(dlg.DoModal ()==IDOK) 
	{ 
	    msg.m_eType=CHATTING; 
	    msg.m_strMsg=strTo+"|"+dlg.m_strMsg; 
		msg.Serialize(*m_pArOut); 
		m_pArOut->Flush(); 
	} 
 
} 
 
void CClientDlg::OnLogin()  
{ 
     UpdateData(TRUE); 
     GetDlgItem(IDC_BUTTON1)->SetWindowText("Wait"); 
	 m_pSocket=new CMySocket(this); 
	 m_pSocket->Create(); 
	 int nTry=3,n; 
	 do{ 
	 n=m_pSocket->Connect (m_strHost,m_iPort); 
	 }while(n!=1 && nTry--); 
	if(n==1) 
	 {  
         Sleep(2000); 
		 m_pSF=new CSocketFile(m_pSocket); 
	     m_pArOut=new CArchive(m_pSF,CArchive::store); 
	     m_pArIn=new CArchive(m_pSF,CArchive::load); 
	     msg.m_eType =LOGIN; 
	     msg.m_strMsg =m_strName+"|"+m_strPwd; 
	     msg.Serialize (*m_pArOut); 
	     m_pArOut->Flush(); 
 
 
	 } 
	 else 
	 { 
		 GetDlgItem(IDC_BUTTON1)->SetWindowText("Login"); 
		 GetDlgItem(IDC_BUTTON1)->EnableWindow(true); 
		 AfxMessageBox("网络原因,没连上服务器!"); 
	 } 
} 
 
void CClientDlg::MyReceive() 
{ 
    msg.Serialize (*m_pArIn); 
	int i=0; 
	CString str; 
	switch(msg.m_eType ) 
	{ 
	case LOGINResponse: 
		str=Decode(1,msg.m_strMsg); 
		if(str=="FAILED") 
		{ 
			str=Decode(2,msg.m_strMsg); 
			m_pSocket->Close(); 
		    AfxMessageBox(str); 
		} 
		else 
		{ 
			str=Decode(2,msg.m_strMsg); 
			if(str=="BOSS") 
			   Expand(2); 
			else  
			   Expand(1); 
			GetDlgItem(IDC_BUTTON1)->SetWindowText("Login"); 
			GetDlgItem(IDC_BUTTON1)->EnableWindow(false); 
			GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(true); 
		} 
	    break; 
	case USERList: 
	   str=Decode(++i,msg.m_strMsg); 
       m_ctrList.ResetContent(); 
       while(str!="END") 
	   { 
		   if(str!=m_strName) 
			   m_ctrList.AddString(str); 
           str=Decode(++i,msg.m_strMsg); 
	   } 
       UpdateData(FALSE); 
	   break; 
	case CHATTING: 
        MessageBox(Decode(2,msg.m_strMsg),"来自"+Decode(1,msg.m_strMsg)+"的消息:"); 
		break; 
	case NOTICE: 
		MessageBox(Decode(2,msg.m_strMsg),"来自"+Decode(1,msg.m_strMsg)+"的通知:"); 
		break; 
	} 
 
    
} 
 
CString CClientDlg::Decode(int n, CString strMsg) 
{ 
	   int pos; 
	   CString str; 
	   for(int i=1;i<=n;i++) 
	   { 
	       pos=strMsg.Find ("|",0); 
	       if(pos<0) 
			   str=strMsg; 
		   else 
		       str=strMsg.Left (pos); 
		   strMsg=strMsg.Right(strMsg.GetLength ()-pos-1); 
	   } 
	   return str; 
} 
 
void CClientDlg::Expand(int type) 
{ 
	switch(type) 
	{ 
	case 0: 
		SetWindowPos(NULL, 0, 0, 190,105 , 
                  SWP_NOMOVE | SWP_NOZORDER); 
		break; 
	case 1: 
		SetWindowPos(NULL, 0, 0, 190, 370, 
                  SWP_NOMOVE | SWP_NOZORDER); 
		break; 
	case 2: 
		SetWindowPos(NULL, 0, 0, 190,  400, 
                  SWP_NOMOVE | SWP_NOZORDER); 
		break; 
	} 
 
} 
 
void CClientDlg::OnDblclkList()  
{ 
	// TODO: Add your control notification handler code here 
	nIndex=m_ctrList.GetCurSel(); 
	CString strTo; 
	m_ctrList.GetText(nIndex,strTo); 
	CSendDlg dlg; 
	if(dlg.DoModal ()==IDOK) 
	{ 
	    msg.m_eType=CHATTING; 
	    msg.m_strMsg=strTo+"|"+dlg.m_strMsg; 
		msg.Serialize(*m_pArOut); 
		m_pArOut->Flush(); 
	} 
} 
 
void CClientDlg::OnSelchangeList()  
{ 
	// TODO: Add your control notification handler code here 
	 nIndex=m_ctrList.GetCurSel(); 
} 
 
void CClientDlg::OnSendNotice()  
{ 
 	UpdateData(TRUE);	 
	CSendDlg dlg; 
	if(dlg.DoModal ()==IDOK) 
	{ 
	    msg.m_eType=NOTICE; 
	    msg.m_strMsg="ALL|"+dlg.m_strMsg; 
		msg.Serialize(*m_pArOut); 
		m_pArOut->Flush(); 
	}	 
}