放大镜的设计与实现学位论文Word下载.docx
- 文档编号:18831362
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:47
- 大小:1.13MB
放大镜的设计与实现学位论文Word下载.docx
《放大镜的设计与实现学位论文Word下载.docx》由会员分享,可在线阅读,更多相关《放大镜的设计与实现学位论文Word下载.docx(47页珍藏版)》请在冰豆网上搜索。
magnifying;
C++;
API
1绪论
1.1课题选择的目的和意义
随着社会科技的进步以及计算机的普及,老年人与残疾人使用计算机已经成为一种潮流并且日益普遍。
由于生理原因,大部分的老年人都有一些视力障碍,而部分残疾人也在视力方面有不足的地方。
虽然现在Windows系统拥有语音系统来帮助用户与计算机进行交互,但是汉语文化博大精深,这使得Windows的字库并不完善。
这便导致语音识别软件的识别模糊度很大,如果碰到一些生僻字,回馈的信息便也不是特别准确,加大了语音系统的局限性。
同时,随着计算机存储空间的增大,个人PC上安装的软件也越来越多,虽然桌面图标可以进行缩小,也可以创建文件夹来集体管理快捷方式,但是固定大小的桌面毕竟无法满足日益增多的快捷方式的存在,这给用户带来了很大的不便。
在这样的背景之下,编写一个精简的放大镜软件,使得用户可以针对性的放大所想要看到的区域与内容,便是一种极好的解决方案。
如果用户拥有一个放大镜软件,那便可以将桌面的分辨率提高,在需要的时候开启放大镜,将无法轻易辨识的内容区域放大显示即可。
在熟练掌握自身编程技术的基础之上,帮助人们去解决一些现实生活中遇到的问题,是一个毕业设计所能达到的最出色的状态。
所以,我希望借助此次毕业设计的机会,利用自身的知识与能力,完成一个放大镜软件的设计与实现,界面简洁,功能完善。
1.2国内外研究现状及发展趋势
严格来讲,放大镜软件在当前的软件发展路程上并不是一个起眼的角色,很多时候这个软件并不被人们所需要,即其需求量几乎为零。
所以放大镜软件也无从谈起研究现状与发展趋势。
但是很多时候因为工作的需要,人们也需要用到放大镜,譬如在一些精微制图过程中,因为图纸过大,固定的屏幕使得尺寸显示数字过小,这便使得用户陷入一种尴尬的境地。
Windows系统拥有自带的放大镜软件,但是其有几个比较突出的缺点。
一、放大效果并不是特别平滑,并且放大之后的图像会产生失真。
二、用户必须通过手动点击的方式来改变软件的放大倍率。
三、放大窗口设计不合理且不可根据用户当前鼠标所在方位自动移动,这使得用户必须手动移动放大窗口,才能更好的查看被窗口所阻挡的区域。
Windows的放大镜软件拥有三种放大方式:
全屏,镜头,与停靠。
全屏状态下用户的整个界面均被放大,此时用户可以通过随意的移动鼠标来寻找内容或改变放大倍率,但是该状态下最大的缺点就是鼠标卷动速度过快以及用户必须手动改变放大倍率。
通过使用发现,当放大倍率过高时,用户很难快速准确的寻找到自己想要查看的区域。
镜头状态下,用户可以查看鼠标当前所在区域的内容,但是该状态最大的缺点就是放大窗口在内容之上,这使得放大窗口直接遮挡了用户想要查看的区域,一方面来讲,虽然实现了放大窗口跟随鼠标的效果,使得用户可以通过窗口进行目标区域内容的查看,但是另一方面,这使得用户不能快速的了解当前鼠标所在区域的具体情况,仅仅只是得到鼠标所在的部分区域的内容。
停靠状态是该软件最好的使用状态,但是该状态依然存在缺点便是放大窗口不可根据鼠标所在位置自动移动,这会导致鼠标移动到窗口内部时,窗口遮挡被放大区域的内容,此时产生的效果便为镜头状态下的效果,依然存在不足的地方。
Linux系统下也有放大镜软件,但是大部分都存在放大模糊的效果,即图像失真,甚至部分软件为了达到美化的地步,将放大窗口圆框化,圆框化对比方框化,最大的区别便是圆框化下被放大区域的算法更加繁复,这就会导致放大窗口边缘经常会出现文字扭曲的情况,完全不能达到一个正常的放大镜软件的使用标准。
由上文我们可以看出,从私人用户的角度来讲,放大镜是一个可有可无的软件,即使需要时,用自带的软件也可以勉强使用,这便导致当前网络上的放大镜软件编写水平粗糙,放大效果不理想。
随着我国工业化的进步以及现代化科学技术的快速发展,放大镜在工业领域的使用则是愈加频繁。
从机械制造角度来讲,船舶工艺与飞行工艺铸造的精度可达0.01mm,而人眼的识别能力在这一精度下就略显吃力,若是将放大镜软件与工业硬件相结合,将其制作为工业用放大镜软件,便可达到更高的识别精度。
这一思想当前在全世界已有实例,当前市场上800倍的光钎放大镜便是极好的证明。
工业用放大镜的发展迅速有两方面的原因,一方面是随着工业技术的提高零件精度的提高需要更高精度的识别器,另一方面,硬件的发展节奏快于软件的发展节奏,这就使得工业用放大镜的硬件水平提高带动了整个产品的发展速度,而随着科学技术的发展,软件制作水平与放大精度也在进步,两者结合,便可达到更高的水平。
所以从另一方面来讲,放大镜软件是具有发展前景的。
1.3研究范围
该软件划分为四个模块:
放大窗口设计模块、图像采集模块设计、消息循环模块以及放大窗口优化模块。
图像采集模块:
该模块为放大镜软件的主要模块之一,其主要功能是通过一系列函数与方法获取被放大区域,然后将得到的数据作为数据源发送至放大窗口设计模块,从而实现放大的功能。
实现思想:
利用WindowsAPI获取当前鼠标所在区域,通过鼠标位置以及计算算式,获取被放大区域,然后将获取的矩形内的图像数据,作为放大窗口的数据源输入。
同时引入MFC库,将采集到的数据通过StretchBlt()函数,复制至目标窗口,实现放大的功能。
消息循环模块:
该模块的主要功能是决定程序的执行代码,根据用户的操作来获取相对应的虚拟信息并进行转换,然后将消息发送至放大窗口,从而改变放大窗口的各项值。
在程序内部以函数的形式定义一个定时器并实现,在主程序内不断读取消息并对放大窗口进行操作,定时器定期监控虚拟信息,将其进行转换后获得信息输入然后将其发送至指定窗口,通过switch...case语句分析信息输入,然后选择性的进行目标代码的运行。
放大窗口设计模块:
该模块为放大镜的主要模块之一,其主要功能是创建一个窗口作为放大窗口,然后将图像采集模块获得的数据作为数据输入并显示,同时通过消息循环模块所发送的消息来决定放大窗口的各项属性。
事先通过定义或者计算得到各个变量的值,之后将获取到的变量置于CreateWindow()函数之中,创建窗口,所创建的矩形为查看窗口,即放大窗口。
同时可通过键盘以及鼠标,对目标矩形进行窗口大小和倍率的修改。
放大窗口优化模块:
该模块是放大窗口设计模块的附属模块,其目的是在放大窗口正常运行的情况下,对放大窗口进行一些优化操作,提高用户的使用体验感。
通过各种MFC预设函数,在目标窗口内进行画线等操作,使得通过人为的程序设计,实现前端窗口可以达到提高用户体验的效果。
目前已在放大窗口内加入了两条交叉红线使得使用者可通过红线的交叉点确定鼠标位置,利用此举使得用户可以判断当前鼠标位置,更好的得到自己想要的信息。
1.4技术要求
(1)该程序设计为Windows桌面应用程序,可运行在WindowsXP及以上版本的Windows操作系统上。
(2)合理划分各功能模块。
(3)调用WindowsAPI实现与操作系统的数据交互。
2软件描述
2.1任务概述
下面我将该课程设计的有关问题简要描述一下
2.1.1系统目标
该放大镜软件可放大屏幕上当前鼠标所在位置周围一定区域的数据,方便用户进行查看不易辨别的区域。
去除原规划的设置界面,加入键盘消息监控代码,使得该区域的大小可由用户通过键盘操作自行设定。
对区域的边界进行阀值设定,防止用户过大或过小的设定窗口大小。
同时对被放大区域的边界进行判定,当被放大区域超出Windows边界时根据鼠标所在位置的情况重新设定窗口大小。
同时可在用户鼠标移向放大区域时改变放大区域的位置,使得用户可以达到查看全屏区域的效果。
对被放大区域与放大窗口的位置进行判定防止两者重叠产生重复放大的情况。
同时用户可使用鼠标的滚轮设定软件的放大倍率。
去除原规划的设置界面,直接修改为利用鼠标控制倍率的调整,提高用户的使用体验感。
通过测试对倍率的阀值进行设定,防止用户过大或过小的调整倍率。
在放大窗口内加入红色线条,交点代表当前鼠标所在位置,使得用户可以快速的寻找到目标位置与目标数据,提高用户的使用体验感。
2.1.2系统的开发环境
硬件:
硬盘空间:
5G
内存:
1G
CPU:
奔腾三代
操作系统:
WindowsXP或以上
其他软件:
MicrosoftVisualStudio2008或以上
2.1.3开发思想与原理
放大镜软件实现的基础功能是放大鼠标所在区域并可通过键盘与鼠标对放大镜的各项属性进行更改。
放大镜软件实现思想是首先对鼠标所在区域通过计算,然后进行被放大区域的抓取,将图形获取并放在缓存之中,通过StretchBlt()将数据复制至目标区域,变相实现将图像放大的效果。
如果想实现缩小的效果,只需修改想要抓取区域的大小以及计算方式即可。
在这个过程中我们可以定义一个定时器不断的监控虚拟信息输入,然后通过转换后判断当前用户的动作或输入,从而通过函数判定来选择目标代码的执行。
放大窗口的移动,软件的退出,放大区域的刷新,鼠标的移动,鼠标滚轮动作,键盘输入决定窗口大小等,均由定时器进行判定输出信号。
放大镜软件的所有动作,都是由定时器模块与回调函数机制共同来决定。
下面是该软件中两个小算法的思路:
计算抓取区域与实现窗口移动。
如何计算所要被抓取的区域:
首先通过GetCursorPos()函数可获得鼠标位置,然后利用放大窗口所设定的变量值,即放大窗口大小,除以2再除以放大因数,便可获得所想要被抓取的区域。
当被放大区域的上下左右边界到达屏幕临界点,即被放大区域即将超出屏幕边界时,根据鼠标所在位置对被放大窗口的大小进行针对性设计,经过计算后重新修改上下左右边界的值,便可防止被放大区域超出屏幕边界。
具体设计在之后会呈现。
如何实现放大窗口的移动:
在程序中设定一个定时器,不断的监控虚拟指令并进行转译,首先通过ScreenToClient()函数将鼠标所在的位置转化为坐标点,赋值给m_ptCur变量,然后通过PtInRect()函数检测鼠标是否在放大窗口内,当鼠标在放大窗口中时,改变窗口标识变量,通过SetWindowPos()函数将窗口位置改变即可。
2.2功能描述
2.2.1软件设计
放大镜软件可对鼠标位置周围的部分屏幕区域进行放大,并能根据鼠标所在位置改变放大窗口位置,从而实现全屏幕无死角的放大查看。
用户可通过键盘改变放大窗口的大小同时改变被放大区域的大小,也可通过鼠标滚轮改变软件的放大倍率。
2.2.2模块功能划分
根据需求分析以及程序设计可知,要想完成放大镜的功能,首先要通过图像采集模块计算被放大区域,获得被放大区域的数据,同时通过窗口设计模块设定放大窗口各属性,创建放大窗口,通过消息循环模块监测虚拟消息,首先默认将数据复制至放大窗口,之后不断监测虚拟消息,转译、发送消息到放大窗口,根据消息类型,选择性执行代码行,实现各种功能。
最后在软件成功运行的基础之上优化界面显示,提高用户的使用体验感。
2.3性能
(1)时间特性
更新消息处理时间:
50ms
运行时间:
人工决定
(2)适应性:
可在WindowsXP或以上版本的Windows操作系统下运行
(3)其他要求:
可使用性:
一般用户均可使用
可靠性:
较为可靠
可维护性:
易于维护
3方案设计
3.1具体方案设计
下面是关于此方案的具体设计:
3.1.1模块划分
根据该软件所需要实现的放大功能,整个软件可划分为四个模块:
它们需要完成的任务是事先设定放大窗口的大小及位置,创建窗口,抓取鼠标所在区域,采集数据,将数据进行复制,传送到放大窗口,实现放大效果,然后不断监控虚拟消息,通过用户操作改变放大窗口的各项属性。
在软件成功运行的基础之上,对软件进行细小优化,提高用户的使用体验。
3.1.2各个模块的功能说明
3.1.2.1放大窗口设计模块
放大窗口模块用于将得到的图形数据进行投影,让用户清楚当前鼠标所在区域的图像,从而使得用户可以选择性的进行放大区域的选择,达到放大镜的目的。
同时还在窗口位置设定模块中,加入了之后的消息判断,从而可以实现利用鼠标位置判定来移动当前显示窗口的功能。
整个窗口放大模块,分为两个小模块:
创建窗口与窗口移动。
创建窗口模块最主要使用的函数为CreateWindow()函数,该函数共有11个变量,这些变量共同决定了窗口的类型,所在位置,类名,标题,风格等属性,所以只需要在程序内部定义各个变量及其属性值,便可利用该函数进行窗口的创建。
在窗口进行创建后,要进行激活,重新显示,这样可以保证窗口创建的成功性。
窗口移动模块则是放大窗口模块与之后的消息循环模块相互关联,两者共同协作达到移动窗口的目的。
通过消息循环模块不断发出的消息来判断执行语句,当鼠标在目标窗口内时,使用自定义函数SetWndPos(),内部使用SetWindowPos()函数,该函数共有7个变量,共同改变指定窗口当前状态。
这7个变量,有定义的固定变量,也有经过计算后得到的变量,其作用是改变当前窗口状态,这样使用自定义函数去决定当前窗口的新状态,便可达到使窗口移动的效果。
该模块的具体设计以及各函数解释会在之后代码设计中进行描述。
3.1.2.2图像采集模块设计
图形采集模块是放大镜软件最重要的模块之一,该模块利用WindowsAPI获取当前屏幕的图像数据。
同时将所获取到的数据复制至放大窗口设计模块中所设置的窗口。
而该模块使用的函数StretchBlt(),也是放大镜软件最重要的一个函数,当前Windows系统之上大部分的放大镜软件,均是在该函数的基础上进行优化来编写放大镜软件。
StretchBlt()函数共有10个变量,其中第一个变量为目标环境句柄,在放大镜软件中,该变量代表放大窗口的句柄,这个是在全局变量中进行定义,之后的四个变量共同决定放大窗口所在的位置,它们由放大窗口的左边界,放大窗口的上边界,放大窗口的宽,放大窗口的高度共同决定。
第五个变量为被放大窗口的句柄,6-9代表被放大窗口的大小,这些跟放大窗口的设定都有异曲同工之处。
第十个变量则为数据的映射方式。
在该程序设计中,我选择直接使用SRCCOPY,它所代表的含义是将源矩形区域直接拷贝到目标矩形区域。
因为该函数是不断的将数据放入内存然后再拷贝至放大窗口,在消息循环模块我们可知道信息是不断的监测,这代表窗口如果不进行资源释放,那么内存会不断的被占用,所以在图像采集模块的最后,我们需要加入ReleaseDC()函数,将得到的信息全部释放,即释放窗口资源,这样才能保证软件长久运行的稳定性。
3.1.2.3消息循环模块
消息循环模块是放大镜软件的另一个重要部分。
如果说图像采集模块是放大镜软件的执行者,那么消息循环模块就是放大镜软件的决策者。
在消息循环模块中,我定义并实现了一个定时器函数,这个函数每50ms会读取一次虚拟消息,然后对虚拟消息进行转化,选择性的去执行各个代码行,从另一个角度来讲,该定时器每50ms便会执行一次相应的代码,譬如鼠标移动,就会去执行CaseWM_MOUSEMOVE之后的代码行,创建窗口,就会去执行CaseWM_CREATE之后的代码行等。
如同之前在放大窗口设计模块中所述,放大窗口模块就是用于将得到的图形数据进行投影,然后达到放大的效果。
其实整个放大的过程,就是消息循环模块,放大窗口设计模块,与图像采集模块工作协作的结果。
WM_TIMER是定时器的默认消息,当定时器监测到无其他消息时,便会默认执行WM_TIMER所代表的代码行,将图像采集模块与窗口优化模块均写在这个函数中,那么程序便可以实现放大功能,并且因为消息间隔时间很短,结合生物学的视觉暂留,我们便可从用户角度感觉放大镜的放大并不粘滞,放大流畅,有很好的用户体验感。
SetTimer()函数包含四个变量,他们分别代表接受消息的窗口,定时器ID,定时器间隔,以及定时器消息的处理函数。
一般来讲,我们只需要对前三者进行设置即可,因为指定窗口一般都会有消息处理函数,所以第四个变量一般为NULL。
而其余的变量,则需要根据实际情况进行设定,譬如该放大镜软件的更新消息处理时间为50ms,我需要让其50ms更新一次画面,那么我需要将第三个变量设为50即可。
3.1.2.4放大窗口优化模块
放大窗口模块是在整个放大镜软件的主要功能—“放大”完成之后,在图像处理模块加入的小模块,它的作用是用简单的手段,创建一些额外的画面或者提示,提高用户的体验感。
目前已经实现的功能有:
在放大窗口添加额外的显示,使得用户可以得到当前鼠标所在位置。
这一功能使得用户可以根据两条线的交点,更加迅速的得到自己鼠标的所在位置,从而可以更快的确定放大目标,以及更快的得到所需消息。
MFC有自己的HPEN结构体,利用该结构体以及CreatePen()函数,我们可以创建一个画笔,CreatePen()函数有三个变量,画笔风格,宽度,以及画笔颜色。
一般画笔风格如无特殊要求,均使用默认风格PS_SOLID,颜色,则可以使用预定义的颜色,或者使用三原色来确定颜色,例如RGB(255,0,0)便代表红色。
确定画笔之后,利用SelectObject()函数将所创建的画笔选至放大窗口,然后在其内部使用MoveToEx()以及LineTo()两个函数来画线。
前者的功能是将点移动至目标点,后者的功能则是从A点画线至B点。
它们都有自己的变量以及函数使用方法,其具体使用方式将在代码设计中体现并解释。
3.2方案论证分析
3.2.1方案的技术可行性
C++是在C语言的基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言。
它在C语言的基础之上加入了类的概念,派生类,类的多重继承,抽象类,const成员函数,共有和私有成员,构造函数,析构函数,友元,内联函数,赋值运算符的重载,虚函数,函数和运算符的重载,引用等。
C语言是C++的基础,C++和C语言在很多方面是兼容的。
C语言是一个结构化语言,它的重点在于算法与数据结构。
C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事物)控制)。
C++则首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事物)控制。
所以C语言和C++的最大区别在于它们解决问题的思想方法不一样。
C++语言最有意义的方面是支持面向对象的特征。
虽然与C的兼容使得C++具有双重特点,但他在概念上完全与C不同,更具面向对象的特征。
而出于保证语言的简洁和运行高效等方面的考虑,C++的很多特性都是以库(如MFC)或其他的形式提供的,而没有直接添加到语言本身里。
C++引入了面向对象的概念,使得开发人机交互类型的应用程序更为简单、快捷。
很多优秀的程序框架包括Boost、Qt、MFC、OWL、wxWidgets、WTL就是使用的C++。
MFC(MicrosoftFoundationClasses)是微软基础类库的简称,是微软公司实现的一个C++类库,主要封装了大部分的WindowsAPI函数,VC++是微软公司开发的C/C++的集成开发环境,所谓集成开发环境,就是说利用它你可以编辑,编译,调试,而不是使用多种工具轮换操作,灵活性较大。
MFC除了是一个类库以外,还是一个框架,并且MFC提供了大量的窗口类,其功能和用途各异。
所以使用C++语言,引入MFC类库,能够书写更简洁的代码,拥有更快速的开发速度,省却了在C++语言中再写入窗口以及框架的时间。
并且利用C++语言进行开发,不需要牺牲任何C语言的特点,从另一方面来讲,C++在C语言的基础上重新开发,熟悉C开发的人员也能更快地进入C++领域,只需要一个MFC帮助文档并且了解MFC的运行机制,便能更快的进行基于C++和MFC框架的程序开发。
同时该软件由VS2010进行编译,运行在Windows操作系统上,在程序编写过程中,使用Windows所规定的消息循环机制与消息响应机制,同时使用Windows系统的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 放大镜 设计 实现 学位 论文
![提示](https://static.bdocx.com/images/bang_tan.gif)