1、(1)将发送内容和接收内容写入文本文件;(2)显示聊天记录;(3)删除聊天记录。D、 字体颜色模块实现字体颜色模块的过程有下面几个步骤:(1)调用系统字体,获取字体,写入存档(2) 调用系统字体颜色,获取颜色,写入存档(3)读取、更新字体颜色。让我们先看下运行结果:Windows7 Windows2003 Windows7 Windows2003Windows7Windows 2003心动了么?让我们开始对第一个模块,也就是MainBord的设计吧。一、MainBord模块新建一个MainBord工程 选择Dialog based,然后Finsh二、界面设计如下:(一)、MainBord界面设
2、计如下:将各ID值设置如下图,通过类向导添加listbox成员变量(二)、添加好友对话框界面设计如下:双击,添加类将各ID值设置如下图,通过类向导添加成员变量(三)、弹出菜单界面设计如下:(四)添加图标三、代码部分:(一)准备部分首先,在StdAfx.h中添加如下代码:afxsock.h 头文件;在MainBordDlg.cpp添加Message.h 、AddFreind.h;其次,MainBordDlg.h添加如下代码:#define WM_CLIENT_ACCEPT WM_USER+101#define WM_CLIENT_READCLOSE WM_USER+102/ CMainBordD
3、lg dialog/ Constructionpublic: int TrayAddIcon(); char lpszTipBefore100; /修改前的图标提示信息 LRESULT OnAccept(WPARAM wParam,LPARAM lParam); LRESULT OnRead(WPARAM wParam,LPARAM lParam); CMainBordDlg(CWnd* pParent = NULL); / standard constructor SOCKET Client; /客户的连接请求 SOCKET ServerSocket; /SOCKET SOCKET temp
4、Socket; SOCKADDR_IN tempSocketAddr; SOCKADDR_IN m_sockServerAddr; /SOCKET 结构 BOOL IsTrue; CString ip; CString SystemMessage; void SendMsg(); CString IPName; CString HostName; void GetIP_Name(); void SelectWay(); /好友列表 struct FriendList char name100; char IP18; struct FriendList *next; public: CStrin
5、g ip; *start,*last;第三,添加Message.h文件代码如下:struct Message int sign; char msg1000;msg;第四,添加消息响应LRESULT CMainBordDlg:OnRead(WPARAM wParam, LPARAM lParam) if(!IsTrue) /m_List.InsertString(0,有数据到达,但是没有工作站连接。); CString str; switch (WSAGETSELECTEVENT(lParam) case FD_READ: if(recv(Client,(char *)&msg,sizeof(m
6、sg),0) = SOCKET_ERROR) / m_List.InsertString(0,接收数据发生错误。 return 0; SelectWay(); /m_History_List.InsertString(0,str); /MessageBox(str); break; case FD_CLOSE: str = _T(工作站退出。 /m_List.InsertString(0,str); closesocket(Client); /IsTrue = FALSE; break; return 0L;OnAccept(WPARAM wParam, LPARAM lParam) if (
7、WSAGETSELECTERROR(lParam)Error detected on entry into OnServerAccept. return 0L; if(WSAGETSELECTEVENT(lParam) = 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; /Clin
8、et WSAAsyncSelect(Client,m_hWnd,WM_CLIENT_READCLOSE,FD_READ|FD_CLOSE); IsTrue = TRUE; /m_List.InsertString(0,有客户机连接上了服务器。(一)、登录模块(1)初始化列表,获取用户名,服务器的IP地址,使按键失效。在MainBordDlg.cpp的初始化函数OnInitDialog添加如下代码: m_FriendList.SetItemHeight( 0, 18 ); start=NULL; last=NULL; / TODO: Add extra initialization here G
9、etIP_Name(); strcpy(lpszTipBefore,QQ +IPName); (CEdit *)GetDlgItem(IDC_AddBTN)-EnableWindow(FALSE); (CEdit *)GetDlgItem(IDC_HIDEBTN)-(2)在MainBordDlg.cpp添加获取主机获得IP和主机名的函数void CMainBordDlg:GetIP_Name()/获得IP和主机名 WORD wVersionRequested; WSADATA wsaData; char hostname128; CString strip; PHOSTENT hostinfo
10、; wVersionRequested=MAKEWORD(2,0); if(WSAStartup(wVersionRequested,&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) 确定登陆后创建套接字,绑定
11、,监听, 初始化成功后,激活添加好友和隐藏功能在MainBordDlg.cpp添加登陆按钮的方法OnStartBTN() Add your control notification handler code here int iErrorCode; if (WSAStartup(MAKEWORD(2,1),&wsaData) /调用Windows Sockets DLL WSACleanup(); return;服务器开始创建SOCKET。 ServerSocket=socket(PF_INET,SOCK_STREAM,0); /创建服务器端Socket,类型为SOCK_STREAM,面向连接
12、的通信 if(ServerSocket = INVALID_SOCKET)无法创建服务器socket! 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) /与选定的端口绑定无法绑定服
13、务器。 iErrorCode=WSAAsyncSelect(ServerSocket,m_hWnd,WM_CLIENT_ACCEPT,FD_ACCEPT); / 产生相应传递给窗口的消息为WM_SERVER_ACCEPT ,这是自定义消息 if (iErrorCode = SOCKET_ERROR) if (listen(ServerSocket,1) = SOCKET_ERROR) /开始监听客户连接请求服务器监听失败! IsTrue = TRUE; /m_List.AddString(服务器绑定监听成功。EnableWindow(TRUE);(二)好友模块(1)弹出对话框 (2)获取对话框
14、中的IP(3)检查对方是否在线,建立连接(4)发送请求验证1在AddFreind.h添加一个成员 CString ipstr;2好友请求对话框添加代码,在AddFreind.cpp增加发送请求(确定)按钮代码:void AddFreind:OnOK() Add extra validation here UpdateData(TRUE); m_IPAddress.GetWindowText(ipstr); CDialog:OnOK();3在MainBordDlg.cpp添加好友按钮的方法 void CMainBordDlg:OnAddBTN() AddFreind mydlg; if(mydl
15、g.DoModal() = IDOK) if(mydlg.ipstr.GetLength()=0) MessageBox(您没有输入IP地址,错误信息,NULL); return; ip=mydlg.ipstr; else return; tempSocket=socket(PF_INET,SOCK_STREAM,0); if(tempSocket = INVALID_SOCKET) DWORD dwip; if(dwip=inet_addr(ip)=INADDR_NONE) MessageBox(IP赋值错误 return; tempSocketAddr.sin_family=AF_INET
16、; /使用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(对方不在线添加失败 else msg.sign=2; SystemMessage=IPName+#+HostName+; strcpy(msg.msg,SystemMessage); if(send(tem
17、pSocket,(char *)&msg,sizeof(msg),0)=SOCKET_ERROR)发送消息失败,MB_OK);3好友列表模块与消息响应(1)客户接收请求,将服务端加入列表,发送客户端信息 ;(2)服务端得到客户端信息,加入列表;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);/ MessageB
18、ox(here/ MessageBox(message); CFile myfile; switch(i) case 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.Form
19、at(,msg.msg);/ MessageBox(message); strIP= strName= j=0; while(msg.msgj!=#) strIP+=msg.msgj; j+; j+; strName+=msg.msgj; if(MessageBox(strName+请求你通过身份验证请求信息,IDOK)!=1) /MessageBox( return; for(j=0;jIP,strIP);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+ msg.sign=3; SendMsg(); case 3:/MessageBox(message); message.Format( strIP= MessageBox(strName+通过你的身份验证验证信息 UpdateData(TRUE); default:(2) 消息响应:SendMsg()/接受或发送系统请求信息 if(dwip=inet
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2