




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
圖表03所示。其中包含文檔編輯框、按鍵控件、靜態文本控件組成。左半邊由上自下分別是:頭像、昵稱、當天聊天信息顯示、12個表情按鈕、消息輸入框和發送按鈕。右半邊有歷史記錄顯示框、歷史記錄顯示按鈕。圖表STYLEREF1\s0SEQ圖表\*ARABIC\s13軟件界面圖表STYLEREF1\s0SEQ圖表\*ARABIC\s14控件類型及各自ID標題控件類型控件ID昵稱:StaticIDC_STATIC服務器IP:StaticIDC_STATIC端口號(默認5000):StaticIDC_STATIC頭像ButtonIDC_TouXiang表情1ButtonIDC_BQ1表情2ButtonIDC_BQ2表情3ButtonIDC_BQ3表情4ButtonIDC_BQ4表情5ButtonIDC_BQ5表情6ButtonIDC_BQ6表情7ButtonIDC_BQ7表情8ButtonIDC_BQ8表情9ButtonIDC_BQ9表情10ButtonIDC_BQ10表情11ButtonIDC_BQ11表情12ButtonIDC_BQ12發送ButtonIDC_SEND連接ButtonIDC_CONNECT建立ButtonIDC_SETSERVER聊天紀錄ButtonIDC_LiaoTianJiLu聊天信息顯示EditIDC_SHOWTEXT信息輸入EditIDC_INPUTTEXT昵稱輸入EditIDC_NAME服務器IP輸入EditIDC_SERVERIP端口輸入EditIDC_PORT聊天記錄顯示EditIDC_ShowHistory聊天程序總共有6個類。其中,CChatApp和CAboutDlg由AppWizard實現;另外,CServerSocket和CClientSocket分別負責服務端和客戶端的網絡通信功能;CChatDlg為程序的主控類,主界面、通信方式及程序邏輯均由該類實現,它繼承自CDialog類;CMessgage是對消息的封裝。CClientSocket通過相應的OnReceive消息來接收數據,響應OnClose消息來斷開對話的處理,實現以CArchive對數據進行的串行化。類定義代碼如下:#include"Messg.h"http://命令目標classCChatDlg;classCClientSocket:publicCSocket{public:CArchive*m_aSessionIn;CArchive*m_aSessionOut;CSocketFile*m_sfSocketFile;CChatDlg*m_dlg;boolm_bInit;//是否進行了初始化boolm_bClose;//連接是否關閉public:voidInit(CChatDlg*dlg);BOOLSendMessage(CMessg*msg);voidCloseSocket();public:staticintGetLocalHostName(CString&sHostName);//獲得本地計算機名稱staticintGetIpAddress(constCString&sHostName,CString&sIpAddress);//獲得本地IPstaticintGetIpAddress(constCString&sHostName,BYTE&f0,BYTE&f1,BYTE&f2,BYTE&f3);//獲得本地IPstaticCStringErrorReason(inttag);public:virtualvoidOnReceive(intnErrorCode);virtualvoidOnClose(intnErrorCode);public:CClientSocket();virtual~CClientSocket();protected:};CClientSocket.CPP中的代碼:#include"stdafx.h"#include"chat.h"#include"ClientSocket.h"#include"ChatDlg.h"http://CClientSocketCClientSocket::CClientSocket(){m_aSessionIn=NULL; m_aSessionOut=NULL;m_sfSocketFile=NULL;m_bInit=false;m_bClose=false;}CClientSocket::~CClientSocket(){if(m_aSessionIn)deletem_aSessionIn;if(m_aSessionOut)deletem_aSessionOut;if(m_sfSocketFile)deletem_sfSocketFile;}//ClientSocket成員函數voidCClientSocket::OnReceive(intnErrorCode){CSocket::OnReceive(nErrorCode);//OnReceive()函數的實現do{ CMessgtemp;temp.Serialize(*m_aSessionIn);m_dlg->m_sMsgList+=temp.m_strText+"\r\n"; m_dlg->m_tmpMsgList=temp.m_strText+"\r\n"; m_dlg->SetDlgItemText(IDC_SHOWTEXT,m_dlg->m_sMsgList); FILE*fp; fp=fopen("chatnote.txt","a+"); fputs(m_dlg->m_tmpMsgList,fp); fclose(fp);m_dlg->SetDlgItemText(IDC_SHOWTEXT,m_dlg->m_sMsgList);intlinenum=((CEdit*)(m_dlg->GetDlgItem(IDC_SHOWTEXT)))->GetLineCount();((CEdit*)(m_dlg->GetDlgItem(IDC_SHOWTEXT)))->LineScroll(linenum);if(!m_dlg->m_bClient){for(POSITIONpos=m_dlg->m_connectionList.GetHeadPosition();pos!=NULL;){CClientSocket*t=(CClientSocket*)m_dlg->m_connectionList.GetNext(pos);if(t->m_hSocket!=this->m_hSocket){t->SendMessage(&temp);}}}}while(!m_aSessionIn->IsBufferEmpty());}voidCClientSocket::Init(CChatDlg*dlg){m_sfSocketFile=newCSocketFile(this);m_aSessionIn=newCArchive(m_sfSocketFile,CArchive::load);m_aSessionOut=newCArchive(m_sfSocketFile,CArchive::store);m_bClose=false;this->m_dlg=dlg;}/**SendMessage()函數的實現*主要功能:*將信息串行化*/BOOLCClientSocket::SendMessage(CMessg*msg){if(m_aSessionOut!=NULL){msg->Serialize(*m_aSessionOut);m_aSessionOut->Flush();returnTRUE;}else{m_bClose=true;//對方關閉了連接CloseSocket();m_dlg->CloseSessionSocket();returnFALSE;}}/**CloseSocket()函數的實現*主要功能:*關閉套接字的連接*/voidCClientSocket::CloseSocket(){if(m_aSessionIn){deletem_aSessionIn;m_aSessionIn=NULL;}if(m_aSessionOut){deletem_aSessionOut;m_aSessionOut=NULL;}if(m_sfSocketFile){deletem_sfSocketFile;m_sfSocketFile=NULL;}Close();m_bInit=false;m_bClose=true;}/**OnClose()函數的實現*主要功能:*關閉套接字的連接*/voidCClientSocket::OnClose(intnErrorCode){m_bClose=true;CloseSocket();m_dlg->CloseSessionSocket();CSocket::OnClose(nErrorCode);}/**GetLocalHostName()函數的實現*主要功能:*獲得本地計算機的名稱*/intCClientSocket::GetLocalHostName(CString&sHostName){charszHostName[256];intnRetCode;nRetCode=gethostname(szHostName,sizeof(szHostName));if(nRetCode!=0){//產生錯誤sHostName=_T("沒有取得");returnGetLastError();}sHostName=szHostName;return0;}/**GetIpAddress()函數的實現*主要功能:*取得本地IP地址*/intCClientSocket::GetIpAddress(constCString&sHostName,CString&sIpAddress)//獲得本地IP{structhostentFAR*lpHostEnt=gethostbyname(sHostName);if(lpHostEnt==NULL){//產生錯誤sIpAddress=_T("");returnGetLastError();}LPSTRlpAddr=lpHostEnt->h_addr_list[0];if(lpAddr){structin_addrinAddr;memmove(&inAddr,lpAddr,4);sIpAddress=inet_ntoa(inAddr);//轉換為標準格式if(sIpAddress.IsEmpty())sIpAddress=_T("沒有取得");}return0;}/**GetIpAddress()函數的實現*主要功能:*獲得本地IP地址*/intCClientSocket::GetIpAddress(constCString&sHostName,BYTE&f0,BYTE&f1,BYTE&f2,BYTE&f3)//獲得IP地址{structhostentFAR*lpHostEnt=gethostbyname(sHostName);if(lpHostEnt==NULL){//產生錯誤f0=f1=f2=f3=0;returnGetLastError();}LPSTRlpAddr=lpHostEnt->h_addr_list[0];//獲取IPif(lpAddr){structin_addrinAddr;memmove(&inAddr,lpAddr,4);f0=inAddr.S_un.S_un_b.s_b1;f1=inAddr.S_un.S_un_b.s_b2;f2=inAddr.S_un.S_un_b.s_b3;f3=inAddr.S_un.S_un_b.s_b4;}return0;}CStringCClientSocket::ErrorReason(inttag)//錯誤信息的宏定義{CStringresult;switch(tag){caseWSANOTINITIALISED:result="AsuccessfulAfxSocketInitmustoccurbeforeusingthisAPI.";break;caseWSAENETDOWN:result="Thenetworksubsystemfailed";break;caseWSAEADDRINUSE:result="Thespecifiedaddressisalreadyinuse";break;caseWSAEINPROGRESS:result="AblockingWindowsSocketcallisinprogress";break;caseWSAEADDRNOTAVAIL:result="Thespecifiedaddressisnotavailablefromthelocalmachine";break;caseWSAEAFNOSUPPORT:result="Addressinthespecifiedfamilycannotbeusedwiththissocket";break;caseWSAECONNREFUSED:result="Theattempttoconnecteasrejected";break;caseWSAEDESTADDRREQ:result="Adestinationaddressisrequireed";break;caseWSAEFAULT:result="ThenSockAddrLenarguementisincorrect";break;caseWSAEINVAL:result="Invalidhostaddress";break;caseWSAEISCONN:result="Thesocketisalreadyconnected";break;caseWSAEMFILE:result="Nomorefiledescriptionsareavailable";break;caseWSAENETUNREACH:result="Thenetworkcannotbereachedfromthishostatthistime";break;caseWSAENOBUFS:result="Nobufferspaceisavailable.Thesocketcannotbeconnected";break;caseWSAENOTSOCK:result="Thedescriptorisnotasocket";break;caseWSAETIMEDOUT:result="Attempttoconnecttimedoutwithoutestablishingaconnection";break;caseWSAEWOULDBLOCK:result="Thesocketismarkedasnonblockingandtheconnnectioncannotbecompletedimmediately";break;default:result="unknownerror";}returnresult;}CServerSocketCServerSocket主要功能是實現OnAccept()消息,負責監聽服務窗口,是一個服務socket。CServerSocket.h的代碼如下://CServerSocketcommandtargetclassCChatDlg;classCServerSocket:publicCSocket{public:CServerSocket();virtual~CServerSocket();CChatDlg*m_dlg;UINTm_uPort;BOOLInit(UINTport,CChatDlg*dlg);public:virtualvoidOnAccept(intnErrorCode);//用于響應OnAccept消息的函數};CServerSocket.CPP的代碼如下:#include"stdafx.h"#include"chat.h"#include"ServerSocket.h"#include"ChatDlg.h"http://CServerSocketCServerSocket::CServerSocket(){}CServerSocket::~CServerSocket(){}//CServerSocket成員函數BOOLCServerSocket::Init(UINTport,CChatDlg*dlg){m_uPort=port;m_dlg=dlg;if(Create(m_uPort)==FALSE){AfxMessageBox(_T("ServerSocketCreateError"));returnFALSE;}if(this->Listen()==FALSE){AfxMessageBox("ServerListenError");returnFALSE;}m_dlg->SetDlgItemText(IDC_SHOWTEXT,"ServerrHasBeenSetOK!");returnTRUE;}voidCServerSocket::OnAccept(intnErrorCode){m_dlg->ProcessPendingAccept();CSocket::OnAccept(nErrorCode);}CMessgCMessg類主要作用是實現信息的串行化,方便信息的傳輸。CMessg.h代碼如下:#pragmaonceclassCMessg:publicCObject//命令目標{protected:DECLARE_DYNCREATE(CMessg)public:CMessg();public:CStringm_strText;public:voidInit();public:virtual~CMessg();virtualvoidSerialize(CArchive&ar);//實行串行化#ifdef_DEBUGvirtualvoidAssertValid()const;virtualvoidDump(CDumpContext&dc)const;#endif};CMessg.CPP代碼如下:#include"stdafx.h"#include"chat.h"#include"Messg.h"http://Construction/DestructionIMPLEMENT_DYNCREATE(CMessg,CObject)CMessg::CMessg(){Init();}CMessg::~CMessg(){}//CMessg成員函數voidCMessg::Init(){m_strText=_T("");}//CMsgserializationvoidCMessg::Serialize(CArchive&ar){if(ar.IsStoring()){ar<<m_strText;}else{ar>>m_strText;}}//CMsgdiagnostics#ifdef_DEBUGvoidCMessg::AssertValid()const{CObject::AssertValid();}voidCMessg::Dump(CDumpContext&dc)const{CObject::Dump(dc);}#endifCChatDlgCChatDlg類負責調度整個工程,實現界面消息的添加與響應,組織整個工程的運行。程序開始運行,進行對話框的初始化是在OnInitDialog()函數中實現的,在開始的時候自動獲得本地機器的IP地址并顯示在IPAddressControl控件中。連接服務器按鈕消息的響應函數。完成服務器的連接,調用CClientSocket類的Connect函數來實現,同時對連接返回的信息進行處理。建立服務器按鈕信息的響應函數。發送按鈕消息的響應函數。讀取文本框中的信息,調用CMessg類的函數以實現信息的串行化,然后再調用CClientSocket類的SendMessage()函數將信息發送給建立連接的對方。ChatDlg.h代碼如下://CChatDlgdialog#include"ClientSocket.h"#include"ServerSocket.h"http://CChatDlg對話框classCChatDlg:publicCDialog{//構造public:CChatDlg(CWnd*pParent=NULL);//標準構造函數//對話框數據enum{IDD=IDD_CHAT_DIALOG};protected:virtualvoidDoDataExchange(CDataExchange*pDX);protected:HICONm_hIcon;//生成的消息映射函數virtualBOOLOnInitDialog();afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);afx_msgvoidOnPaint();//afx_msgvoidOnInputText();afx_msgHCURSOROnQueryDragIcon();DECLARE_MESSAGE_MAP()public:CStringm_sInputText;public:CStringname;public:CStringm_sShowString;public:UINTm_uPort;//添加的變量public:boolm_bInit;boolm_bClient;CClientSocketm_clientsocket;CServerSocketm_pListenSocket;CPtrListm_connectionList;CStringm_sMsgList; CStringm_tmpMsgList;public:voidProcessPendingAccept();voidCloseSessionSocket();voidClearContent();voidOnClearconnection();public:afx_msgvoidOnBnClickedConnect();public:afx_msgvoidOnBnClickedSetserver();public:afx_msgvoidOnBnClickedButton1();};CChatDlg.CPP代碼如下:#include"stdafx.h"#include"chat.h"#include"chatDlg.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CAboutDlgdialogusedforAppAboutintTouXiangNum=0;CStringLiaoTianJiLu;classCAboutDlg:publicCDialog{public:CAboutDlg();enum{IDD=IDD_ABOUTBOX};protected:virtualvoidDoDataExchange(CDataExchange*pDX);protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD){}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)END_MESSAGE_MAP()CChatDlg::CChatDlg(CWnd*pParent/*=NULL*/):CDialog(CChatDlg::IDD,pParent){ m_sInputText=_T("");name=_T(""); m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);//加載圖標m_sShowString=_T("");m_uPort=5000;m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}voidCChatDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);DDX_Text(pDX,IDC_INPUTTEXT,m_sInputText);DDX_Text(pDX,IDC_NAME,name);DDX_Text(pDX,IDC_SHOWTEXT,m_sShowString);DDX_Text(pDX,IDC_PORT,m_uPort);//DDV_MinMaxUInt(pDX,m_uPort,1024,100000);}BEGIN_MESSAGE_MAP(CChatDlg,CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()//ON_EN_UPDATE(IDC_INPUTTEXT,OnInputText)//}}AFX_MSG_MAPON_BN_CLICKED(IDC_CONNECT,OnBnClickedConnect)ON_BN_CLICKED(IDC_SETSERVER,OnBnClickedSetserver)ON_BN_CLICKED(IDC_SEND,OnBnClickedButton1) //{{AFX_MSG_MAP(CMyclientDlg) //ON_BN_CLICKED(IDC_BUTTON2,OnButton2) ON_WM_CLOSE() ON_WM_CTLCOLOR()////改變對話框的背景色 ON_BN_CLICKED(IDC_BQ1,OnBq1) ON_BN_CLICKED(IDC_BQ2,OnBq2) ON_BN_CLICKED(IDC_BQ3,OnBq3) ON_BN_CLICKED(IDC_BQ4,OnBq4) ON_BN_CLICKED(IDC_BQ5,OnBq5) ON_BN_CLICKED(IDC_BQ6,OnBq6) ON_BN_CLICKED(IDC_BQ7,OnBq7) ON_BN_CLICKED(IDC_BQ8,OnBq8) ON_BN_CLICKED(IDC_BQ9,OnBq9) ON_BN_CLICKED(IDC_BQ10,OnBq10) ON_BN_CLICKED(IDC_BQ11,OnBq11) ON_BN_CLICKED(IDC_BQ12,OnBq12) ON_BN_CLICKED(IDC_TouXiang,OnTouXiang) ON_BN_CLICKED(IDC_LiaoTianJiLu,OnLiaoTianJiLu) //}}AFX_MSG_MAPEND_MESSAGE_MAP()//CMyclientDlg類的改變對話框的背景色的函數HBRUSHCChatDlg::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor){ HBRUSHhbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);pDC->SetBkColor(RGB(64,36,33)); pDC->SetTextColor(RGB(165,165,165));//字體設為灰白色hbr=CreateSolidBrush(RGB(64,36,33)); returnhbr;}BOOLCChatDlg::OnInitDialog(){CDialog::OnInitDialog();ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX<0xF000);CMenu*pSysMenu=GetSystemMenu(FALSE);if(pSysMenu!=NULL){CStringstrAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if(!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}SetIcon(m_hIcon,TRUE);SetIcon(m_hIcon,FALSE);if(AfxSocketInit(NULL)==0){AfxMessageBox("CSocketInitalError");} CWnd*cw=GetDlgItem(IDC_SEND);//獲取IP控件的指針 cw->EnableWindow(true);//讓輸入有效 cw=GetDlgItem(IDC_BQ1);//獲取IP控件的指針 cw->EnableWindow(true);//讓輸入有效 cw=GetDlgItem(IDC_BQ2);//獲取IP控件的指針 cw->EnableWindow(true);//讓輸入有效 cw=GetDlgItem(IDC_BQ3);//獲取IP控件的指針 cw->EnableWindow(true);//讓輸入有效 cw=GetDlgItem(IDC_BQ4);//獲取IP控件的指針 cw->EnableWindow(true);//讓輸入有效 cw=GetDlgItem(IDC_BQ5); //獲取IP控件的指針 cw->EnableWindow(true);//讓輸入有效 cw=GetDlgItem(IDC_BQ6); //獲取IP控件的指針 cw->EnableWindow(true);//讓輸入有效 cw=GetDlgItem(IDC_BQ7); //獲取IP控件的指針 cw->EnableWindow(true);//讓輸入有效 cw=GetDlgItem(IDC_BQ8);//獲取IP控件的指針 cw->EnableWindow(true);//讓輸入有效 cw=GetDlgItem(IDC_BQ9); //獲取IP控件的指針 cw->EnableWindow(true);//讓輸入有效 cw=GetDlgItem(IDC_BQ10); //獲取IP控件的指針 cw->EnableWindow(true);//讓輸入有效 cw=GetDlgItem(IDC_BQ11); //獲取IP控件的指針 cw->EnableWindow(true);//讓輸入有效 cw=GetDlgItem(IDC_BQ12); //獲取IP控件的指針 cw->EnableWindow(true);//讓輸入有效 //表情1CBitmapBitmap;Bitmap.LoadBitmap(IDB_BITMAP41); HBITMAPhBitmap=(HBITMAP)Bitmap.Detach(); CButton*pButton=(CButton*)GetDlgItem(IDC_BQ1); pButton->SetBitmap(hBitmap);//buttenpack //表情2Bitmap.LoadBitmap(IDB_BITMAP42); hBitmap=(HBITMAP)Bitmap.Detach(); pButton=(CButton*)GetDlgItem(IDC_BQ2); pButton->SetBitmap(hBitmap);//buttenpack //表情3Bitmap.LoadBitmap(IDB_BITMAP43); hBitmap=(HBITMAP)Bitmap.Detach(); pButton=(CButton*)GetDlgItem(IDC_BQ3); pButton->SetBitmap(hBitmap);//buttenpack //表情4Bitmap.LoadBitmap(IDB_BITMAP44); hBitmap=(HBITMAP)Bitmap.Detach(); pButton=(CButton*)GetDlgItem(IDC_BQ4); pButton->SetBitmap(hBitmap);//buttenpack //表情5Bitmap.LoadBitmap(IDB_BITMAP45); hBitmap=(HBITMAP)Bitmap.Detach(); pButton=(CButton*)GetDlgItem(IDC_BQ5); pButton->SetBitmap(hBitmap); //buttenpack //表情6Bitmap.LoadBitmap(IDB_BITMAP46); hBitmap=(HBITMAP)Bitmap.Detach(); pButton=(CButton*)GetDlgItem(IDC_BQ6); pButton->SetBitmap(hBitmap); //buttenpack //表情7Bitmap.LoadBitmap(IDB_BITMAP47); hBitmap=(HBITMAP)Bitmap.Detach(); pButton=(CButton*)GetDlgItem(IDC_BQ7); pButton->SetBitmap(hBitmap);//buttenpack //表情8Bitmap.LoadBitmap(IDB_BITMAP48); hBitmap=(HBITMAP)Bitmap.Detach(); pButton=(CButton*)GetDlgItem(IDC_BQ8); pButton->SetBitmap(hBitmap); //buttenpack //表情9Bitmap.LoadBitmap(IDB_BITMAP49); hBitmap=(HBITMAP)Bitmap.Detach(); pButton=(CButton*)GetDlgItem(IDC_BQ9); pButton->SetBitmap(hBitmap);//buttenpack //表情10Bitmap.LoadBitmap(IDB_BITMAP50); hBitmap=(HBITMAP)Bitmap.Detach(); pButton=(CButton*)GetDlgItem(IDC_BQ10); pButton->SetBitmap(hBitmap);//buttenpack //表情11Bitmap.LoadBitmap(IDB_BITMAP51); hBitmap=(HBITMAP)Bitmap.Detach(); pButton=(CButton*)GetDlgItem(IDC_BQ11); pButton->SetBitmap(hBitmap);//buttenpack //表情12Bitmap.LoadBitmap(IDB_BITMAP52); hBitmap=(HBITMAP)Bitmap.Detach(); pButton=(CButton*)GetDlgItem(IDC_BQ12); pButton->SetBitmap(hBitmap);//buttenpack //歷史聊天記錄按鈕 Bitmap.LoadBitmap(IDB_BITMAP2); hBitmap=(HBITMAP)Bitmap.Detach(); pButton=(CButton*)GetDlgItem(IDC_LiaoTianJiLu); pButton->SetBitmap(hBitmap);//buttenpack //連接服務器按鈕 Bitmap.LoadBitmap(IDB_BITMAP3); hBitmap=(HBITMAP)Bitmap.Detach(); pButton=(CButton*)GetDlgItem(IDC_CONNECT); pButton->SetBitmap(hBitmap);//buttenpack //建立服務器按鈕 Bitmap.LoadBitmap(IDB_BITMAP4); hBitmap=(HBITMAP)Bitmap.Detach(); pButton=(CButton*)GetDlgItem(IDC_SETSERVER); pButton->SetBitmap(hBitmap);//buttenpack //發送按鈕 Bitmap.LoadBitmap(IDB_BITMAP5); hBitmap=(HBITMAP)Bitmap.Detach(); pButton=(CButton*)GetDlgItem(IDC_SEND); pButton->SetBitmap(hBitmap);//buttenpack //頭像初始化Bitmap.LoadBitmap(IDB_BITMAP33); hBitmap=(HBITMAP)Bitmap.Detach(); pButton=(CButton*)GetDlgItem(IDC_TouXiang); pButton->SetBitmap(hBitmap);//buttenpackBYTEf0,f1,f2,f3;CStringname;CClientSocket::GetLocalHostName(name);CClientSocket::GetIpAddress(name,f0,f1,f2,f3);((CIPAddressCtrl*)(GetDlgItem(IDC_SERVERIP)))->SetAddress(f0,f1,f2,f3);m_bInit=false;m_bClient=false;returnTRUE;}voidCChatDlg::OnSysCommand(UINTnID,LPARAMlParam){if((nID&0xFFF0)==IDM_ABOUTBOX){CAboutDlgdlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID,lParam);}}voidCChatDlg::OnBnClickedConnect(){if(!m_bInit){BYTEf0,f1,f2,f3;CStringname;((CIPAddressCtrl*)(GetDlgItem(IDC_SERVERIP)))->GetAddress(f0,f1,f2,f3);CStringip;ip.Format("%d.%d.%d.%d",f0,f1,f2,f3);m_bClient=true;m_clientsocket.Create();if(m_clientsocket.Connect(ip,GetDlgItemInt(IDC_PORT))){m_clientsocket.Init(this);SetDlgItemText(IDC_SHOWTEXT,"成功連接服務器");m_bInit=true;}else{m_clientsocket.Close();AfxMessageBox("連接服務器失敗"); m_bInit=false;}}}voidCChatDlg::OnBnClickedSetserver(){if(!m_bInit){m_bClient=false;m_bInit=true;if(m_pListenSocket.Init(GetDlgItemInt(IDC_PORT),this)==FALSE){m_bInit=false;return;}}}voidCChatDlg::CloseSessionSocket(){if(!m_bClient){for(POSITIONpos=m_connectionList.GetHeadPosition();pos!=NULL;){POSITIONt_pos=pos;CClientSocket*t=(CClientSocket*)m_connectionList.GetNext(pos);if(t->m_bClose==true){m_connectionList.RemoveAt(t_pos);}}}}voidCChatDlg::ClearContent(){if(m_bClient){m_clientsocket.Close();}else{m_pListenSocket.Close();m_connectionList.RemoveAll();}m_bInit=false;m_sMsgList="";SetDlgItemText(IDC_INPUTTEXT,"");SetDlgItemText(IDC_SHOWTEXT,"");}voidCChatDlg::OnClearconnection(){ClearContent();}voidCChatDlg::ProcessPendingAccept(){CClientSocket*pSocket=newCClientSocket();if(m_pListenSocket.Accept(*pSocket)){CMessgmsg;msg.m_strText="oneguestenteredchatroom";m_sShowString+="oneguestenteredchatroom\n"; SetDlgItemText(IDC_SHOWTEXT,"oneguestenteredchatroom\n");POSITIONpos;for(pos=m_connectionList.GetHeadPosition();pos!=NULL;){CClientSocket*t=(CClientSocket*)m_connectionList.GetNext(pos);t->SendMessage(&msg);}pSocket->Init(this);m_connectionList.AddTail(pSocket);}elsedeletepSocket;}//窗口最小化圖標顯示HCURSORCChatDlg::OnQueryDragIcon(){ return(HCURSOR)m_hIcon;}voidCChatDlg::OnPaint(){ CPaintDCdc(this);//devicecontextforpaintingRECTrect;CDC*md=newCDC;CBitmap*bitmap=newCBitmap;GetClientRect(&rect);md->CreateCompatibleDC(&dc); bitmap->LoadBitmap(IDB_BITMAP1);md->SelectObject(bitmap);dc.BitBlt(0,0,rect.right,rect.bottom,md,0,0,SRCCOPY);}voidCChatDlg::OnBnClickedButton1(){if(!m_bInit){AfxMessageBox("NotConnectiontoTheServer");return;} CStringin; CStringstr_name;CMessgmsg;GetDlgItemText(IDC_INPUTTEXT,in); GetDlgItemText(IDC_NAME,str_name);if(in.GetLength()<1){return;}in.TrimRight("");SetDlgItemText(IDC_INPUTTEXT,""); CTimeMytime=CTime::GetCurrentTime(); ///構造CTime對象 intm_nYear=Mytime.GetYear(); ///年 intm_nMonth=Mytime.GetMonth();///月 intm_nDay=Mytime.GetDay();///日 intm_nHour=Mytime.GetHour();///小時 intm_nMinute=Mytime.GetMinute();///分鐘 intm_nSecond=Mytime.GetSecond();///秒 CStringm_strTime=Mytime.Format("%Y-%m-%d%H:%M:%S"); in=str_name+":"+m_strTime+"\r\n"+in;if(in.GetLength()>=1){//m_sMsgList+=str_name+":";m_sMsgList+=in+"\r\n";m_tmpMsgList=str_name+":"+in+"\r\n"; FILE*fp; fp=fopen("chatnote.txt","a+"); fputs(m_tmpMsgList,fp); fclose(fp);SetDlgItemText(IDC_SHOWTEXT,m_sMsgList);intm_iLineCurrentPos=((CEdit*)(GetDlgItem(IDC_SHOWTEXT)))->GetLineCount();((CEdit*)(GetDlgItem(IDC_SHOWTEXT)))->LineScroll(m_iLineCurrentPos);msg.m_strText=in;if(!m_bClient){POSITIONpos;for(pos=m_connectionList.GetHeadPosition();pos!=NULL;){CClientSocket*t=(CClientSocket*)m_connectionList.GetNext(pos);t->SendMessage(&msg);}}else{m_clientsocket.SendMessage(&msg);}}}//點擊換頭像的函數voidCChatDlg::OnTouXiang(){ //TODO:Addyourcontrolnotificationhandlercodehere CBitmapBitmap;if(TouXiangNum==0){ Bitmap.LoadBitmap(IDB_BITMAP34); HBITMAPhBitmap=(HBITMAP)Bitmap.Detach(); CButton*pButton=(CButton*)GetDlgItem(IDC_TouXiang); pButton->SetBitmap(hBitmap);//buttenpack TouXiangNum++; } elseif(TouXiangNum==1) { Bitmap.LoadBitmap(IDB_BITMAP35); HBITMAPhBitmap=(HBITMAP)Bitmap.Detach(); CButton*pButton=(CButton*)GetDlgItem(IDC_TouXiang); pButton->SetBitmap(hBitmap);//buttenpack TouXiangNum++; } elseif(TouXiangNum==2) { Bitmap.LoadBitmap(IDB_BITMAP36); HBITMAPhBitmap=(HBITMAP)Bitmap.Detach(); CButton*pButton=(CButton*)GetDlgItem(IDC_TouXiang); pButton->SetBitmap(hBitmap);//buttenpack TouXiangNum++; } elseif(TouXiangNum==3) { Bitmap.LoadBitmap(IDB_BITMAP37); HBITMAPhBitmap=(HBITMAP)Bitmap.Detach(); CButton*pButton=(CButton*)GetDlgItem(IDC_TouXiang); pButton->SetBitmap(hBitmap);//buttenpack TouXiangNum++; } elseif(TouXiangNum==4) { Bitmap.LoadBitmap(IDB_BITMAP38); HBITMAPhBitmap=(HBITMAP)Bitmap.Detach(); CButton*pButton=(CButton*)GetDlgItem(IDC_TouXiang); pButton->SetBitmap(hBitmap);//buttenpack TouXiangNum++; } elseif(TouXiangNum==5) { Bitmap.LoadBitmap(IDB_BITMAP39); HBITMAPhBitmap=(HBITMAP)Bitmap.Detach(); CButton*pButton=(CButton*)GetDlgItem(IDC_TouXiang); pButton->SetBitmap(hBitmap);//buttenpack TouXiangNum++; } elseif(TouXiangNum==6) { Bitmap.LoadBitmap(IDB_BITMAP40); HBITMAPhBitmap=(HBITMAP)Bitmap.Detach(); CButton*pButton=(CButton*)GetDlgItem(IDC_TouXiang); pButton->SetBitmap(hBitmap);//buttenpack TouXiangNum=7; } elseif(TouXiangNum==7) { Bitmap.LoadBitmap(IDB_BITMAP33); HBITMAPhBitmap=(HBITMAP)Bitmap.Detach(); CButton*pButton=(CButton*)GetDlgItem(IDC_TouXiang); pButton->SetBitmap(hBitmap);//buttenpack TouXiangNum=0; }}voidCChatDlg::OnBq1(){ //TODO:Addyourcontrolnotificationhandlercodehere CStringstr,str1; GetDlgItemText(IDC_INPUTTEXT,str1); //獲取此刻顯示區中的文本,并保存起來 str=str1+"(*^__^*)嘻嘻……"; //疊加新收到的字符, SetDlgItemText(IDC_INPUTTEXT,str);}voidCChatDlg::OnBq2(){ //TODO:Addyourcontrolnotificationhandlercodehere CStringstr,str1; GetDlgItemText(IDC_INPUTTEXT,str1); //獲取此刻顯示區中的文本,并保存起來 str=str1+"(^_^)/~~拜拜"; //疊加新收到的字符, SetDlgItemText(IDC_INPUTTEXT,str);}voidCChatDlg::OnBq3(){ //TODO:Addyourcontrolnotificationhandlercodehere CStringstr,str1; GetDlgItemText(IDC_INPUTTEXT,str1); //獲取此刻顯示區中的文本,并保存起來 str=str1+"╭∩╮(︶︿︶)╭∩╮鄙視你!"; //疊加新收到的字符, SetDlgItemText(IDC_INPUTTEXT,str);}voidCChatDlg::OnBq4(){ //TODO:Addyourcontrolnotificationhandlercodehere CStringstr,str1; GetDlgItemText(IDC_INPUTTEXT,str1); //獲取此刻顯示區中的文本,并保存起來 str=str1+"o(>﹏<)o不要啊!"; //疊加新收到的字符, SetDlgItemText(IDC_INPUTTEXT,str);}voidCChatDlg::OnBq5(){ //TODO:Addyourcontrolnotificationhandlercodehere CStringstr,str1;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論