ImageVerifierCode 换一换
格式:DOCX , 页数:41 ,大小:298.43KB ,
资源ID:6720375      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6720375.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MFC仿QQ程序设计完整实例教程.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

MFC仿QQ程序设计完整实例教程.docx

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

2、 (3)检查对方是否在线,建立连接 (4)发送请求验证C、好友列表模块(1)客户接收请求,将服务端加入列表,发送客户端信息 (2)服务端得到客户端信息,加入列表 (3)双击好友列表,弹出发送信息对话框D、隐藏模块(1)隐藏与显示 (2)响应鼠标,弹出控制菜单(2)聊天Talk模块A、发送信息模块聊天模块中,发送信息模块的实现过程有下面几个步骤:(1)通过列表双击一个好友为聊天对象,弹出聊天窗口; (2)用户按下发送按钮后,检测对方是否在线, 检测对方是否在线 (3)将聊天内容发送出去(4)在本地即时聊天内容显示的编辑框中添加发送的内容并写入聊天记录。B、 接收信息模块聊天模块中,接收信息模块的

3、实现过程有下面几个步骤:(1)由主界面判断接收到信息的类型,是否为好友发来信息,如果是,则打开聊天窗口 (2)读取消息,并写入聊天记录, (3)载入字体颜色信息。 (4) 显示聊天记录C、聊天记录管理模块聊天记录管理模块的实现过程有下面几个步骤:(1)将发送内容和接收内容写入文本文件;(2)显示聊天记录;(3)删除聊天记录。D、 字体颜色模块实现字体颜色模块的过程有下面几个步骤:(1)调用系统字体,获取字体,写入存档(2) 调用系统字体颜色,获取颜色,写入存档(3)读取、更新字体颜色。让我们先看下运行结果:Windows7 Windows2003 Windows7 Windows2003 Wi

4、ndows7 Windows2003Windows7Windows 2003心动了么?让我们开始对第一个模块,也就是MainBord的设计吧。一、MainBord模块新建一个MainBord工程 选择Dialog based,然后Finsh二、界面设计如下:(一)、MainBord界面设计如下:将各ID值设置如下图,通过类向导添加listbox成员变量(二)、添加好友对话框界面设计如下:双击,添加类将各ID值设置如下图,通过类向导添加成员变量(三)、弹出菜单界面设计如下: (四)添加图标三、代码部分:(一)准备部分首先,在StdAfx.h中添加如下代码:afxsock.h 头文件;在MainB

5、ordDlg.cpp添加Message.h 、AddFreind.h;其次,MainBordDlg.h添加如下代码: #define WM_CLIENT_ACCEPT WM_USER+101#define WM_CLIENT_READCLOSE WM_USER+102/ CMainBordDlg dialog/ Constructionpublic: int TrayAddIcon(); char lpszTipBefore100; /修改前的图标提示信息 LRESULT OnAccept(WPARAM wParam,LPARAM lParam); LRESULT OnRead(WPARAM

6、wParam,LPARAM lParam); CMainBordDlg(CWnd* pParent = NULL); / standard constructor SOCKET Client; /客户的连接请求 SOCKET ServerSocket; /SOCKET SOCKET tempSocket; SOCKADDR_IN tempSocketAddr; SOCKADDR_IN m_sockServerAddr; /SOCKET 结构 BOOL IsTrue; CString ip; CString SystemMessage; void SendMsg(); CString IPNam

7、e; CString HostName; void GetIP_Name(); void SelectWay(); /好友列表 struct FriendList char name100; char IP18; struct FriendList *next; public: CString ip; *start,*last;第三,添加Message.h文件代码如下:struct Message int sign; char msg1000;msg;第四,添加消息响应LRESULT CMainBordDlg:OnRead(WPARAM wParam, LPARAM lParam) if(!I

8、sTrue) /m_List.InsertString(0,有数据到达,但是没有工作站连接。); CString str; switch (WSAGETSELECTEVENT(lParam) case FD_READ: if(recv(Client,(char *)&msg,sizeof(msg),0) = SOCKET_ERROR) / m_List.InsertString(0,接收数据发生错误。); return 0; SelectWay(); /m_History_List.InsertString(0,str); /MessageBox(str); break; case FD_CL

9、OSE: str = _T(工作站退出。); /m_List.InsertString(0,str); closesocket(Client); /IsTrue = FALSE; break; return 0L;LRESULT CMainBordDlg:OnAccept(WPARAM wParam, LPARAM lParam) if (WSAGETSELECTERROR(lParam) /m_List.InsertString(0,Error detected on entry into OnServerAccept.); return 0L; if(WSAGETSELECTEVENT(l

10、Param) = FD_ACCEPT)/如果 Client = accept(ServerSocket,(LPSOCKADDR)&m_sockServerAddr,0); if (Client = INVALID_SOCKET) /m_List.InsertString(0,Server socket failed to accept connection.); return 0L; /Clinet WSAAsyncSelect(Client,m_hWnd,WM_CLIENT_READCLOSE,FD_READ|FD_CLOSE); IsTrue = TRUE; /m_List.InsertS

11、tring(0,有客户机连接上了服务器。); return 0L;(一)、登录模块登陆模块的实现过程有下面几个步骤:(1)初始化列表,获取用户名,服务器的IP地址,使按键失效。在MainBordDlg.cpp的初始化函数OnInitDialog添加如下代码: m_FriendList.SetItemHeight( 0, 18 ); start=NULL; last=NULL; / TODO: Add extra initialization here GetIP_Name(); strcpy(lpszTipBefore,QQ +IPName); (CEdit *)GetDlgItem(IDC_

12、AddBTN)-EnableWindow(FALSE); (CEdit *)GetDlgItem(IDC_HIDEBTN)-EnableWindow(FALSE);(2)在MainBordDlg.cpp添加获取主机获得IP和主机名的函数void CMainBordDlg:GetIP_Name()/获得IP和主机名 WORD wVersionRequested; WSADATA wsaData; char hostname128; CString strip; PHOSTENT hostinfo; wVersionRequested=MAKEWORD(2,0); if(WSAStartup(wV

13、ersionRequested,&wsaData)=0) if(gethostname(hostname,sizeof(hostname)=0) if(hostinfo=gethostbyname(hostname)!=NULL) strip=inet_ntoa(*(struct in_addr *)*hostinfo-h_addr_list); WSACleanup(); IPName=strip; HostName.Format(%s,hostname);(3) 确定登陆后创建套接字,绑定,监听, 初始化成功后,激活添加好友和隐藏功能在MainBordDlg.cpp添加登陆按钮的方法voi

14、d CMainBordDlg:OnStartBTN() / TODO: Add your control notification handler code here WSADATA wsaData; int iErrorCode; if (WSAStartup(MAKEWORD(2,1),&wsaData) /调用Windows Sockets DLL WSACleanup(); return; /m_List.InsertString(0,服务器开始创建SOCKET。); ServerSocket=socket(PF_INET,SOCK_STREAM,0); /创建服务器端Socket,类

15、型为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,siz

16、eof(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) /开始监听客户连接请求

17、/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添加一个成员 / Constru

18、ctionpublic: CString ipstr;2好友请求对话框添加代码,在AddFreind.cpp增加发送请求(确定)按钮代码:void AddFreind:OnOK() / TODO: Add extra validation here UpdateData(TRUE); m_IPAddress.GetWindowText(ipstr); CDialog:OnOK();3在MainBordDlg.cpp添加好友按钮的方法 void CMainBordDlg:OnAddBTN() / TODO: Add your control notification handler code h

19、ere AddFreind mydlg; if(mydlg.DoModal() = IDOK) if(mydlg.ipstr.GetLength()=0) MessageBox(您没有输入IP地址,错误信息,NULL); return; ip=mydlg.ipstr; else return; WSADATA wsaData; if (WSAStartup(MAKEWORD(2,1),&wsaData) /调用Windows Sockets DLL WSACleanup(); return; tempSocket=socket(PF_INET,SOCK_STREAM,0); /创建服务器端So

20、cket,类型为SOCK_STREAM,面向连接的通信 if(tempSocket = INVALID_SOCKET) return; DWORD dwip; 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,

21、(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好友列表模块与消息响应(

22、1)客户接收请求,将服务端加入列表,发送客户端信息 ;(2)服务端得到客户端信息,加入列表; void CMainBordDlg:SelectWay() FriendList *newlist=new struct FriendList; CString strIP,strName,temp;/添加新成员 CString message; int i,j=0; i=msg.sign; message.Format(%d#%s,msg.sign,msg.msg);/ MessageBox(here);/ MessageBox(message); CFile myfile; switch(i) c

23、ase 1: /别人跟你聊天 myfile.Open(msg.txt,CFile:modeCreate | CFile:modeWrite ); myfile.Write(message, message.GetLength(); myfile.Close(); /(HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName) WinExec(Talk.exe,SW_SHOW);break; case 2:message.Format(%s,msg.msg);/ MessageBox(message); strIP=; strName=;

24、 j=0; while(msg.msgj!=#) strIP+=msg.msgj; j+; j+; while(msg.msgj!=#) strName+=msg.msgj; j+; if(MessageBox(strName+请求你通过身份验证,请求信息,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;

25、 last=newlist; m_FriendList.AddString(strName); ip=strIP;/同意加为好友 SystemMessage=IPName+#+HostName+#; msg.sign=3; SendMsg(); break; case 3:/MessageBox(message); message.Format(%s,msg.msg);/MessageBox(message); strIP=; strName=; j=0; while(msg.msgj!=#) strIP+=msg.msgj; j+; j+; while(msg.msgj!=#) strNam

26、e+=msg.msgj; 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) 消息响应:void CMainBordDlg:SendMsg()/接受或发送系统请求信息 WSADATA wsaData; if (WSAStartup(MAKEWORD(2,1),&wsaData) /调用Windows Sockets DLL WSACleanup(); return; tempSocket=socket(PF_INET,SOCK_STREAM,0); /创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信 if(tempSocket = INVALID_SOCKET) return; DWORD dwip; if(dwip=inet_addr(i

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1