首页 基于MFC仿QQ聊天程序设计完整实例教程

基于MFC仿QQ聊天程序设计完整实例教程

举报
开通vip

基于MFC仿QQ聊天程序设计完整实例教程本系统基于客户端/服务器基本原理,程序即是服务端,也是客户端,通过IP就可以相互添加好友,并且实现点到点通信,有聊天记录(未实现根据用户发送的消息而改变字体颜色,只能在客户端改),字体颜色设置(一改全改~),包含主界面MaindBord和聊天Talk两大功能模块。(1)MaindBord模块A、登录模块登陆模块的实现过程有下面几个步骤:(1)初始化列表信息,获取用户名,服务器的IP地址,使按键失效(2)确认登陆后创建套接字,绑定,监听(3)初始化成功后,激活添加好友和隐藏功能B、好友模块添加好友的实现过程有下面几个...

基于MFC仿QQ聊天程序设计完整实例教程
本系统基于客户端/服务器基本原理,程序即是服务端,也是客户端,通过IP就可以相互添加好友,并且实现点到点通信,有聊天记录(未实现根据用户发送的消息而改变字体颜色,只能在客户端改),字体颜色设置(一改全改~),包含主界面MaindBord和聊天Talk两大功能模块。(1)MaindBord模块A、登录模块登陆模块的实现过程有下面几个步骤:(1)初始化列表信息,获取用户名,服务器的IP地址,使按键失效(2)确认登陆后创建套接字,绑定,监听(3)初始化成功后,激活添加好友和隐藏功能B、好友模块添加好友的实现过程有下面几个步骤:(1)弹出对话框(2)获取对话框中的IP(3)检查对方是否在线,建立连接(4)发送请求验证C、好友列表模块(1)客户接收请求,将服务端加入列表,发送客户端信息(2)服务端得到客户端信息,加入列表(3)双击好友列表,弹出发送信息对话框D、隐藏模块(1)隐藏与显示(2)响应鼠标,弹出控制菜单(2)聊天Talk模块A、发送信息模块聊天模块中,发送信息模块的实现过程有下面几个步骤:(1)通过列表双击一个女?友为聊天对象,弹出聊天窗口;(2)用户按下发送按钮后,检测对方是否在线,检测对方是否在线(3)将聊天内容发送出去(4)在本地即时聊天内容显示的编辑框中添加发送的内容并写入聊天记录。B、接收信息模块聊天模块中,接收信息模块的实现过程有下面几个步骤:(1)由主界面判断接收到信息的类型,是否为好友发来信息,如果是,则打开聊天窗口(2)读取消息,并写入聊天记录,(3)载入字体颜色信息。(4)显示聊天记录C、聊天记录管理模块聊天记录管理模块的实现过程有下面几个步骤:(1)将发送内容和接收内容写入文本文件;(2)显示聊天记录;(3)删除聊天记录。D、字体颜色模块实现字体颜色模块的过程有下面几个步骤:(1)调用系统字体,获取字体,写入存档(2)调用系统字体颜色,获取颜色,写入存档(3)读取、更新字体颜色。让我们先看下运行结果:Windows7Windows2003Windows7Windows2003Windows7还原退出Windows2003Windows7Windows2003心动了么?让我们开始对第一个模块,也就是Mainord的 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 吧Mainord模块新建一个MainBord工程MF匚AppW记ard-StepI选择Dialogbased,然后FinshWhattypeofapplicationwouldyouliketocreate?CSingledocurriEnl厂Multipledocuments<*Dialogbiased^PDocumcnt/Viewarchitecturesupport?Whatlanguagewouldyoulikeyourresourc&sin?|中文【巾国1〔afpwzchsdlljfinishCancel二、界面设计如下:(一)、MainBord界面设计如下:将各ID值设置如下图,通过类向导添加listbox成员变量(二)、添加好友对话框界面设计如下:双击,添加类将各ID值设置如下图,通过类向导添加成员变量(三)、弹出菜单界面设计如下:(四)添加图标-_jMainBordresource?王二IDialog-口IconJIDIICON1]IDOMAINFFW申口StringTable由LJVersionDevice:[Standard(32x32]三、代码部分:(一)准备部分首先,在StdAfx.h中添加如下代码:afxsock.h头文件;在MainBordDlg.cpp添加Message.h、AddFreind.h;其次,MainBordDlg.h添加如下代码:#defineWM_CLIENT_ACCEPTWM_USER+101#defineWM_CLIENT_READCLOSEWM_USER+102〃〃/〃/〃〃/〃〃/〃/〃〃/〃/〃〃/〃/〃〃/〃/〃〃/〃/〃〃/〃/〃〃/〃/〃〃/〃///CMainBordDlgdialog//Constructionpublic:intTrayAddIcon();charlpszTipBefore[100];//修改前的图标提示信息LRESULTOnAccept(WPARAMwParam,LPARAMlParam);LRESULTOnRead(WPARAMwParam,LPARAMlParam);CMainBordDlg(CWnd*pParent=NULL);//standardconstructorSOCKETClient;//客户的连接请求SOCKETServerSocket;//SOCKETSOCKETtempSocket;SOCKADDR_INtempSocketAddr;SOCKADDR_INm_sockServerAddr;//SOCKET结构BOOLIsTrue;CStringip;CStringSystemMessage;voidSendMsg();CStringIPName;CStringHostName;voidGetIP_Name();voidSelectWay();〃好友列表structFriendList{charname[100];charIP[18];structFriendList*next;public:CStringip;}*start,*last;第三,添加Message.h文件代码如下:structMessage{intsign;charmsg[1000];}msg;第四,添加消息响应LRESULTCMainBordDlg::OnRead(WPARAMwParam,LPARAMlParam){if(!IsTrue){//m_List.InsertString(0,"有数据到达,但是没有工作站连接。");}CStringstr;switch(WSAGETSELECTEVENT(lParam)){caseFD_READ:if(recv(Client,(char*)&msg,sizeof(msg),0)==SOCKET_ERROR){//m_List.InsertString(0,"接收数据发生错误。");return0;}SelectWay();//m_History_List.InsertString(0,str);〃MessageBox(str);break;caseFD_CLOSE:str=_T("工作站退出。”);//m_List.InsertString(0,str);closesocket(Client);//IsTrue=FALSE;break;}return0L;}LRESULTCMainBordDlg::OnAccept(WPARAMwParam,LPARAMlParam){if(WSAGETSELECTERROR(lParam)){〃m_List.InsertString(0,"ErrordetectedonentryintoOnServerAccept.");return0L;}if(WSAGETSELECTEVENT(lParam)==FD_ACCEPT)//如果{Client=accept(ServerSocket,(LPSOCKADDR)&m_sockServerAddr,0);if(Client==INVALID_SOCKET){//m_List.InsertString(0,"Serversocketfailedtoacceptconnection.");return0L;}//ClinetWSAAsyncSelect(Client,m_hWnd,WM_CLIENT_READCLOSE,FD_READ|FD_CLOSE);IsTrue=TRUE;}〃m_List.InsertString(0,"有客户机连接上了服务器。"力return0L;}(一)、登录模块登陆模块的实现过程有下面几个步骤:(1)初始化列表,获取用户名,服务器的IP地址,使按键失效。在MainBordDlg.cpp的初始化函数OnInitDialog添加如下代码:m_FriendList.SetItemHeight(0,18);start=NULL;last=NULL;//TODO:AddextrainitializationhereGetIP_Name();strcpy(lpszTipBefore,"QQ"+IPName);(CEdit*)GetDlgItem(IDC_AddBTN)->EnableWindow(FALSE);(CEdit*)GetDlgItem(IDC_HIDEBTN)->EnableWindow(FALSE);(2)在MainBordDlg.cpp添加获取主机获得IP和主机名的函数voidCMainBordDlg::GetIP_Name()//获彳导IP和主机名{WORDwVersionRequested;WSADATAwsaData;charhostname[128];CStringstrip;PHOSTENThostinfo;wVersionRequested=MAKEWORD(2,0);if(WSAStartup(wVersionRequested,&wsaData)==0){if(gethostname(hostname,sizeof(hostname))==0){if((hostinfo=gethostbyname(hostname))!=NULL){strip=inet_ntoa(*(structin_addr*)*hostinfo->h_addr_list);}}WSACleanup();}IPName=strip;HostName.Format("%s",hostname);}(3)确定登陆后创建套接字,绑定,监听,初始化成功后,激活添加好友和隐藏功能在MainBordDlg.cpp添加登陆按钮的 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 voidCMainBordDlg::OnStartBTN(){//TODO:AddyourcontrolnotificationhandlercodehereWSADATAwsaData;intiErrorCode;if(WSAStartup(MAKEWORD(2,1),&wsaData))//调用WindowsSocketsDLL{WSACleanup();return;}〃m_List.InsertString(0,"服务器开始创建SOCKET。");ServerSocket=socket(PF_INET,SOCK_STREAM,0);〃创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信if(ServerSocket==INVALID_SOCKET){〃m_List.InsertString(0,"无法创建服务器socket!");return;}m_sockServerAddr.sin_family=AF_INET;m_sockServerAddr.sin_addr.s_addr=INADDR_ANY;〃向所有的IP地址发送消息m_sockServerAddr.sin_port=htons(8001);if(bind(ServerSocket,(LPSOCKADDR)&m_sockServerAddr,sizeof(m_sockServerAddr))==SOCKET_ERROR)〃与选定的端口绑定{//m_List.InsertString(0,"无法绑定服务器。");return;}iErrorCode=WSAAsyncSelect(ServerSocket,m_hWnd,WM_CLIENT_ACCEPT,FD_ACCEPT);//产生相应传递给窗口的消息为WM_SERVER_ACCEPT,这是自定义消息if(iErrorCode==SOCKET_ERROR){return;}if(listen(ServerSocket,1)==SOCKET_ERROR)//开始监听客户连接请求{//m_List.InsertString(0,"服务器监听失败!");return;}IsTrue=TRUE;//m_List.AddString("服务器绑定监听成功。");(CEdit*)GetDlgItem(IDC_AddBTN)->EnableWindow(TRUE);(CEdit*)GetDlgItem(IDC_HIDEBTN)->EnableWindow(TRUE);return;}(二)好友模块添加好友的实现过程有下面几个步骤:(1)弹出对话框(2)获取对话框中的IP(3)检查对方是否在线,建立连接(4)发送请求验证1在AddFreind.h添加一个成员//Constructionpublic:CStringipstr;2好友请求对话框添加代码,在AddFreind.cpp增加发送请求(确定)按钮代码:voidAddFreind::OnOK(){//TODO:AddextravalidationhereUpdateData(TRUE);m_IPAddress.GetWindowText(ipstr);CDialog::OnOK();}3在MainBordDlg.cpp添加好友按钮的方法voidCMainBordDlg::OnAddBTN(){//TODO:AddyourcontrolnotificationhandlercodehereAddFreindmydlg;if(mydlg.DoModal()==IDOK){if(mydlg.ipstr.GetLength()==0){MessageBox("您没有输入IP地址!!匚"错误信息",NULL);return;}ip=mydlg.ipstr;}elsereturn;WSADATAwsaData;if(WSAStartup(MAKEWORD(2,1),&wsaData))//调用WindowsSocketsDLL{WSACleanup();return;}tempSocket=socket(PF_INET,SOCK_STREAM,0);〃创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信if(tempSocket==INVALID_SOCKET){return;}DWORDdwip;if((dwip=inet_addr(ip))==INADDR_NONE){MessageBox("IP赋值错误","错误信息"力return;}tempSocketAddr.sin_family=AF_INET;//使用TCP/IP 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 tempSocketAddr.sin_port=htons(8001);tempSocketAddr.sin_addr.S_un.S_addr=dwip;if(connect(tempSocket,(LPSOCKADDR)&tempSocketAddr,sizeof(tempSocketAddr))==SOCKET_ERROR){MessageBox("对方不在线”,"添加失败",NULL);return;}else{msg.sign=2;SystemMessage=IPName+"#"+HostName+"#";strcpy(msg.msg,SystemMessage);}if(send(tempSocket,(char*)&msg,sizeof(msg),0)==SOCKET_ERROR){MessageBox("发送消息失败","错误信息",MB_OK);return;}}3好友列表模块与消息响应(1)客户接收请求,将服务端加入列表,发送客户端信息;(2)服务端得到客户端信息,加入列表;voidCMainBordDlg::SelectWay(){FriendList*newlist=newstructFriendList;CStringstrIP,strName,temp;〃添加新成员CStringmessage;inti,j=0;i=msg.sign;message.Format("%d#%s",msg.sign,msg.msg);//MessageBox("here!!!");//MessageBox(message);CFilemyfile;switch(i)}}{case1:〃别人跟你聊天myfile.Open("msg.txt",CFile::modeCreate|CFile::modeWrite);myfile.Write(message,message.GetLength());myfile.Close();//(HWNDFindWindow(LPCTSTRIpClassName,LPCTSTRIpWindowName)WinExec("Talk.exe",SW_SHOW);break;case2:message.Format("%s",msg.msg);//MessageBox(message);strIP="";strName="";j=0;while(msg.msg[j]!='#'){strIP+=msg.msg[j];j++;}j++;while(msg.msg[j]!='#'){strName+=msg.msg[j];j++;}if((MessageBox(strName+"请求你通过身份验证","请求彳t息",IDOK))!=1){〃MessageBox("here!!!");return;}for(j=0;jIP,strIP);strcpy(newlist->name,strName);newlist->next=NULL;if(start==NULL){start=newlist;last=newlist;}else{last->next=newlist;last=newlist;m_FriendList.AddString(strName);ip=strIP;//同意加为好友SystemMessage=IPName+"#"+HostName+"#";msg.sign=3;SendMsg();break;case3://MessageBox(message);message.Format("%s",msg.msg);//MessageBox(message);strIP="";strName="";j=0;while(msg.msg[j]!='#'){strIP+=msg.msg[j];j++;}j++;while(msg.msg[j]!='#'){strName+=msg.msg[j];j++;}for(j=0;jIP,strIP);strcpy(newlist->name,strName);newlist->next=NULL;if(start==NULL){start=newlist;last=newlist;}else{last->next=newlist;last=newlist;}m_FriendList.AddString(strName);MessageBox(strName+"通过你的身份验证!!!","验证信息",NULL);UpdateData(TRUE);break;default:break;}(2)消息响应:voidCMainBordDlg::SendMsg()//接受或发送系统请求信息{WSADATAwsaData;if(WSAStartup(MAKEWORD(2,1),&wsaData))//调用WindowsSocketsDLL{WSACleanup();return;}tempSocket=socket(PF_INET,SOCK_STREAM,0);〃创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信if(tempSocket==INVALID_SOCKET){return;}DWORDdwip;if((dwip=inet_addr(ip))==INADDR_NONE){MessageBox("IP赋值错误","错误信息"力return;}tempSocketAddr.sin_family=AF_INET;//使用TCP/IP协议tempSocketAddr.sin_port=htons(8001);tempSocketAddr.sin_addr.S_un.S_addr=dwip;if(connect(tempSocket,(LPSOCKADDR)&tempSocketAddr,sizeof(tempSocketAddr))=SOCKET_ERROR){MessageBox("对方不在线","失败信息",NULL);return;}strcpy(msg.msg,SystemMessage);if(send(tempSocket,(char*)&msg,sizeof(msg),0)==SOCKET_ERROR){MessageBox("发送消息失败","错误信息",MB_OK);return;}}(3)双击好友列表,弹出发送信息对话框。voidCMainBordDlg::OnDblclkFriendLIST()//TODO:Addyourcontrolnotificationhandlercodehere}if(IsTrue!=TRUE)return;〃未登录intindex=m_FriendList.GetCurSel();if(index!=LB_ERR){CStringstrname;m_FriendList.GetText(index,strname);FriendList*s;s=start;while(s!=NULL&&strcmp(s->name,strname)!=0){s=s->next;}if(s==NULL){MessageBox("没找到!");return;}CStringipstr;ipstr.Format("%s",s->IP);CStringa;a="0#"+ipstr+"#"+strname+"#";CFilemyfile;myfile.Open("msg.txt",CFile::modeCreate|CFile::modeWrite);myfile.Write(a,a.GetLength());myfile.Close();//MessageBox(a);WinExec("Talk.exe",SW_SHOW);3隐藏模块⑴隐藏为隐藏按钮添加代码如下:voidCMainBordDlg::OnHidebtn(){TrayAddIcon();ShowWindow(SW_HIDE);}添加TrayAddIcon()方法intCMainBordDlg::TrayAddIcon(){BOOLres;NOTIFYICONDATAtnid;HICONhicon;hicon=LoadIcon(A仅GetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICONBEFORE));tnid.cbSize=sizeof(NOTIFYICONDATA);tnid.hWnd=GetSafeHwnd();tnid.cbSize=sizeof(NOTIFYICONDATA);tnid.hWnd=GetSafeHwnd();tnid.uID=DEMOICON;tnid.uFlags=NIF_ICON|NIF_TIP|NIF_MESSAGE;tnid.uCallbackMessage=TESTWM_NOTIFYICON;tnid.hIcon=hicon;if(lpszTipBefore)lstrcpyn(tnid.szTip,lpszTipBefore,sizeof(tnid.szTip));elsetnid.szTip[0]='\0';res=Shell_NotifyIcon(NIM_ADD,&tnid);if(hicon)DestroyIcon(hicon);returnres;}(2)在MainBordDlg.cpp添加下面代码:BEGIN_MESSAGE_MAP(CMainBordDlg,CDialog)ON_BN_CLICKED(IDC_HIDEBTN,OnHidebtn)ON_COMMAND(ID_SUBMENU1,OnSubmenu1)ON_COMMAND(ID_SUBMENU2,OnSubmenu2)在MainBordDlg.h添加如下代码:protected://Generatedmessagemapfunctions〃{{AFX_MSG(CMainBordDlg)afx_msgLRESULTOnTestNotifyIcon(WPARAMwParam,LPARAMIParam);afx_msgvoidOnSubmenu1();afx_msgvoidOnSubmenu2();在resouce.h添力口TOC\o"1-5"\h\z#defineIDR_MENU1139#defineID_SUBMENU132771#defineID_SUBMENU232772(3)响应鼠标LRESULTCMainBordDlg::OnTestNotifyIcon(WPARAMwParam,LPARAMlParam){switch(lParam){caseWM_LBUTTONDBLCLK:if(wParam==DEMOICON){ShowWindow(SW_SHOW);}break;caseWM_RBUTTONDOWN:if(wParam==DEMOICON){CMenu*pm1,m2;CPointpp(LOWORD(lParam),HIWORD(lParam));m2.LoadMenu(IDR_MENU1);pm1=m2.GetSubMenu(0);ClientToScreen(&pp);pm1->TrackPopupMenu(TPM_RIGHTALIGN|TPM_LEFTBUTTON,pp.x,GetSystemMetrics(SM_CYSCREEN)-50,this);}break;default:break;}return0L;}(4)添加菜单方法的鼠标双击左键显示主界面鼠标右键,弹出控制菜单voidCMainBordDlg::OnSubmenu1(){//TODO:AddyourcommandhandlercodehereShowWindow(SW_SHOW);}voidCMainBordDlg::OnSubmenu2(){//TODO:AddyourcommandhandlercodehereEndDialog(TRUE);}:、聊天Talk模块、新建一个Talk工程文件工程I工作区|其它文档|^ATLCOMAppWizardWin32StaticLibraryAudioEffectDUOWizard^ClusterResourceTypeWizard春|CustomAppWizard^DatabaseProject^DcvStudiaAdd-inWizardjj}DircdMuslcToolWizard圻DirectX9AppWizardExtendedStoredProcWizard^ISAPIExtensionWizard^Makefile霸MFCActiveXConlrolWizard弱MFCAppWizard(dll)只MFCAppWizard(exe)■OpcnGLWin32Application^ServiceWizardUlilityProject*T|Win32ApplicationWin32ConsoleApplication阂Win32DynairiiCrLiiikLibrary选择Dialogbased,然后Finsh工程名称以:|lalk?置回:|c\ProgramHles\VC6\MyProject:…G创建新的工作空间(0J厂添加到当前工作空间四厂/人属丁@1:平台[0:Pwiii32确定取捎I”I2J二界面设计如下:(一)、Talk界面设计如下:将各ID值设置如下图,通过类向导添加成员变量MEFCClassWizardMessageMapsMemberVariablesAutomaticinActiveXEventsClassllmfaProject:Dllassname:AddClass.,.■AddVariable.-.DuktcVariableCTalkDIgjJTalkMC:VVallATalkDIg.kCV^TalHTnlkDIg.cppControlIDs:1:MemberIDCCLEANUprlalef.niumnsBindAir1IOCCOLORIDC二FONTIDC-NAMECStringmNAMEIOCScrverlPADDRESSCIPAddressCtrlmServeriPADDRESSIDC二SHOWCStringmZShnwIOCTALKCStringrnTalkIDCANCELIDOKCBuhonm_SendMSGDescription:确定取梢|准备工作:在stdafx.h中添加fxsock.h头文件。1建一个Message.h文件,代码如MaindBord一致fstream.h、Message.h2在TalkDlg.cpp添加头文件#defineGetRValue(rgb)#defineGetGValue(rgb)#defineGetBValue(rgb)添加宏定义,用来控制颜色((BYTE)(rgb))((BYTE)(((WORD)(rgb))>>8))((BYTE)((rgb)>>16))3在TalkDlg.h添加成员变量如下://Constructionpublic:voidGetIP_Name();SOCKADDR_INsockStruct;SOCKETServerSocket;CStringIPstr;CTalkDlg(CWnd*pParent=NULL);//standardconstructorCStringIPName;CStringHostName;CFont*Font;LOGFONTm_log化COLORREFm_color;private:BOOLsign;一、发送信息模块聊天模块中,发送信息模块的实现过程有下面几个步骤:1用户按下发送按钮后,检测对方是否在线,将聊天内容发送出去,在本地即时聊天内容显示的编辑框中添加发送的内容并写入聊天记录。voidCTalkDlg::OnOK(){//TODO:Addextravalidationhereif(sign){CEdit*myedit;myedit=(CEdit*)GetDlgItem(IDC_TALK);myedit->SetReadOnly(FALSE);m_SendMSG.SetWindowText("发送");sign=FALSE;m_Talk.Empty();UpdateData(FALSE);((CEdit*)GetDlgItem(IDC_TALK))->SetFocus();return;}LPCTSTRip;ip=IPstr;WSADATAwsaData;if(WSAStartup(MAKEWORD(2,1),&wsaData))〃调用WindowsSocketsDLL{MessageBox("WinSock无法初始化!","错误信息",NULL);return;}DWORDdwip;if((dwip=inet_addr(ip))==INADDR_NONE){MessageBox("IP有误","错误信息",NULL);return;}ServerSocket=socket(PF_INET,SOCK_STREAM,0);〃创建服务器Socketif(ServerSocket==INVALID_SOCKET){MessageBox("无法创建服务器Socket","错误信息",NULL);return;}sockStruct.sin_family=AF_INET;//TCP/IP协议sockStruct.sin_port=htons(8001);//端口sockStruct.sin_addr.S_un.S_addr=dwip;if(connect(ServerSocket,(LPSOCKADDR)&sockStruct,sizeof(sockStruct))==SOCKET_ERROR){MessageBox("对方已经下线!","错误信息",NULL);return;}〃MessageBox("登录成功!”,"成功信息",NULL);//WSAAsyncSelect(ServerSocket,m_hWnd,WM_CLIENT_READCLOSE,FD_READ|FD_CLOSE);//产生相应传递给窗口的消息为WM_SERVER_ACCEPT,这是自定义消息UpdateData(TRUE);if(m_Talk.IsEmpty()){MessageBox("不允许发送空消息","错误信息",NULL);return;}CStringstrtime;CTimetime=CTime::GetCurrentTime();strtime=time.Format("[%H:%M:%S]");CStringrec;rec=HostName+""+strtime+"\r\n"+m_Talk+"\r\n"+"\r'n";CFilerecordfile;recordfile.Open("record.txt",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);recordfile.SeekToEnd();recordfile.Write(rec,rec.GetLength());recordfile.Close();msg.sign=1;m_Talk=IPName+"#"+HostName+"#"+m_Talk+"#";strcpy(msg.msg,(LPCTSTR)m_Talk);if(send(ServerSocket,(char*)&msg,sizeof(msg),0)==SOCKET_ERROR){MessageBox("发送消息失败","错误信息",MB_OK);return;}〃m_TalkList.InsertString(0,m_Talk);m_Talk.Empty();UpdateData(FALSE);CDialog::OnOK();}添力口:GetIP_Name()函数。voidCTalkDlg::GetIP_Name(){WORDwVersionRequested;WSADATAwsaData;charhostname[128];CStringstrip;PHOSTENThostinfo;wVersionRequested=MAKEWORD(2,0);if(WSAStartup(wVersionRequested,&wsaData)==0){if(gethostname(hostname,sizeof(hostname))==0){if((hostinfo=gethostbyname(hostname))!=NULL){strip=inet_ntoa(*(structin_addr*)*hostinfo->h_addr_list);}}WSACleanup();}IPName=strip;HostName.Format("%s",hostname);2.接收信息模块聊天模块中,接收信息模块的实现过程有下面几个步骤:(1)由主界面判断接收到信息的类型,是否为好友发来信息,如果是,则打开聊天窗口(2)读取消息,并写入聊天记录,(3)载入字体颜色信息。(4)显示聊天记录在初始化函数中添加代码://TODO:AddextrainitializationhereCStringstrtime;CTimetime=CTime::GetCurrentTime();strtime=time.Format("[%H:%M:%S]");m_color=0x00000000;IPstr="127.0.0.1";sign=FALSE;CFileMyFile;MyFile.Open("msg.txt",CFile::modeRead);intfilelong=0;filelong=MyFile.GetLength();charpbuf[1000];MyFile.Read(pbuf,sizeof(pbuf));//if(filelong<256)MyFile.Close();pbuf[filelong]='\0';IPstr.Empty();IPstr="";m_NAME.Empty();m_NAME="";inti=2;while(pbuf[i]!='#'){IPstr+=pbuf[i];i++;}i++;while(pbuf[i]!='#'){m_NAME+=pbuf[i];i++;}CFilerecordfile,readfile;recordfile.Open("record.txt",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite);if(pbuf[0]=='1')〃说明传递的是消息{i++;while(pbuf[i]!='#'){m_Record+=pbuf[i];i++;}CStringrec;rec=m_NAME+""+strtime+"\r\n"+m_Record+"\r\n"+"\r'n";recordfile.SeekToEnd();recordfile.Write(rec,rec.GetLength());〃SetDlgItemText(IDC_SendBTN,"回复消息"力}〃读取记录〃显示记录recordfile.SeekToBegin();charpbuff[5120];memset(pbuff,0,5120);recordfile.Read(pbuff,5120);recordfile.Close();m_Show=pbuff;//IPstr="192.168.1.98”;〃读取字体类型和颜色〃读取颜色CFileFontfile,colorfiler;intcolorlong=0;colorfiler.Open("colortemp.dat",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeRead);colorfiler.Read(&m_color,sizeof(m_color));colorfiler.Close();〃读取字体类型Font=newCFont;Fontfile.Open("Fontemp.dat",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeRead);Fontfile.Read(&m_logft,sizeof(m_logft));Fontfile.Close();Font->DeleteObject();Font->CreateFontIndirect(&m_logft);((CEdit*)GetDlgItem(IDC_TALK))->SetFont(Font,true);((CEdit*)GetDlgItem(IDC_SHOW))->SetFont(Font,true);〃显示更新msg.sign=1;((CEdit*)GetDlgItem(IDC_SHOW))->SetSel(100,100);this->UpdateData(false);m_ServerIPADDRESS.SetWindowText(IPstr);GetIP_Name();添力口GetIP_Name()函数voidCTalkDlg::GetIP_Name(){WORDwVersionRequested;WSADATAwsaData;charhostname[128];CStringstrip;PHOSTENThostinfo;wVersionRequested=MAKEWORD(2,0);if(WSAStartup(wVersionRequested,&wsaData)==0){if(gethostname(hostname,sizeof(hostname))==0){if((hostinfo=gethostbyname(hostname))!=NULL){strip=inet_ntoa(*(structin_addr*)*hostinfo->h_addr_list);}}WSACleanup();}IPName=strip;HostName.Format("%s",hostname);}3.聊天记录管理模块聊天记录管理模块的实现过程有下面几个步骤:(1)将发送内容和接收内容写入文本文件,发送消息时已实现(2)显示聊天记录,读取消息时已实现(3)删除聊天记录。voidCTalkDlg::OnClean(){DeleteFile("record.txt");m_Show="";this->UpdateData(false);}4.字体颜色模块字体颜色模块的实现过程有下面几个步骤:(1)调用系统字体,获取字体,写入存档voidCTalkDlg::OnFont(){Font=newCFont;//TODO:AddyourcontrolnotificationhandlercodehereCFontDialogfontDlg;if(fontDlg.DoModal()==IDOK){fontDlg.GetCurrentFont(&m_logft);CFileFontfile;Fontfile.Open("Fontemp.dat",CFile::modeCreate|CFile::modeWrite);Fontfile.Write(&m_logft,sizeof(m_logft));Fontfile.Close();}〃Font->GetLogFont(&lf);//lf.lfUnderline=TRUE;Font->DeleteObject();Font->CreateFontIndirect(&m_logft);((CEdit*)GetDlgItem(IDC_TALK))->SetFont(Font,true);}(2)调用系统字体颜色,获取颜色,写入存档voidCTalkDlg::OnC010ro{//TODO:AddyourcontrolnotificationhandlercodehereCColorDialogcolorDlg;if(colorDlg.DoModal()==IDOK){m_color=colorDlg.GetC010r();CFilecolorfile;colorfile.Open("colortemp.dat",CFile::modeCreate|CFile::modeWrite);colorfile.Write(&m_color,sizeof(m_color));colorfile.Close();}}(2)读取更新字体颜色,部分代码在读取消息时已实现(1)为对话框类添加WM_CTLCOLOR消息函数OnCtlColor();(2)在OnCtlColor()函数中添加代码后如下:HBRUSHCTalkDlg::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor){HBRUSHhbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);//TODO:ChangeanyattributesoftheDChere//if(nCtlColor==CTLCOLOR_EDIT)可以实现发送中g颜色变化~〃{〃pDC->SetBkMode(TRANSPARENT);pDC->SetTextColor(m_color);〃文字颜色//pDC->SetBkColor(RGB(233,233,220));〃背景颜色//HBRUSHb=CreateSolidBrush(RGB(233,233,220));//背景颜色〃}//TODO:Returnadifferentbrushifthedefaultisnotdesiredreturnhbr;
本文档为【基于MFC仿QQ聊天程序设计完整实例教程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_704284
暂无简介~
格式:doc
大小:417KB
软件:Word
页数:31
分类:
上传时间:2021-11-18
浏览量:8