局域网聊天程序设计.doc_第1页
局域网聊天程序设计.doc_第2页
局域网聊天程序设计.doc_第3页
局域网聊天程序设计.doc_第4页
局域网聊天程序设计.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

青岛理工大学C+面向对象课程设计报告院(系): 计算机工程学院 专业: 软件工程 学生姓名: 管巨伟 班级 软件132 学号: 201307227 题目: 局域网聊天程序设计 起迄日期: 2015.6.292015.7.10 设计地点: 计算机学院机房 指 导 教 师: 李传斌 杨鑫 完成日期: 2015 年7月 10 日任务书一、课程设计目的与要求1课程设计目的面向对象程序设计作为一门软件设计的课程,具有极强的实践性,必须使学生具备灵活应用理论知识的能力及面向对象程序设计技能。所以在C+面向对象程序设计课程学习完成后,安排课程设计教学环节。通过课程设计,使学生实际掌握面向对象的程序设计方法,了解C+面向对象的设计方法与技巧,有效地、深刻地理解课程内容,体会理论、方法和设计原则;培养学生分析实际问题和解决问题的能力,使学生具备使用面向对象程序设计开发工具设计实际系统的能力。2课程设计要求结构化程序设计使用的是功能抽象,面向对象程序设计不仅能进行功能抽象,而且能进行数据抽象。“对象”实际上是功能抽象和数据抽象的统一。C+语言的“对象”是“类”的实例,程序设计的基础是设计类,所以类的有关概念都是重点,尤其要抓住抽象、封装、继承和多态性等要素。面向对象程序设计的核心是类层次的设计。而具体类的设计的重点是如何选择数据成员和成员函数。根据数据成员和成员函数的特点,结合具体问题设计合适的类。成员函数设计中的难点是选择函数类型及其参数传递方式。开发系统离不开设计平台,学生应在掌握面向对象程序设计基础上,熟悉并能熟练使用面向对象程序设计开发平台,结合相关理论知识,进行相应系统开发。2、 课程设计内容课程设计题目及要求局域网聊天程序设计:服务端设置,通过对客户端多个线程的监听,显示客户端的上线、下线,与客户端进行信息交流。开启服务器是通过新建socket,绑定端口号,监听线程,等待客户端连入。创建动态数组,完成客户端的连入,存储客户端信息。结束线程,完成对资源释放。课程设计报告内容一、需求分析1.选做此课题或项的目的 开发此聊天程序旨在供个人聊天交流使用,进行多人并发聊天,交流思想见解,让使用者充分体验网络即时工具的方便快捷。同时了解现今正在使用的交流软件的基础功能,了解网络编程的基础思想,了解线程的使用,多个任务同时进行的原理,拓展自己的视野,提升自己的编码能力。也想通过该课题了解MFC的编码过程,学习收获到客户端、服务端都包含的交互式界面的实现及应用。2.程序所实现的功能客户端:1、获取输入的IP地址,2、获取通信的端口号,3、获取从服务器发来的信息,4、给服务器发送用户自定义的数据。服务端:1、获取客户端IP地址,2、获取通信的端口号,3、记录客户端连入的台数,4、向所有连入客户端发送消息,5、接收客户端发送过来的信息其他:进行网络的设置、关闭运行的程序、发送消息、系统托盘、系统托盘下对程序的显示和退出操作。二、内容设计 主聊天界面 ChatRoomDlg1.根据所选题目,给出模块图关闭程序窗口消息函数OnBnClickedCancel()更多功能消息函数OnBnClickedOther()网络设置 消息函数OnBnClickedNetset()系统托盘消息函数OnMenuTrayinco()客户端打开消息函数OnBnClickedStartClient()服务器打开 消 息 函数OnBnClickedStartServer()服务端设置OnBnClickedRadioServer()客户端设置OnBnClickedRadioClient()发送消息消息函数SendClientsMsg()接收消息CreatThread() 图1 模块图2.画出主程序及其主要模块的流程图开始Y网络设置N服务端或客户端设置Y更多功能 系统托盘N 发送消息 关闭窗口 结束图2主程序流程图 开始网络设置YN客户端设置输入IP地址和端口号绑定端口号开启服务端端开启客户端N服务端开启Y发送或接受消息 关闭线程、关闭窗口结束图3 网络设置及消息发送流程图开始 新建socketNY创建成功 绑定端口NY绑定成功 监听端口NY监听成功启动成功,接收客户端 结束图4 服务器启动流程图开始新建socketNY创建成功NY端口号正确 连接服务器NY连接成功进行数据交流结束图5 客户端连接流程图3.编写程序关键代码客户端的线程函数:#include stdafx.h#include ChatRoomDlg.h#include Inc.hDWORD WINAPI ConnectThreadFunc(LPVOID pParam)CChatRoomDlg *pChatRoom = (CChatRoomDlg *)pParam;/创建指向窗口的指针ASSERT(pChatRoom != NULL);/判断线程是否为创建成功pChatRoom-m_ConnectSock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);/创建socket并用一个变量保存if ( pChatRoom-m_ConnectSock = INVALID_SOCKET ) /判断socket是否创建成功AfxMessageBox(_T(新建Socket失败!);return FALSE;CString strServIp;pChatRoom-GetDlgItemText(IDC_IP_ADDR, strServIp);/获得服务端IP地址int iPort = pChatRoom-GetDlgItemInt(IDC_CONNECT_PORT);/获得端口号if ( iPort 65535 ) AfxMessageBox(_T(请输入合适的端口:1 - 65535);goto _Error_End;char szIpAddr16 = 0;/将宽字节转换成窄字节USES_CONVERSION;strcpy_s(szIpAddr, 16, T2A(strServIp);sockaddr_in server;/提供服务端信息server.sin_family = AF_INET;server.sin_port = htons(iPort);/转换并存储端口server.sin_addr.s_addr = inet_addr(szIpAddr);/转换并存储IP地址if ( connect(pChatRoom-m_ConnectSock,(struct sockaddr *)&server,sizeof(struct sockaddr) = SOCKET_ERROR ) AfxMessageBox(_T(连接失败,请重试!);goto _Error_End;pChatRoom-m_bIsServer = FALSE;/用于判断后面发送消息的是客户端pChatRoom-ShowMsg(_T(系统信息:连接服务器成功!);while( TRUE & !(pChatRoom-bShutDown) if ( SOCKET_Select(pChatRoom-m_ConnectSock) ) TCHAR szBufMAX_BUF_SIZE = 0;int iRet = recv(pChatRoom-m_ConnectSock, (char *)szBuf, MAX_BUF_SIZE, 0);/收取数据if ( iRet 0 ) /连接成功pChatRoom-ShowMsg(szBuf);else/连接失败pChatRoom-ShowMsg(_T(聊天室服务器已停止,请重新进行连接!);break;Sleep(500);_Error_End:closesocket(pChatRoom-m_ConnectSock);/关闭线程return TRUE;服务端的线程函数:#include stdafx.h#include ChatRoomDlg.hBOOL SOCKET_Select(SOCKET hSocket, int nTimeOut, BOOL bRead)/去缓冲区中查看是否有socket连接fd_set fdset;timeval tv;/超时时间FD_ZERO(&fdset);/清0FD_SET(hSocket, &fdset);nTimeOut = nTimeOut 1000 ? 1000 : nTimeOut;tv.tv_sec = 0;/以秒为单位tv.tv_usec = nTimeOut;/一毫秒为单位int iRet = 0;if ( bRead ) iRet = select(0, &fdset, NULL , NULL, &tv);/监听可读文件elseiRet = select(0, NULL , &fdset, NULL, &tv);/监听可写if(iRet m_ListenSock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);/创 /建socket并用一个变量保存if ( pChatRoom-m_ListenSock = INVALID_SOCKET ) /如果创建的socket是无效套接字AfxMessageBox(_T(新建Socket失败!);return FALSE;int iPort = pChatRoom-GetDlgItemInt(IDC_LISTEN_PORT);if ( iPort 65535 ) AfxMessageBox(_T(请输入合适的端口:1 - 65535);goto _Error_End;sockaddr_in service;/定义结构储存IP,端口号用于bindservice.sin_family = AF_INET;service.sin_addr.s_addr = INADDR_ANY;service.sin_port = htons(iPort);if ( bind(pChatRoom-m_ListenSock, (sockaddr*)&service, sizeof(sockaddr_in) = SOCKET_ERROR ) /判断绑定端口是否成功AfxMessageBox(_T(绑定端口失败!);goto _Error_End;if( listen(pChatRoom-m_ListenSock, 5) = SOCKET_ERROR ) /判断监听端口是否成功AfxMessageBox(_T(监听失败!);goto _Error_End;pChatRoom-ShowMsg(_T(系统信息:启动服务器成功!);pChatRoom-m_bIsServer = TRUE;/用于判断后面发送消息的是服务端pChatRoom-EnableWindow(IDC_START_SERVER, FALSE);/隐藏窗口pChatRoom-EnableWindow(IDC_STOP_SERVER);while( TRUE & !(pChatRoom-bShutDown) /为了连接多个客户端if ( SOCKET_Select(pChatRoom-m_ListenSock, 100, TRUE) ) /查看缓冲区中是否/有连接的客户端sockaddr_in clientAddr;/定义变量供accept使用int iLen = sizeof(sockaddr_in);SOCKET accSock = accept(pChatRoom-m_ListenSock, (struct sockaddr *)&clientAddr , &iLen);/连接缓冲区中客户端if (accSock = INVALID_SOCKET) continue;CClientItem tItem;/定义客户端节点tItem.m_Socket = accSock;tItem.m_pMainWnd = pChatRoom;tItem.m_strIp = inet_ntoa(clientAddr.sin_addr);/转换IP地址格式INT_PTR idx = pChatRoom-m_ClientArray.Add(tItem);/将新连接的客户端入队tItem.hThread=CreateThread(NULL,0,ClientThreadProc, &(pChatRoom-m_ClientArray.GetAt(idx), CREATE_SUSPENDED, NULL);/给连入客户端/创建线程,客户端并发运行pChatRoom-m_ClientArray.GetAt(idx).hThread = tItem.hThread;/保存线程,方/便之后的其他使用ResumeThread(tItem.hThread);/恢复线程运行CString strMsg;strMsg = _T(客户端:) + tItem.m_strIp + _T( 进入聊天室!);pChatRoom-ShowMsg(strMsg);pChatRoom-SendClientsMsg(strMsg, &tItem);/消息的转发Sleep(100);_Error_End:closesocket(pChatRoom-m_ListenSock);return TRUE;DWORD WINAPI ClientThreadProc(LPVOID lpParameter)/客户端处理线程函数:CString strMsg;CClientItem m_ClientItem = *(CClientItem *)lpParameter;/复制传进来的结点避免以前结/点被修while( TRUE & !(m_ClientItem.m_pMainWnd-bShutDown) /一直监视连接进来的客户端if ( SOCKET_Select(m_ClientItem.m_Socket, 100, TRUE) ) /判断缓冲区内是否有信息TCHAR szBufMAX_BUF_SIZE = 0;/定义一个缓冲区用于存储接收进来的信息int iRet = recv(m_ClientItem.m_Socket, (char *)szBuf, MAX_BUF_SIZE, 0);/接收信息if ( iRet 0 ) /接收成功strMsg = szBuf;strMsg = _T(客户端:) + m_ClientItem.m_strIp + _T() + strMsg;m_ClientItem.m_pMainWnd-ShowMsg(strMsg);m_ClientItem.m_pMainWnd-SendClientsMsg(strMsg, &m_ClientItem);else/客户端关闭strMsg = _T(客户端:) + m_ClientItem.m_strIp + _T( 离开了聊天室!);m_ClientItem.m_pMainWnd-ShowMsg(strMsg);m_ClientItem.m_pMainWnd-RemoveClientFromArray(m_ClientItem);m_ClientItem.m_pMainWnd-SendClientsMsg(strMsg, &m_ClientItem);break;Sleep(500);return TRUE;停止客户端、服务端:void CChatRoomDlg:StopClient()bShutDown = TRUE;DWORD dwRet = WaitForSingleObject(m_hConnectThred, 1000);/等待线程结束的响应if ( dwRet != WAIT_OBJECT_0 ) TerminateThread(m_hConnectThred, -1);/强制结束线程closesocket(m_ConnectSock);m_hConnectThred = NULL;m_ConnectSock = INVALID_SOCKET;m_bIsServer = -1;bShutDown = FALSE;void CChatRoomDlg:StopServer()UINT nCount = m_ClientArray.GetCount();HANDLE *m_pHandles = new HANDLEnCount+1;/额外的服务端线程,数组长度加1m_pHandles0 = m_hListenThread;for( int idx = 0; idx nCount; idx+ ) m_pHandlesidx+1 = m_ClientArray.GetAt(idx).hThread;bShutDown = TRUE;DWORD dwRet = WaitForMultipleObjects(nCount+1, m_pHandles, TRUE, 1000);if ( dwRet != WAIT_OBJECT_0 ) for( INT_PTR i = 0; i GetWindowRect(&mRect);/取得更多功能按钮的位置pt = mRect.BottomRight();/获取按钮右下角的坐标pt.y = mRect.top+10;mMenu.LoadMenu(IDR_MENU1);/加载菜单项pMenu = mMenu.GetSubMenu(0);pMenu-TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this);/将菜单项显示在相应坐标位置BOOL CChatRoomDlg:TrayMyIcon(BOOL bAdd)BOOL bRet = FALSE;NOTIFYICONDATA tnd;tnd.cbSize = sizeof(NOTIFYICONDATA);tnd.hWnd = GetSafeHwnd();/获得当前线程tnd.uID = IDR_MAINFRAME;if ( bAdd = TRUE ) tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;tnd.uCallbackMessage = WM_TRAYICON_MSG;/消息响应tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME);_tcscpy_s(tnd.szTip, sizeof(tnd.szTip), _T(聊天室v1.0);/鼠标移入显示信息ShowWindow(SW_MINIMIZE);ShowWindow(SW_HIDE);bRet = Shell_NotifyIcon(NIM_ADD, &tnd);/显示系统托盘图标elseShowWindow(SW_SHOWNA);SetForegroundWindow();bRet = Shell_NotifyIcon(NIM_DELETE, &tnd);/显示程序后,托盘图标消失return bRet;void CChatRoomDlg:OnMenuTrayinco()TrayMyIcon();LRESULT CChatRoomDlg:OnTrayCallBackMsg(WPARAM wparam, LPARAM lparam)switch(lparam)/消息类型case WM_RBUTTONUP:/右键单击CMenu mMenu, *pMenu = NULL;CPoint pt;mMenu.LoadMenu(IDR_MENU2);pMenu = mMenu.GetSubMenu(0);GetCursorPos(&pt);/获得坐标位置SetForegroundWindow();pMenu-TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this);break;case WM_LBUTTONDBLCLK:/左键双击ShowWindow(SW_RESTORE);SetForegroundWindow();TrayMyIcon(FALSE);break;default:break;return NULL;void CChatRoomDlg:OnMenuShow()ShowWindow(SW_RESTORE);TrayMyIcon(FALSE);void CChatRoomDlg:OnMenuExit()TrayMyIcon(FALSE);OnBnClickedCancel();三、调试分析1.实际完成的情况说明(完成的功能,支持的数据类型等)。 本程序实现了基础的局域网聊天过程,通过网络的设置可以实现服务端和客户端的信息收发,同时支持一对多的收发信息,多个客户端可以并发和服务端进行数据的收发。为防止操作错误,提供了多个提醒方式。其中包括停止服务器,停止客户端,以及程序处于客户端、服务端、最初状态时的关闭提醒。另外添加了系统托盘功能,在暂时不使用时可先挂起。实现程序过程中使用了包括库中包含的网络编程所需基本CString、Socket、HANDLE等数据,为对IP地址、端口号的处理,还包含了fd_set、sockaddr_in 等的结构,过程中为对进行判别状态,数据转换,还使用了BOOL、char、TCHAR等的中间转换及判断。2.程序的性能分析。本程序封装了多个函数,在使用时可反复调用,无需再重写相应代码。通过设计客户端类,将客户端独立分开,开启相应线程,无需等待上一个客户端停止即可与服务端进行数据收发,实现一对多的通信,提高了通信效率。开设多个线程时,关闭相应就复杂,需要将所有线程关闭,释放资源,增加了代码的复杂度。关闭线程时,本程序设置了标记,通过标记的执行来使程序将对应的线程自动释放,将该线程申请的资源释放完全。但在无法正常关闭的情况下,采用了强制关闭,可能会使申请的相应资源无法彻底释放。运行时并未出现太久等待,消息的响应较为快捷。同时在程序中使用动态数组存储客户端连入,不会为满足较多的连入量而定义较大数组,造成空间的浪费。还设置了多种操作提示,避免用户操作失误带来的不必要结果,安全性较为可观。总的来说,本程序综合考虑了代码的简洁性,类的分类清楚,资源的释放,空间的利用率高、运行效率高效、安全性能等多方面的优化,性能较为可观。3.上机过程中出现的问题及其解决方案。1、网络设置中,对RadioButton的选定和转换选定进行切换,操作的结果和预想的不一样,在网上查找后,在格式中先将对应一组的RadioButton进行编号,再将这组RadioButton的第一个的group属性设置为true,其他设置为false。2、连接服务器响应时,accept()函数为阻塞式的,这就在启动服务器时等待客户端连接,无法正常进行接下来的步骤。添加了异步I/O模型,通过select()函数的使用,在缓冲区中查看是否有客户端的连接,可以将阻塞的问题解决。3、可能会有多个客户端连接服务器,这个过程中每个客户端各自独立运行,在并行运行的问题上,通过对线程的创建,每个运行的程序单独开辟线程,使程序单独运行。4、对客户端的连入,服务端应该详细知道其信息,上线或下线时在服务端应该添加删除相应客户端,通过使用动态式数组,定义客户端类,每连入一个客户端,即添加入数组中,下线即从数组中删除客户端。5、程序多个地方会重用一个变量,如窗口指针、socket等的重用,如直接使用过程中可能会对其有所修改,使后面使用时出现非预想的结果。此时定义了对应变量来保存,使变量的使用更为方便。6、程序关闭时,直接关闭窗口相应的线程要停止,以便对占用的资源释放。强制终止线程仍会有该线程申请的一些资源得不到释放的问题。此时设置了bool变量判定程序是否关闭,关闭时让对应线程自动停止释放资源。7、系统托盘的设计,菜单栏的添加,运行时菜单栏出现在非预想位置。通过对CPoint的添加,获取更多功能按钮的位置,通过TrackPopupMenu的使用,将菜单显示在了更多按钮的右侧偏下的位置。4.程序中可以改进的地方说明。由于对新知识的学习,时间的限制,程序可以添加登录界面,当用户注册登录后进行数据的收发。收发数据时显示的为客户端的IP地址,可以相应改成客户端登录的昵称。还缺少对文件、图片、视频、语音的数据收发。系统托盘时的图标显示为默认图标,此时可以设置成具有程序特点的图标来表示。5.程序中可以扩充的功能及设计实现构想。用户登录界面可以直接添加一个窗口,设计好界面后,在按钮、文本编辑框等中添加响应代码,完成对聊天界面的调用即可。在聊天界面中,将用户登录的昵称获取,在聊天显示中,将字符串改成“昵称+所发消息”即可。添加流的操作,统一使用二进制流的操作,以便对图片、视频、语音的操作,通过输入输出流完成数据的收发。添加图片,在函数中将默认图片的名称改成自定义的图片,使系统托盘具有自己程序的特色。4、 用户手册程序支持Windows7,Windows8.1,WindowsXP系统。在debug文件中找到可执行文件,双击打开,出现如下窗口: 图6 程序运行主界面 点击网络设置按钮,出现如下界面:图7 网络设置界面选择服务器选项进行服务器设置,填写端口号,在0-65535之间,由于系统软件的对端口号的占用,填写的端口号大于1024为宜,设置好后,点击开启服务器如下图:图8 服务器启动成功重开一个程序进行客户端设置,设置局域网内服务器的IP地址,填写与服务器一致的端口号,填写完毕,点击连接服务器如下图:图9 客户端连接成功打开服务器窗口,显示如下信息,即为连接成功:图10 客户端连接后服务端响应在聊天编辑框中输入信息,此时发送消息按钮可用,点击发送,客户端即可收到消息,服务端、客户端界面显示如下:图11 服务端向客户端成功发送消息客户端也类似服务端发送消息,发送成功后如下图: 图12 客户端向服务端成功发送消息客户端使用中,点击服务器选项时,操作提示如下,点击关闭窗口,操作提示如下:图13 停止客户端服务器运行时点击客户端选项、关闭窗口,提示如下图:图14 停止服务端点击系统托盘,鼠标移到图标上时及单击鼠标右键时的显示如下: 图15 系统托盘图16 软件提示图17 系统托盘操作五、设计总结 由于本次课程设计采用了MFC来实现,由于课堂并未讲授,这就要求我们自己学习相关知识,了解使用MFC设计的编程过程,这就锻炼了我们所需的基本自学能力。编码过程中还遇到了一些不会的点,我们必须查阅书籍及网上资料来解决,需要我们在大量资源中准确使用需要的资料,凡是有难点就要学会查阅,锻炼解决问题的能力。实验过程中,还有与老师的交流,通过问问题来进一步了解相关知识。总而言之,在这个方面就是要求我们能在遇到问题时查找多种办法来解决问题。编码过程中,能够应用类的思想,抽象出类,来进行变量,函数的分类归属。同时,使用变量时,注意对全局变量、局部变量的定义及使用带来的影响,对相应的变量进行另外保存的关键,以便再后来使用的过程中造成变量的改变,影响程序运行结果。需要我们用心,仔细的来编写代码。在编写过程中,为了有条理的编写代码,还要求我们有整体编码的构思,一个一个模块逐步完善,自己学会了整体构思,分而治之的思想,处事就有条不紊。整体的课程设计也对整个学期c+所学知识进行了巩固,提高了自己对c+面向对象语言的编程思想的理解,和对类的使用。通过这次也学到了新的知识,整体课程设计过程用到了网络编程的知识,使自己对网络编程和线程创建使用的基础有了了解。总体来说,经过这次课程设计所学所知都是对自己的一个提升,收获颇多。六、参考文献1 李兰, 任凤华. C+面向对象程序设计. 西安: 西安电子科技大学出版社, 20102 李兰, 任凤华. C+面向对象程序设计实验指导及习题解析. 西安: 西安电子科技大学出版社, 20103 郑莉, 董渊. C+程序设计基础教程. 北京: 清华大学出版社, 20104 郑莉. C+程序设计基础教程学生用书. 北京: 清华大学出版社, 2010七、附录(要加上注释。)窗口类设计:class CChatRoomDlg : public CDialogpublic:CChatRoomDlg(CWnd* pParent = NULL);enum IDD = IDD_CHATROOM_DIALOG ;protected:virtual void DoDataExchange(CDataExchange* pDX);protected:HICON m_hIcon;virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public:void DlgAllInit();/对话框窗口初始化CButton m_StopClientBtn;BOOL EnableWindow(UINT uID, BOOL bEnable = TRUE);/隐藏函数void ExtendDiaog(BOOL bShow);/窗口的伸缩afx_msg void OnBnClickedNetset();BOOL bShowAll;/用于判断网络设置点击事件afx_msg void OnBnClickedStartServer();SOCKET m_ListenSock;/监听线程SOCKET m_ConnectSock;/连接线程HANDLE m_hListenThread;/监听线程句柄HANDLE m_hConnectThred;/连接线程句柄CArray m_ClientArray;/定义队列保存接入的客户端CEdit m_MsgEdit;void ShowMsg(CString strMsg);void RemoveClientFromArray(CClientItem in_Item);/删除客户端结点afx_msg void OnBnClickedSendmsg();afx_msg void OnBnClickedStartClient();void SendClientsMsg(CString strMsg, CClientItem *pNotSend = NULL);/消息发送函数int m_bIsServer;/用于判断发送消息的是客户端还是服务端afx_msg void OnEnChangeInputMsg();void StopClient();void StopServer();BOOL bShutDown;afx_msg void OnBnClickedStopClient();afx_msg void OnBnClickedStopServer();afx_msg void OnBnClickedRadioClient();/点击客户端触发的事件afx_msg void OnBnClickedRadioServer();/点击服务端触发的事件afx_msg void OnBnClickedCancel();afx_msg void OnBnClickedOther();BOOL TrayMyIcon(BOOL bAdd = TRUE);afx_msg void OnMenuTrayinco();LRESULT OnTrayCallBackMsg(WPARAM wparam, LPARAM lparam);afx_msg void OnMenuShow();afx_msg void OnMenuExit();窗口类函数成员的实现:CChatRoomDlg:CChatRoomDlg(CWnd* pParent )/构造函数: CDialog(CChatRoomDlg:IDD, pParent)m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);bShowAll = FALSE;m_ListenSock = INVALID_SOCKET;m_ConnectSock = INVALID_SOCKET;m_hListenThread = NULL;m_hConnectThred = NULL;m_bIsServer = -1;bShutDown = FALSE;void CChatRoomDlg:DlgAllInit()/进行窗口初始化CheckRadioButton(IDC_RADIO_CLIENT, IDC_RADIO_SERVER, IDC_RADIO_CLIENT);/1第一个RADIOBUTTON的IP 2第二个RADIOBUTTON的IP 3最后一个RADIOBUTTON的IPSetDlgItemText(IDC_IP_ADDR, _T(127.0.0.1);/设置默认窗口显示文本SetDlgItemText(IDC_CONNECT_PORT, _T(5566);/设置默认窗口显示文本SetDlgItemText(IDC_LISTEN_PORT, _T(5566);/设置默认窗口显示文本EnableWindow(IDC_STOP_CLIENT, FALSE);/禁用按钮EnableWindow(IDC_LISTEN_PORT, FALSE);/禁用按钮EnableWindow(IDC_STOP_SERVER, FALSE);/禁用按钮EnableWindow(IDC_START_SERVER, FALSE);/禁用按钮EnableWindow(IDC_STATIC_LISTEN_PORT, FALSE);/禁用按钮 EnableWindow(IDC_SENDMSG, FALSE);/禁用按钮BOOL CChatRoomDlg:EnableWindow(UINT uID, BOOL bEnable)/封装EnableWindow函数return GetDlgItem(uID)-EnableWindow(bEnable);/先获得一个窗口的指针然后调用EnableWindowvoid CChatRoomDlg:ExtendDiaog(BOOL bShow)/实现窗口的伸缩static CRect m_DlgRectLarge(0, 0, 0, 0);/定义窗口矩形static CRect m_DlgRectSmall(0, 0, 0, 0);static CRect m_GroupRectLarge(0, 0, 0, 0);/定义容器矩形static C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论