局域网监控系统毕业设计

上传人:仙*** 文档编号:46005184 上传时间:2021-12-10 格式:DOC 页数:37 大小:326.50KB
收藏 版权申诉 举报 下载
局域网监控系统毕业设计_第1页
第1页 / 共37页
局域网监控系统毕业设计_第2页
第2页 / 共37页
局域网监控系统毕业设计_第3页
第3页 / 共37页
资源描述:

《局域网监控系统毕业设计》由会员分享,可在线阅读,更多相关《局域网监控系统毕业设计(37页珍藏版)》请在装配图网上搜索。

1、深圳信息职业技术学院深圳信息职业技术学院毕业设计(论文)毕业设计(论文)2011 2012 学年第学年第 一一 学期学期题目题目 家庭局域网监控系统家庭局域网监控系统姓 名 周彬 学 号 0901100101 系 别 软件工程系 专 业 软件技术 班 级 09 软件 3-2 班 指导教师 黄锐军 答辩日期 深圳信息职业技术学院设计 (论文) 开题报告课题名称: 局域网监控系统 指导教师: 职称: 副教授 学生人数: 5 人 学生姓名(学号、专业):姓名:周彬 开题报告内容: 设计的目的及意义:随着信息化的不断扩展,大部分企业都采用计算机来管理自己的财务、商业机密等别的业务。但是并不是每个用计算

2、机的员工,都能在上班时间充分的利用计算机干自己的工作。即便是制定了相关的规章制度还是不能约束其行为。那么局域网监控系统,完全可以起到约束的作用。该系统可以实时的对局域网内的每台计算机进行屏幕监控。 设计的要求:(1)学会如何分割 UDP 数据报;(2)学会发送和接受UDP 数据报;(3)学会自定义控件;(4)学会抓取屏幕(5)学会 ADO 技术对数据库操作 预期成果:(1)将客户端隐藏,并且不断向服务器端发送屏幕信息;(2)通过发送指令来控制客户端发来屏幕信息的位置;(3)通过 ADO 技术实现对 ACCess 数据库操作 时间安排:12 月 10 号-12 月 15 号熟悉课题的基本要求,查

3、阅相关的资料,初步拟定设计的整体方案,完成开题报告 ;12 月 16 日-12 月 23号将监控系统的客户端完成,并对客户端进行试验总;12 月 24 日-1 月 5 号将服务器端完成,对数据的操作进行总结,以及整个毕业设计的完成。 在黄老师的指导下,综合我们以前所学的专业知识及查找的相关资料,能够在预期的时间内完成整个网站和论文。 指导教师签名: 日期: 备注:(1)来源:A教师拟订;B学生建议;C企业和社会征集;D实习单位提供(2)类型:X真实课题;Y模拟课题;Z虚拟课题摘摘 要要Internet 在我国刚刚起步时,上网人群主要是从事IT 技术的专业人员,年龄段多是中年人,但是随着Inte

4、rnet 技术的快速发展,我国的上网人群年龄逐年增多,不仅包括中年人,青少年及老年人在上网人群的比重不断增加。Internet 上丰富的资源给人们带来了很多的方便,但是也存在许多不良的信息危害青少年的健康,一些家长担心青少年上网会影响其学习。局域网监控系统能够将局域网中的某一台计算机的屏幕信息发送到服务器端,家长可以随时了解青少年浏览的网页信息,对青少年上网起到监督作用。本文首先介绍了问题的背景,接着提出问题,并针对具体项目展开需求调查分析;再基于需求设计出具体的方案;然后对整个系统进行了详细的分析和设计,在设计与实现过程中,结合源代码具体的描述出整个项目的开发过程;最后对整个系统进行测试得出

5、测试结论。关键字:屏幕监控;数据过滤 第一章第一章 绪论绪论.81.1 问题背景.81.2 研究范围及技术要求.81.2.1 研究范围.81.2.2 技术要求.8第二章第二章 系统设计系统设计.102.1 需求分析.102.2 系统目标.102.3 系统功能结构.102.3 系统预览.112.4 业务流程图.132.5 程序运行环境.142.5 我的任务数据库设计、数据库的连接及界面的搭建14第三章第三章 客户端设计客户端设计.153.1 客户端模块概述.153.2 客户端技术分析.153.3 客户端实现过程.16第四章第四章 公共类设计公共类设计.20第五章第五章 系统登录模块设计系统登录模

6、块设计.205.1 系统登录模块概述.205.2 系统登录模块技术分析.215.3 系统登录模块实现过程.21第六章第六章 主窗体设计主窗体设计.246.1 主窗体概述.246.2 主窗体的实现过程.24第七章第七章 操作员管理模块设计操作员管理模块设计.287.1 操作员模块概述.287.2 操作员模块技术分析.297.3 操作员模块实现过程.29第八章第八章 系统设置模块设计系统设置模块设计.368.1 系统设置模块概述.368.2 系统设置模块实现过程.36.37第九章第九章 开发技巧与难点分析开发技巧与难点分析.379.1 及时关闭记录集.379.2 访问带密码的 Access 数据库

7、.389.3 防止 SQL 注入攻击.389.4ON_COMMAND_RANGE 宏的注意事项.399.5 收获与体会.39致谢致谢.39参考文献参考文献.40第一章第一章 绪论绪论1.1 问题背景问题背景Internet 在我国刚刚起步时,上网人群主要是从事IT 技术的专业人员,年龄段多是中年人,但是随着Internet 技术的快速发展,我国的上网人群年龄逐年增多,不仅包括中年人,青少年及老年人在上网人群的比重不断增加。Internet 上丰富的资源给人们带来了很多的方便,但是也存在许多不良的信息危害青少年的健康,一些家长担心青少年上网会影响其学习。局域网监控系统能够将局域网中的某一台计算机

8、的屏幕信息发送到服务器端,家长可以随时了解青少年浏览的网页信息,对青少年上网起到监督作用。1.2 研究范围及技术要求研究范围及技术要求1.2.1 研究范围研究范围 1. 设计该系统的功能模块划分,使用 Acesss 2007 设计出该系统的数据库。2. 参考实际局域网监控系统,完成对系统的需求分析及设计文档。3.根据需求分析及设计文档完成代码编制。1.2.2 技术要求技术要求 1. 功能模块划分合理。2. 数据库设计满足功能要求。3. 采用 UDP 协议进行数据传输。4. 对客户端的数据进行过滤。5. 建立数据库访问接口类,实现对数据库的访问。6. 实时抓取客户端的屏幕信息。第二章第二章 系统

9、设计系统设计2.1 需求分析需求分析 局域网监控系统主要是对计算机屏幕信息进行实时监控。因此局域网监控系统需要实现屏幕信息的时时发送和接受。由于屏幕信息需要时时显示,因此信息的传输速度要快,屏幕信息要时时发送。为此,选择 UDP 协议进行传输。为了防止服务器端随意的接收客户端发来的数据报,服务器端需要对发来的数据报进行过滤,只有是制定的客户端才接收数据。2.2 系统目标系统目标本系统属于小型的局域网监控系统,可以对某一台计算机进行屏幕监控。本系统主要实现一下目标:1.系统采用人机交互的方式,界面美观友好。2.屏幕信息需要时时显示,网络延时不能大于 1 秒。3.服务器端可以随时运行,只要客户端运

10、行,就能够显示屏幕信息。4.系统运行时占用内存不能大于 10MB,以免影响系统的性能。5.客户端运行时需要隐藏显示窗口,其感觉不到在运行。2.3 系统功能结构系统功能结构局域网监控系统功能结构图如下所示。局域网监控系统客户端服务器端主窗体主窗体系统登录操作员管理系统设置2.3 系统预览系统预览局域网监控系统分为客户端和服务器端两部分,其中客户端运行时将窗体隐身,服务器端主要有四个窗体组成,分别为主窗体、操作员管理窗体、系统登录窗体、系统设置窗体。其中,主窗体用于接收并显示屏幕信息。操作员管理窗体用于添加、修改、删除操作员信息,系统登录窗体用于系统在启动时验证用户身份。系统设置窗体用于设置客户端

11、 IP。我的任务:界面的搭建,数据库的设计,界面的优化 主 窗 体系统登录窗体操作员管理窗体 系统设置窗体2.4 业务流程图业务流程图系系 统统 登登 录录登录成功登录成功是主主 窗窗 体体系统设置方向控制操作员管理否2.5 程序运行环境程序运行环境 本系统对运行环境有一定的要求,具体如下:1、 系统开发平台:Microsoft VC 6.0.2、 系统开发语言:C+3、 数据库软件系统软件:Microsoft Acess 20074、 运行平台:Windows XP/75、 分辨率:最佳效果 1024*1280 像素2.5 数据库设计数据库设计1、 数据库分析在开发局域网监控系统时,使用数据

12、库主要用于记录操作员信息及客户端信息,系统设计的数据量比较小,因此本系统采用的 Microsoft Access2007 作为后台数据库,数据库名字为 db_Video,其中包含了 2 张表2、 数据库概念设计数据库概念设计是根据各个模块的需求“抽象”出数据实体的过程,也就是宏观上用文字、图表描述数据表的过程。 为了增加系统的安全性,服务器端设置了登录窗口,在系统启动时弹出该窗口,要求用户输入操作员名称和密码。其中用户的操作员名称和密码信息存储在数据表中。这样在系统登录模块就需要一个操作员信息实体。 为了过滤服务器端接受的数据报,时期值接收制定客户端发来的数据,需要存储客户端 IP,为此,需要

13、单独设计一个客户端信息实体对象。操作员信息表操作员密码操作员姓名客户端信息表客户端 IP 地址第三章第三章 客户端设计客户端设计3.1 客户端模块概述客户端模块概述 局域网监控系统分为客户端和服务器端两大模块,其中,客户端的主要作用是时时抓取本机的屏幕信息,将其分成多个数据报,发送到服务器端。为了保证屏幕信息能够完整的发送到服务器,客户端在发送一个数据报后,需要等待服务器端发来的确认信息,然后继续发送下一个数据报。3.2 客户端技术分析客户端技术分析客户端要实现屏幕信息的发送,要解决两个关键问题:一是获取屏幕信息,将其转换为位图格式;二是将位图信息发送到服务器。一、将屏幕信息转换为位图格式 C

14、DC* pDeskDC = GetDesktopWindow()-GetDC();/获取桌面画布对象CRect rc;GetDesktopWindow()-GetClientRect(rc);/获取屏幕的客户区域int width = 300;/获取屏幕的宽度int height = 300;/获取屏幕的高度CDC memDC;/定义一个内存画布memDC.CreateCompatibleDC(pDeskDC);/创建一个兼容的画布CBitmap bmp;bmp.CreateCompatibleBitmap(pDeskDC,width,height);/创建兼容位图memDC.SelectOb

15、ject(&bmp);/选中位图对象BITMAP bitmap; /定义位图信息bmp.GetBitmap(&bitmap); /获取位图信息 memDC.BitBlt(0,0,width,height,pDeskDC,m_X,m_Y,SRCCOPY);/将屏幕信息输出到位图二、根据位图对象获取位图信息一个位图文件通常有“位图文件头” 、 “位图信息头” 、 “调色板”和“实际位图数据”4 个部分组成。其中“位图文件头” 包含 BMP 图像文件的类型、显示内容 、位图标记、位图大小 等信息,在程序中使用 BITMAPFILEHEADER 结构来表示。 “位图信息头”和“调色板”2 个部分描述了

16、位图的宽度、高度、是否压缩、位图颜色等信息,在程序中使用 BITMAPINFO 结构描述。由于程序发送的位图不是以文件形式发送的,只需要发送位图位图信息头、调色板和实际数据就可以了,因此不需要位图文件头。int panelsize = 0;/记录调色板大小if (bitmap.bmBitsPixelbmiHeader.biBitCount = bitmap.bmBitsPixel;/设置位图颜色用到的位数pBInfo-bmiHeader.biClrImportant = 0;/指定显示位图颜色的种类,如果值为0,所有的颜色种类都需要pBInfo-bmiHeader.biCompression

17、= 0;/指定位图的压缩类型 - “该语句=0”说明改为图不进行压缩pBInfo-bmiHeader.biHeight = height;/指定位图的高度pBInfo-bmiHeader.biPlanes = bitmap.bmPlanes;/为目标设备指定调色板的数量,且该值只能是 1pBInfo-bmiHeader.biSize = sizeof(BITMAPINFO);/设置BITMAPINFO 结构大小pBInfo-bmiHeader.biSizeImage = = bitmap.bmWidthBytes*bitmap.bmHeight;/设置图像的大小pBInfo-bmiHeader

18、.biWidth = width;/指定位图的宽度pBInfo-bmiHeader.biXPelsPerMeter = 0;/目标设备的水平分辨率pBInfo-bmiHeader.biYPelsPerMeter = 0;/目标设备的垂直分辨率m_X = m_RecX;m_Y = m_RecY;三、将位图信息发送到服务器 因为将图片信息传送到服务器端要求的实时性比较强,所以采用UDP 协议将位图信息发送到服务器3.3 客户端实现过程客户端实现过程1、 创建一个基于对话框的工程,名称为创建一个基于对话框的工程,名称为 Client。2、 在在 Stafx.h 文件中引入套接字库。文件中引入套接字库

19、。3、 在应用程序类的在应用程序类的 Instance 函数中初始化套接字函数中初始化套接字 WSADATA data;WSAStartup(2,&data);4、 改写应用程序类的虚方法改写应用程序类的虚方法 ExitInstance int CClientApp:ExitInstance() WSACleanup(); /清理套接字资源 return CWinApp:ExitInstance();5、 在对话框类中添加如下成员变量在对话框类中添加如下成员变量 SOCKET m_Socket;/客户端套接字CString m_ServerIP;/服务器 IPint m_X,m_Y;/抓起屏幕

20、的起始坐标WORD m_RecX,m_RecY;/收到服务器发来的抓起屏幕的起始坐标BOOL m_Confirm;/确认信息int m_FrameIndex;/记录索引int count;/每一个位图分报的数量int bmpsize;/位图的实际大小int mod;/记录余数char *pSendBuf;/发送缓冲区指针char *Head;/临时指针sockaddr_in addrl;/套接字地址BOOL m_Received;/是否受到服务器发来的确认信息int m_Counter;/计数器6、在对话框的初始化函数中,创建套接字将其绑定到指定位置,并初始化相应的成员变量在对话框的初始化函数

21、中,创建套接字将其绑定到指定位置,并初始化相应的成员变量BOOL CClientDlg:OnInitDialog()hostent *phost=gethostbyname();char *localIP=inet_ntoa(*(struct in_addr*)*phost-h_addr_list);sockaddr_in addr;addr.sin_family=AF_INET;addr.sin_addr.S_un.S_addr=inet_addr(localIP);addr.sin_port=htons(5001);m_Socket=socket(AF_INET,SOCK_DGRAM,0)

22、;if(m_Socket=INVALID_SOCKET)MessageBox(套接字创建失败!);if(bind(m_Socket,(sockaddr*)&addr,sizeof(addr)=SOCKET_ERROR)MessageBox(绑定套接字失败!);m_ServerIP=127.0.0.1;GetPrivateProfileString(ServerInfo,IP,127.0.0.1,m_ServerIP.GetBuffer(0),MAX_PATH,./server.ini);/读取 INI 配置文件 WSAAsyncSelect(m_Socket,m_hWnd,CM_RECEIVE

23、D,FD_READ);/该函数的功能是在套接字 m_Socket 上,看是否有读取事件发生如果有,向窗口句柄为 m_hWnd 的窗口发送CM_RECEIVED 消息m_X=m_Y=0;m_RecX=m_RecY=0;m_Confirm=true;pSendBuf=new char1024*1024*2;Head=pSendBuf;Onok();m_Received=false;m_Counter=0;SetTimer(1,1000,NULL);return TRUE; / return TRUE unless you set the focus to a control7、 自定义一个消息,当

24、套接字接到数据时,将该消息发送到主窗口自定义一个消息,当套接字接到数据时,将该消息发送到主窗口 #define GraphSize 1024#define CM_RECEIVED WM_USER+200 /自定的消息 CM_RECEIVED8、 添加添加 OnReceived()方法,该方法的作用是:接收服务器端发来的确认信息和控制信()方法,该方法的作用是:接收服务器端发来的确认信息和控制信息息void CClientDlg:OnReceived() char *pData=new char1024;memset(pData,0,1024);sockaddr_in addr;int fact

25、size=sizeof(sockaddr);int ret=recvfrom(m_Socket,pData,1024,0,(sockaddr*)&addr,&factsize);if(ret!=-1) /判断是否接收成功 if(ret=4) /方向指令 m_RecX=*(WORD*)&pData0; /填充屏幕 x 坐标 m_RecY=*(WORD*)&pData2; /填充屏幕 y 坐标 if(ret=8) /确认指令 m_Received=TRUE; m_FrameIndex+=1; /将发送的数据报的序号加 1 if(m_FrameIndex5)m_Counter=0;Onok();el

26、se /当接收到服务器发来的数据m_Received=FALSE;m_Counter=0;CDialog:OnTimer(nIDEvent);12、添加一个添加一个 Onok 方法,将屏幕信息转化为位图信息,划分数据报的格式,计算每方法,将屏幕信息转化为位图信息,划分数据报的格式,计算每个个 位图信息需要发送数据报的次数,调用位图信息需要发送数据报的次数,调用 SendData 方法。方法。13、在对话框类中的在对话框类中的 OnPaint 函数中添加函数中添加ShowWindow(SW_HIDE);将对话框隐将对话框隐藏。藏。第四章第四章 公共类设计公共类设计 在局域网监控系统的服务器端需要

27、对数据库进行操作。为了方便管理,将有关数据库的操作封装为一个类 CDataManage。该类中包含 ADOConnection 对象、ADOCommand 对象和 ADORecordset 对象,被提供 InitDatabase 方法用于构造 ADO 对象、连接数据库。CDataManage 类的具体实现过程如下:1、 在 visual C+工程中的 Stdafx.h 头文件中导入 msado15.dll 动态库。#import C:Program FilesCommon FilesSystemadomsado15.dll no_namespacerename(EOF,ADOEof)2、 创建

28、一个普通类,命名为 CDataManage,在该类中添加如下成员变量。 _ConnectionPtr m_pConnection;_CommandPtr m_pCommand;_RecordsetPtr m_pRecord;3、 向 CDataManage 类中添加 InitDatabase 方法构造 ADO 对象,并连接数据库。 BOOL CDataManage:InitDatebase()HRESULT hr;try hr = m_pConnection.CreateInstance(ADODB.Connection);/创建 Connection 对象m_pCommand.CreateI

29、nstance(ADODB.Command);m_pRecord.CreateInstance(ADODB.Recordset); if(SUCCEEDED(hr) hr = m_pConnection-Open(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db_Video.mdb,adModeUnknown);/连接数据库/上面一句中连接字串中的 Provider 是针对 ACCESS2007 环境的,对于 ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51; catch(_com_error e)/捕

30、捉异常CString errormessage;errormessage.Format(连接数据库失败!rn 错误信息:%s,e.ErrorMessage();AfxMessageBox(errormessage);/显示错误信息return FALSE; return true;第五章第五章 系统登录模块设计系统登录模块设计5.1 系统登录模块概述系统登录模块概述 为了防止非法用户使用系统,在局域网监控系统的服务器端提供了系统登录莫块。在系统启动时,只有输入正确的用户名和密码才能进入主界面。5.2 系统登录模块技术分析系统登录模块技术分析 为了验证用户输入的用户名和密码是否正确,需要根据用户

31、输入的用户名和密码从数据库中查询用户信息,如果有信息返回,表明用户名和密码正确;否则不正确。程序中使用了 ADOCommand 对象执行查询操作。在使用 ADOCommand 对象时,首先需要设置ActiveConnection 属性,该属性关联一个 ADOCommand 对象,然后设置 CommandText 属性,该属性表示 ADOCommand 对象要执行的 SQL 语句。如果 SQl 语句中有参数,还需要调用 Parameters 属性的 Append 方法插入参数,最后调用 ADOCommand 对象的 execute 方法执行 SQL 语句。代码如下:_ParameterPtr p

32、User,pPassword;CServerApp *pAPP=(CServerApp*)AfxGetApp();pUser=pAPP-m_DataManage.m_pCommand-CreateParameter(user,adVarWChar,adParamInput, 100,(_bstr_t)user);pPassword=pAPP-m_DataManage.m_pCommand-CreateParameter(password,adVarWChar,adParamInput, 100,(_bstr_t)password);pAPP-m_DataManage.m_pConnection

33、-CursorLocation=adUseServer;pAPP-m_DataManage.m_pCommand-ActiveConnection=pAPP-m_DataManage.m_pConnection;pAPP-m_DataManage.m_pCommand-Parameters-Append(pUser);pAPP-m_DataManage.m_pCommand-Parameters-Append(pPassword);/CString sql=select *from tb_userInfo where UserName=+user+ and PassWord=+password

34、+;pAPP-m_DataManage.m_pCommand-CommandText=select *from tb_userInfo where UserName=user and PassWord=password;/_RecordsetPtr pRecord=NULL;pRecord=pAPP-m_DataManage.m_pCommand-Execute(0,NULL,adCmdText);pAPP-m_DataManage.m_pCommand-Parameters-Delete(user);pAPP-m_DataManage.m_pCommand-Parameters-Delete

35、(password);5.3 系统登录模块实现过程系统登录模块实现过程1、 创建一个对话框,如下图: 2、 修改对话框类的 PreTranslateMessage 虚方法,当编辑框获得焦点时,按 Enter 键控制焦点移动。BOOL CLoginDlg:PreTranslateMessage(MSG* pMsg) if (pMsg-message=WM_KEYDOWN & pMsg-wParam=VK_RETURN )CString str;/获取类名GetClassName(pMsg-hwnd,str.GetBuffer(0),MAX_PATH);if (str=Edit)pMsg-wPar

36、am = VK_TAB ;return CDialog:PreTranslateMessage(pMsg);3、 处理“登录”按钮的单击事件,验证用户名和密码是否正确。如果用户名和密码正确,关闭对话框并返回 IDOK。void CLoginDlg:OnLogin() CString user,password;/获取用户名和密码m_UserName.GetWindowText(user);m_Password.GetWindowText(password);/判断用户名和密码是否正确if (user.IsEmpty() | password.IsEmpty()MessageBox(用户名和密码

37、不正确);m_UserName.SetFocus();else /用户名和密码正确_ParameterPtr puser,ppassword;CServerApp* pApp = (CServerApp*)AfxGetApp();/创建参数puser= pApp-m_DataManage.m_pCommand-CreateParameter(user,adVarWChar,adParamInput,100,(_bstr_t)user);ppassword= pApp-m_DataManage.m_pCommand-CreateParameter(password,adVarWChar,adPa

38、ramInput,100,(_bstr_t)password);/添加参数pApp-m_DataManage.m_pConnect-CursorLocation = adUseServer;pApp-m_DataManage.m_pCommand-ActiveConnection= pApp-m_DataManage.m_pConnect;pApp-m_DataManage.m_pCommand-Parameters-Append(puser);pApp-m_DataManage.m_pCommand-Parameters-Append(ppassword);pApp-m_DataManage

39、.m_pCommand-CommandText = select * from tb_userInfo where username = user and password = password;_RecordsetPtr pRecord= NULL;pRecord = pApp-m_DataManage.m_pCommand-Execute (0,NULL,adCmdText);pApp-m_DataManage.m_pCommand-Parameters-Delete(user);pApp-m_DataManage.m_pCommand-Parameters-Delete(password

40、);if (pRecord !=NULL )try /判断是否能够读取数据CString str =(char*) (_bstr_t)pRecord-GetFields()-GetItem(UserName)-Value;pRecord -Close();catch(.)MessageBox(用户名或密码不正确);m_UserName.SetFocus();pRecord -Close();return;EndDialog(IDOK);elsepRecord -Close();MessageBox(不正确);m_UserName.SetFocus();void CLoginDlg:OnCanc

41、el() / TODO: Add extra cleanup hereCDialog:OnCancel();第六章第六章 主窗体设计主窗体设计6.1 主窗体概述主窗体概述 局域网监控系统服务器端主窗体主要显示客户端发来的位图信息,并且控制客户端抓图的起始坐标。6.2 主窗体的实现过程主窗体的实现过程1、 向对话框类中添加如下成员变量。 SOCKET m_Socket; char *m_BmpData; char *m_TempData; char *Head; BOOL m_ShowBmp; int m_BmpSize; int m_RecSize; CString m_ClientIP; U

42、INT m_ClientPort; WORD m_LeftTopX; WORD m_LeftTopY;2、 自定义一个消息,用于自套接字有数据时发送到主窗口中。 #define CM_RECEIVED WM_USER+10013、 想对话框中添加 ShowImage 方法,显示位图数据。 void CServerDlg:ShowImage() if(m_ShowBmp)BITMAPINFO bInfo;memcpy(&bInfo,m_TempData,sizeof(bInfo);int x=bInfo.bmiHeader.biWidth;int y=bInfo.bmiHeader.biHeig

43、ht;StretchDIBits(m_BK.GetDC()-m_hDC,0,0,x,y,0,0,x,y,&m_TempDatasizeof(BITMAPINFO),&bInfo,DIB_RGB_COLORS,SRCCOPY);4、 向对话框中添加 OnReceived 方法,用于接收客户端发来的数据。在数据接收后,向客户端发送确认信息。void CServerDlg:OnReceived() char *buffer=new charMAX_BUFF; sockaddr_in addr; int factsize=sizeof(addr); int ret=recvfrom(m_Socket,

44、buffer,1050,0,(sockaddr*)&addr,&factsize); if(ret!=-1) CString recIP=inet_ntoa(addr.sin_addr); /MessageBox(recIP); if(recIP!=m_ClientIP) /MessageBox(m_ClientIP); delete buffer; return; m_ClientPort=ntohs(addr.sin_port); m_RecSize+=ret; WORD orderID=*(WORD*)&buffer0; WORD endID=*(WORD*)&buffer2; int

45、bmpsize=*(int *)&bufferret-12; m_LeftTopX=*(WORD*)&bufferret-8; m_LeftTopY=*(WORD*)&bufferret-6; sockaddr_in addr1; addr1.sin_addr.S_un.S_addr=inet_addr(m_ClientIP.GetBuffer(0); addr1.sin_port=htons(m_ClientPort); addr1.sin_family=AF_INET; int size=sizeof(addr1); char *pData=confirm; sendto(m_Socket

46、,pData,8,0,(sockaddr*)&addr1,size); if(orderID=0) m_BmpSize=bmpsize; m_BmpData=Head; else m_BmpSize+=bmpsize; memcpy(m_BmpData,&buffer4,bmpsize); m_BmpData+=bmpsize; m_ShowBmp=false; if(endID=1) m_ShowBmp=true; m_BmpData=Head; memcpy(m_TempData,Head,1024*1024); ShowImage(); delete buffer;5、 在对话框的消息映

47、射部分手动添加一个消息映射,用于将 CM_RECEIVED 与OnReceived 方法联系起来。如下:ON_MESSAGE(CM_RECEIVED,OnReceived)6、 向对话框中添加 OnButtonDown 方法,用于向客户端发送控制指令。void CServerDlg:OnButtonDown(UINT nID) if(!m_ClientIP.IsEmpty() WORD x=m_LeftTopX; WORD y=m_LeftTopY; char buffer4; sockaddr_in addr; addr.sin_family=AF_INET; addr.sin_port=h

48、tons(m_ClientPort); addr.sin_addr.S_un.S_addr=inet_addr(m_ClientIP.GetBuffer(0); int size=sizeof(addr); switch(nID) case IDC_BTDOWN: y=m_LeftTopY+100; *(WORD*)&buffer0=x; *(WORD*)&buffer2=y; int ret=sendto(m_Socket,buffer,4,0,(sockaddr*)&addr,size); break; case IDC_BTUP: y=m_LeftTopY-100; *(WORD*)&b

49、uffer0=x; *(WORD*)&buffer2=y; int ret=sendto(m_Socket,buffer,4,0,(sockaddr*)&addr,size); break; case IDC_BTLEFT: x=m_LeftTopX-100; *(WORD*)&buffer0=x; *(WORD*)&buffer2=y; int ret=sendto(m_Socket,buffer,4,0,(sockaddr*)&addr,size); break; case IDC_BTRIGHT: x=m_LeftTopX+100; *(WORD*)&buffer0=x; *(WORD*

50、)&buffer2=y; int ret=sendto(m_Socket,buffer,4,0,(sockaddr*)&addr,size); break; case IDC_BTRESTORE: *(WORD*)&buffer0=0; *(WORD*)&buffer2=0; int ret=sendto(m_Socket,buffer,4,0,(sockaddr*)&addr,size); break; 7、 在对话框的消息映射部分添加一个 ON_COMMAND_RANGE 消息映射宏,用以处理按钮单击事件。 ON_COMMAND_RANGE(IDC_BTRESTORE,IDC_BTRIGH

51、T,OnButtonDown)8、 在对话框的初始化函数中创建并绑定套接字,从数据库中读取客户端 IPBOOL CServerDlg:OnInitDialog()CDialog:OnInitDialog();sockaddr_in addr;addr.sin_family = AF_INET;/addr.sin_addr.S_un.S_addr = inet_addr(localIP);addr.sin_addr.S_un.S_addr = inet_addr(127.0.0.1);addr.sin_port = htons(5002);/创建套接字m_Socket = socket(AF_I

52、NET,SOCK_DGRAM,0);if (m_Socket = INVALID_SOCKET)MessageBox(套接字创建失败!);/绑定套接字if (bind(m_Socket,(sockaddr*)&addr,sizeof(addr)=SOCKET_ERROR)MessageBox(套接字绑定失败!);m_BmpData = new char1024*1024*2;memset(m_BmpData,0,1024*1024*2);m_TempData = new char1024*1024*2;memset(m_TempData,0,1024*1024*2);Head = m_BmpD

53、ata;WSAAsyncSelect(m_Socket,m_hWnd,CM_RECEIVED,FD_READ);m_ShowBmp = FALSE;m_BmpSize = 0;m_RecSize = 0;m_ClientPort = 0;CServerApp* pApp = (CServerApp*)AfxGetApp();CString sql = select * from tb_ClientInfo;pApp-m_DataManage.m_pRecord-CursorLocation = adUseServer;pApp-m_DataManage.m_pRecord-Open(_bstr

54、_t)sql,pApp-m_DataManage.m_pConnection.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);m_ClientIP= ;if (pApp-m_DataManage.m_pRecord-RecordCount0)m_ClientIP = (char*)(_bstr_t)pApp-m_DataManage.m_pRecord-GetFields()-GetItem(0L)-Value;/MessageBox(m_ClientIP);pApp-m_DataManage.m_pRecord-Close

55、();m_LeftTopX= 0;m_LeftTopY= 0;m_BK.SetWindowPos(NULL,0,0,305,305,SWP_NOMOVE);return TRUE;9、 处理对话框的 OnCancel 方法,在对话框关闭时释放分配的内存,防止内存泄漏。第七章第七章 操作员管理模块设计操作员管理模块设计7.1 操作员模块概述操作员模块概述 操作员模块主要用于实现操作员信息的添加、修改、删除。操作员模块运行结果如下图。7.2 操作员模块技术分析操作员模块技术分析 操作员管理模块主要实现操作员信息的添加、修改、删除。为了方便用户进行添加、修改、删除操作,在操作员管理窗口显示时会将操作

56、员信息以表格形式显示出来。这里的表格使用的是 MFC 提供的 CListCtrl 类。7.3 操作员模块实现过程操作员模块实现过程1、 创建一个对话框,中间的空间如上图显示的样式。2、 改写对话框的 PreTranslateMessage 虚方法,当焦点在编辑框中时按 Enter 键将控制焦点移动。BOOL CCopManage:PreTranslateMessage(MSG* pMsg) / TODO: Add your specialized code here and/or call the base classif (pMsg-message=WM_KEYDOWN & pMsg-wPa

57、ram=VK_RETURN )CString str;/获取类名GetClassName(pMsg-hwnd,str.GetBuffer(0),MAX_PATH);if (str=Edit)pMsg-wParam = VK_TAB ;return CDialog:PreTranslateMessage(pMsg);3、 向对话框中添加 CLearText 方法,用于删除编辑框中的文本。为了增加程序的灵活性,cleartext 方法逐一利用循环遍历对话框中的控件,如果是编辑框控件,则清空文本,这样,无论对话框中有多少个编辑控件,调用 cleartext 方法会将所有的文本清空。void CCop

58、Manage:ClearText() HWND pWnd=NULL;pWnd=:GetWindow(m_hWnd,GW_CHILD);char clsnameMAX_PATH;memset(clsname,0,MAX_PATH);if(pWnd!=NULL)if(:GetClassName(pWnd,clsname,MAX_PATH)!=0)/需要了解 GetClassName 函数 if(strcmp(clsname,Edit)=0) :SetWindowText(pWnd,); HWND hWnd=:GetWindow(pWnd,GW_HWNDNEXT); do if(:GetClassN

59、ame(hWnd,clsname,MAX_PATH)!=0) :SetWindowText(hWnd,); hWnd=:GetWindow(hWnd,GW_HWNDNEXT); while(hWnd!=NULL); 4、 向对话框中添加 LoadOperatorInfo 方法,从用户数据表中查询数据,将其显示在列表中。void CCopManage:LoadOperatorInfo()CServerApp *pAPP=(CServerApp *)AfxGetApp();CString sql=select * from tb_userinfo;pAPP-m_DataManage.m_pReco

60、rd-Open(_bstr_t)sql,pAPP-m_DataManage.m_pConnection.GetInterfacePtr() ,adOpenKeyset,adLockOptimistic,adCmdText);m_list.DeleteAllItems();int row=0;CString user,password;while(!pAPP-m_DataManage.m_pRecord-ADOEof)m_list.InsertItem(row,0);user=(char *)(_bstr_t)pAPP-m_DataManage.m_pRecord-GetFields()-Get

61、Item(0L)-Value;/需要看看_bstr_tpassword=(char *)(_bstr_t)pAPP-m_DataManage.m_pRecord-GetFields()-GetItem(1L)-Value;m_list.SetItemText(row,0,user);m_list.SetItemText(row,1,password);row+;pAPP-m_DataManage.m_pRecord-MoveNext();pAPP-m_DataManage.m_pRecord-Close();5、 处理列表中的双击事件,将当前行信息显示在编辑框中。void CCopManage

62、:OnDblclkListInfo(NMHDR* pNMHDR, LRESULT* pResult) / TODO: Add your control notification handler code hereint selrow=m_list.GetSelectionMark();if(selrow!=-1)m_Username.SetWindowText(m_list.GetItemText(selrow,0);m_Password.SetWindowText(m_list.GetItemText(selrow,1);m_CofPassword.SetWindowText(m_list.

63、GetItemText(selrow,1);*pResult = 0;6、 在对话框中初始化时设置列表控件风格,并向列表控件中添加列,调用LoadOperatorInfo 方法向列表控件中添加操作员信息。BOOL CCopManage:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization herem_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_TWOCLICKACTIVATE);/m_list.InsertItem(0

64、,);m_list.InsertColumn(0,用户名称,LVCFMT_LEFT,250);m_list.InsertColumn(1,用户密码,LVCFMT_LEFT,250);/需要看一下 insercolumn 函数m_ImageList.Create(16,16,TRUE,2,2);m_ImageList.Add(AfxGetApp()-LoadIcon(IDI_ICON1);m_list.SetImageList(&m_ImageList,LVSIL_SMALL); LoadOperatorInfo();return TRUE; / return TRUE unless you s

65、et the focus to a control / EXCEPTION: OCX Property Pages should return FALSE7、处理“添加”按钮的单击事件,将编辑框中的文本保存到数据表中。代码首先判断用户信息是否完整,然后验证用户密码,最后判断用户名是否重复,如果不重复,保存用户信息void CCopManage:OnBtAdd() CString user,pass,confirm;定义三个字符变量m_User.GetWindowText(user);得到编辑框姓名文本m_Pass.GetWindowText(pass); 得到编辑框密码文本m_ConfirmI

66、nfo.GetWindowText(confirm); 得到编辑框确认密码文本/判断操作员信息是否为空if (user.IsEmpty() | pass.IsEmpty() | confirm.IsEmpty()MessageBox(操作员信息不能为空,提示);m_User.SetFocus();return;/验证密码if (pass!= confirm)MessageBox(两次密码不一致);return;/验证用户是否存在CServerApp* pApp = (CServerApp*)AfxGetApp();获取应用程序对象CString sql;sql.Format(select * from tb_userInfo where username = %s, user);执行的 SQL 语句pApp-m_DataManage.m_pRecord-CursorLocation = adUseServer;定义游标类型pApp-m_DataManage.m_pRecord-Open(_bstr_t)sql,pApp-m_DataManage.m_pConnect.GetInterf

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!