版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、放大镜的设计与实现方案放大镜的设计与实现方案摘 要本方案描述了由C+开发的放大镜软件的设计与实现,介绍了软件研究的技术要求,并对开发该软件的目的、开发环境与平台、设计理念与软件功能进行了描述。该方案设计具体详细的阐述了方案的可行性、课题选择的意义、方案的设计方式、实现逻辑、软件运作流程、界面的设计、程序的设计等。其中,界面设计包括被放大镜的窗口设计以及被放大区域的计算方式,程序设计包括总体流程设计、放大镜窗体设计、消息循环设计、以及窗口美化设计。此外还对代码的实现进行了介绍,主要包括放大窗口设计模块、图像采集模块设计、消息循环模块以及放大窗口美化模块。最后对放大镜软件进行了功能测试,并对测试结
2、果进行总结。读者通过阅读本文,将对该软件有一个系统的了解。关键词 程序设计;放大镜;C+ ;APIDesign and implementation of a magnifying glassAbstractThis scenario describes the design and implementation of C + software development magnifying glass, introduces the technical requirements for software research and development purpose of the softw
3、are development environment and platform design and software features are described.The program specifically designed in detail the feasibility of the program ,meaning the subject choice, the way the program design, implementation logic, software, operational processes, interface design ,program des
4、ign .Among them, the interface design, including calculation is a magnifying glass window design and the area is enlarged, the overall program design, including process design, magnifying glass form design, the message loop design, landscaping and window design. In addition,the realization of the co
5、de were introduced, including the zoom window design module, image acquisition module design,module and zoom windows message loop beautification module.Finally magnifier software for functional testing, and test results are summarized. By reading this article the reader will understand the software
6、has a system.Keywords programming;magnifying; C + +; APIii目 录摘 要iAbstractii1 绪论11.1 课题选择的目的和意义11.2 国内外研究现状及发展趋势11.3 研究范围21.4 技术要求32 软件描述42.1 任务概述42.1.1 系统目标42.1.2 系统的开发环境42.1.3 开发思想与原理42.2 功能描述52.2.1 软件设计52.2.2 模块功能划分52.3 性能53 方案设计63.1 具体方案设计63.1.1模块划分63.1.2各个模块的功能说明63.2 方案论证分析73.2.1 方案的技术可行性73.2.2
7、方案的经济可行性83.2.3 方案的优点93.3 程序设计93.3.1 总体流程94 代码实现104.1 主程序入口104.2 放大窗口模块124.3 图像采集模块134.4 消息循环模块164.5 放大窗口优化模块194.6 自定义函数195 测试205.1 测试205.1.1 功能测试205.1.2 性能测试206 结论21参考文献22附录1 程序运行结果及算法247.1 运行结果247.2 算法26附录2 名词解释28外文原文30中文翻译411 绪论1.1 课题选择的目的和意义随着社会科技的进步以及计算机的普及,老年人与残疾人使用计算机已经成为一种潮流并且日益普遍。由于生理原因,大部分的
8、老年人都有一些视力障碍,而部分残疾人也在视力方面有不足的地方。虽然现在Windows系统拥有语音系统来帮助用户与计算机进行交互,但是汉语文化博大精深,这使得Windows的字库并不完善。这便导致语音识别软件的识别模糊度很大,如果碰到一些生僻字,回馈的信息便也不是特别准确,加大了语音系统的局限性。同时,随着计算机存储空间的增大,个人PC上安装的软件也越来越多,虽然桌面图标可以进行缩小,也可以创建文件夹来集体管理快捷方式,但是固定大小的桌面毕竟无法满足日益增多的快捷方式的存在,这给用户带来了很大的不便。在这样的背景之下,编写一个精简的放大镜软件,使得用户可以针对性的放大所想要看到的区域与内容,便是
9、一种极好的解决方案。如果用户拥有一个放大镜软件,那便可以将桌面的分辨率提高,在需要的时候开启放大镜,将无法轻易辨识的内容区域放大显示即可。在熟练掌握自身编程技术的基础之上,帮助人们去解决一些现实生活中遇到的问题,是一个毕业设计所能达到的最出色的状态。所以,我希望借助此次毕业设计的机会,利用自身的知识与能力,完成一个放大镜软件的设计与实现,界面简洁,功能完善。1.2 国内外研究现状及发展趋势严格来讲,放大镜软件在当前的软件发展路程上并不是一个起眼的角色,很多时候这个软件并不被人们所需要,即其需求量几乎为零。所以放大镜软件也无从谈起研究现状与发展趋势。但是很多时候因为工作的需要,人们也需要用到放大
10、镜,譬如在一些精微制图过程中,因为图纸过大,固定的屏幕使得尺寸显示数字过小,这便使得用户陷入一种尴尬的境地。Windows系统拥有自带的放大镜软件,但是其有几个比较突出的缺点。一、放大效果并不是特别平滑,并且放大之后的图像会产生失真。二、用户必须通过手动点击的方式来改变软件的放大倍率。三、放大窗口设计不合理且不可根据用户当前鼠标所在方位自动移动,这使得用户必须手动移动放大窗口,才能更好的查看被窗口所阻挡的区域。Windows的放大镜软件拥有三种放大方式:全屏,镜头,与停靠。全屏状态下用户的整个界面均被放大,此时用户可以通过随意的移动鼠标来寻找内容或改变放大倍率,但是该状态下最大的缺点就是鼠标卷
11、动速度过快以及用户必须手动改变放大倍率。通过使用发现,当放大倍率过高时,用户很难快速准确的寻找到自己想要查看的区域。镜头状态下,用户可以查看鼠标当前所在区域的内容,但是该状态最大的缺点就是放大窗口在内容之上,这使得放大窗口直接遮挡了用户想要查看的区域,一方面来讲,虽然实现了放大窗口跟随鼠标的效果,使得用户可以通过窗口进行目标区域内容的查看,但是另一方面,这使得用户不能快速的了解当前鼠标所在区域的具体情况,仅仅只是得到鼠标所在的部分区域的内容。停靠状态是该软件最好的使用状态,但是该状态依然存在缺点便是放大窗口不可根据鼠标所在位置自动移动,这会导致鼠标移动到窗口内部时,窗口遮挡被放大区域的内容,此
12、时产生的效果便为镜头状态下的效果,依然存在不足的地方。Linux系统下也有放大镜软件,但是大部分都存在放大模糊的效果,即图像失真,甚至部分软件为了达到美化的地步,将放大窗口圆框化,圆框化对比方框化,最大的区别便是圆框化下被放大区域的算法更加繁复,这就会导致放大窗口边缘经常会出现文字扭曲的情况,完全不能达到一个正常的放大镜软件的使用标准。由上文我们可以看出,从私人用户的角度来讲,放大镜是一个可有可无的软件,即使需要时,用自带的软件也可以勉强使用,这便导致当前网络上的放大镜软件编写水平粗糙,放大效果不理想。随着我国工业化的进步以及现代化科学技术的快速发展,放大镜在工业领域的使用则是愈加频繁。从机械
13、制造角度来讲,船舶工艺与飞行工艺铸造的精度可达0.01mm,而人眼的识别能力在这一精度下就略显吃力,若是将放大镜软件与工业硬件相结合,将其制作为工业用放大镜软件,便可达到更高的识别精度。这一思想当前在全世界已有实例,当前市场上800倍的光钎放大镜便是极好的证明。工业用放大镜的发展迅速有两方面的原因,一方面是随着工业技术的提高零件精度的提高需要更高精度的识别器,另一方面,硬件的发展节奏快于软件的发展节奏,这就使得工业用放大镜的硬件水平提高带动了整个产品的发展速度,而随着科学技术的发展,软件制作水平与放大精度也在进步,两者结合,便可达到更高的水平。所以从另一方面来讲,放大镜软件是具有发展前景的。1
14、.3 研究范围该软件划分为四个模块:放大窗口设计模块、图像采集模块设计、消息循环模块以及放大窗口优化模块。图像采集模块:该模块为放大镜软件的主要模块之一,其主要功能是通过一系列函数与方法获取被放大区域,然后将得到的数据作为数据源发送至放大窗口设计模块,从而实现放大的功能。实现思想:利用Windows API 获取当前鼠标所在区域,通过鼠标位置以及计算算式,获取被放大区域,然后将获取的矩形内的图像数据,作为放大窗口的数据源输入。同时引入MFC库,将采集到的数据通过StretchBlt()函数,复制至目标窗口,实现放大的功能。消息循环模块:该模块的主要功能是决定程序的执行代码,根据用户的操作来获取
15、相对应的虚拟信息并进行转换,然后将消息发送至放大窗口,从而改变放大窗口的各项值。实现思想:在程序内部以函数的形式定义一个定时器并实现,在主程序内不断读取消息并对放大窗口进行操作,定时器定期监控虚拟信息,将其进行转换后获得信息输入然后将其发送至指定窗口,通过switch.case语句分析信息输入,然后选择性的进行目标代码的运行。放大窗口设计模块:该模块为放大镜的主要模块之一,其主要功能是创建一个窗口作为放大窗口,然后将图像采集模块获得的数据作为数据输入并显示,同时通过消息循环模块所发送的消息来决定放大窗口的各项属性。实现思想:事先通过定义或者计算得到各个变量的值,之后将获取到的变量置于Creat
16、eWindow()函数之中,创建窗口,所创建的矩形为查看窗口,即放大窗口。同时可通过键盘以及鼠标,对目标矩形进行窗口大小和倍率的修改。放大窗口优化模块:该模块是放大窗口设计模块的附属模块,其目的是在放大窗口正常运行的情况下,对放大窗口进行一些优化操作,提高用户的使用体验感。通过各种MFC预设函数,在目标窗口内进行画线等操作,使得通过人为的程序设计,实现前端窗口可以达到提高用户体验的效果。目前已在放大窗口内加入了两条交叉红线使得使用者可通过红线的交叉点确定鼠标位置,利用此举使得用户可以判断当前鼠标位置,更好的得到自己想要的信息。1.4 技术要求(1)该程序设计为Windows桌面应用程序,可运行
17、在Windows XP 及以上版本的Windows操作系统上。(2)合理划分各功能模块。(3)调用Windows API实现与操作系统的数据交互。2 软件描述2.1 任务概述下面我将该课程设计的有关问题简要描述一下2.1.1 系统目标该放大镜软件可放大屏幕上当前鼠标所在位置周围一定区域的数据,方便用户进行查看不易辨别的区域。去除原规划的设置界面,加入键盘消息监控代码,使得该区域的大小可由用户通过键盘操作自行设定。对区域的边界进行阀值设定,防止用户过大或过小的设定窗口大小。同时对被放大区域的边界进行判定,当被放大区域超出Windows边界时根据鼠标所在位置的情况重新设定窗口大小。同时可在用户鼠标
18、移向放大区域时改变放大区域的位置,使得用户可以达到查看全屏区域的效果。对被放大区域与放大窗口的位置进行判定防止两者重叠产生重复放大的情况。同时用户可使用鼠标的滚轮设定软件的放大倍率。去除原规划的设置界面,直接修改为利用鼠标控制倍率的调整,提高用户的使用体验感。通过测试对倍率的阀值进行设定,防止用户过大或过小的调整倍率。在放大窗口内加入红色线条,交点代表当前鼠标所在位置,使得用户可以快速的寻找到目标位置与目标数据,提高用户的使用体验感。2.1.2 系统的开发环境硬件:硬盘空间:5G内存:1GCPU:奔腾三代操作系统:Windows XP 或以上其他软件:Microsoft Visual Stud
19、io 2008 或以上2.1.3 开发思想与原理放大镜软件实现的基础功能是放大鼠标所在区域并可通过键盘与鼠标对放大镜的各项属性进行更改。放大镜软件实现思想是首先对鼠标所在区域通过计算,然后进行被放大区域的抓取,将图形获取并放在缓存之中,通过StretchBlt()将数据复制至目标区域,变相实现将图像放大的效果。如果想实现缩小的效果,只需修改想要抓取区域的大小以及计算方式即可。在这个过程中我们可以定义一个定时器不断的监控虚拟信息输入,然后通过转换后判断当前用户的动作或输入,从而通过函数判定来选择目标代码的执行。放大窗口的移动,软件的退出,放大区域的刷新,鼠标的移动,鼠标滚轮动作,键盘输入决定窗口
20、大小等,均由定时器进行判定输出信号。放大镜软件的所有动作,都是由定时器模块与回调函数机制共同来决定。下面是该软件中两个小算法的思路:计算抓取区域与实现窗口移动。如何计算所要被抓取的区域:首先通过GetCursorPos()函数可获得鼠标位置,然后利用放大窗口所设定的变量值,即放大窗口大小,除以2再除以放大因数,便可获得所想要被抓取的区域。当被放大区域的上下左右边界到达屏幕临界点,即被放大区域即将超出屏幕边界时,根据鼠标所在位置对被放大窗口的大小进行针对性设计,经过计算后重新修改上下左右边界的值,便可防止被放大区域超出屏幕边界。具体设计在之后会呈现。如何实现放大窗口的移动:在程序中设定一个定时器
21、,不断的监控虚拟指令并进行转译,首先通过ScreenToClient()函数将鼠标所在的位置转化为坐标点,赋值给m_ptCur变量,然后通过PtInRect()函数检测鼠标是否在放大窗口内,当鼠标在放大窗口中时,改变窗口标识变量,通过SetWindowPos()函数将窗口位置改变即可。2.2 功能描述2.2.1 软件设计放大镜软件可对鼠标位置周围的部分屏幕区域进行放大,并能根据鼠标所在位置改变放大窗口位置,从而实现全屏幕无死角的放大查看。用户可通过键盘改变放大窗口的大小同时改变被放大区域的大小,也可通过鼠标滚轮改变软件的放大倍率。2.2.2 模块功能划分根据需求分析以及程序设计可知,要想完成放
22、大镜的功能,首先要通过图像采集模块计算被放大区域,获得被放大区域的数据,同时通过窗口设计模块设定放大窗口各属性,创建放大窗口,通过消息循环模块监测虚拟消息,首先默认将数据复制至放大窗口,之后不断监测虚拟消息,转译、发送消息到放大窗口,根据消息类型,选择性执行代码行,实现各种功能。最后在软件成功运行的基础之上优化界面显示,提高用户的使用体验感。2.3 性能(1)时间特性更新消息处理时间:50ms运行时间:人工决定(2)适应性:可在Windows XP 或以上版本的Windows操作系统下运行(3)其他要求:可使用性:一般用户均可使用可靠性:较为可靠可维护性:易于维护3 方案设计3.1 具体方案设
23、计下面是关于此方案的具体设计:3.1.1模块划分根据该软件所需要实现的放大功能,整个软件可划分为四个模块:放大窗口设计模块、图像采集模块设计、消息循环模块以及放大窗口优化模块。它们需要完成的任务是事先设定放大窗口的大小及位置,创建窗口,抓取鼠标所在区域,采集数据,将数据进行复制,传送到放大窗口,实现放大效果,然后不断监控虚拟消息,通过用户操作改变放大窗口的各项属性。在软件成功运行的基础之上,对软件进行细小优化,提高用户的使用体验。3.1.2各个模块的功能说明3.1.2.1 放大窗口设计模块放大窗口模块用于将得到的图形数据进行投影,让用户清楚当前鼠标所在区域的图像,从而使得用户可以选择性的进行放
24、大区域的选择,达到放大镜的目的。同时还在窗口位置设定模块中,加入了之后的消息判断,从而可以实现利用鼠标位置判定来移动当前显示窗口的功能。整个窗口放大模块,分为两个小模块:创建窗口与窗口移动。创建窗口模块最主要使用的函数为CreateWindow()函数,该函数共有11个变量,这些变量共同决定了窗口的类型,所在位置,类名,标题,风格等属性,所以只需要在程序内部定义各个变量及其属性值,便可利用该函数进行窗口的创建。在窗口进行创建后,要进行激活,重新显示,这样可以保证窗口创建的成功性。窗口移动模块则是放大窗口模块与之后的消息循环模块相互关联,两者共同协作达到移动窗口的目的。通过消息循环模块不断发出的
25、消息来判断执行语句,当鼠标在目标窗口内时,使用自定义函数SetWndPos(),内部使用SetWindowPos()函数,该函数共有7个变量,共同改变指定窗口当前状态。这7个变量,有定义的固定变量,也有经过计算后得到的变量,其作用是改变当前窗口状态,这样使用自定义函数去决定当前窗口的新状态,便可达到使窗口移动的效果。该模块的具体设计以及各函数解释会在之后代码设计中进行描述。3.1.2.2 图像采集模块设计图形采集模块是放大镜软件最重要的模块之一,该模块利用Windows API获取当前屏幕的图像数据。同时将所获取到的数据复制至放大窗口设计模块中所设置的窗口。而该模块使用的函数StretchBl
26、t(),也是放大镜软件最重要的一个函数,当前Windows系统之上大部分的放大镜软件,均是在该函数的基础上进行优化来编写放大镜软件。StretchBlt()函数共有10个变量,其中第一个变量为目标环境句柄,在放大镜软件中,该变量代表放大窗口的句柄,这个是在全局变量中进行定义,之后的四个变量共同决定放大窗口所在的位置,它们由放大窗口的左边界,放大窗口的上边界,放大窗口的宽,放大窗口的高度共同决定。第五个变量为被放大窗口的句柄,6-9代表被放大窗口的大小,这些跟放大窗口的设定都有异曲同工之处。第十个变量则为数据的映射方式。在该程序设计中,我选择直接使用SRCCOPY,它所代表的含义是将源矩形区域直
27、接拷贝到目标矩形区域。因为该函数是不断的将数据放入内存然后再拷贝至放大窗口,在消息循环模块我们可知道信息是不断的监测,这代表窗口如果不进行资源释放,那么内存会不断的被占用,所以在图像采集模块的最后,我们需要加入ReleaseDC()函数,将得到的信息全部释放,即释放窗口资源,这样才能保证软件长久运行的稳定性。3.1.2.3 消息循环模块消息循环模块是放大镜软件的另一个重要部分。如果说图像采集模块是放大镜软件的执行者,那么消息循环模块就是放大镜软件的决策者。在消息循环模块中,我定义并实现了一个定时器函数,这个函数每50ms会读取一次虚拟消息,然后对虚拟消息进行转化,选择性的去执行各个代码行,从另
28、一个角度来讲,该定时器每50ms便会执行一次相应的代码,譬如鼠标移动,就会去执行Case WM_MOUSEMOVE之后的代码行,创建窗口,就会去执行Case WM_CREATE之后的代码行等。如同之前在放大窗口设计模块中所述,放大窗口模块就是用于将得到的图形数据进行投影,然后达到放大的效果。其实整个放大的过程,就是消息循环模块,放大窗口设计模块,与图像采集模块工作协作的结果。WM_TIMER是定时器的默认消息,当定时器监测到无其他消息时,便会默认执行WM_TIMER所代表的代码行,将图像采集模块与窗口优化模块均写在这个函数中,那么程序便可以实现放大功能,并且因为消息间隔时间很短,结合生物学的视
29、觉暂留,我们便可从用户角度感觉放大镜的放大并不粘滞,放大流畅,有很好的用户体验感。SetTimer()函数包含四个变量,他们分别代表接受消息的窗口,定时器ID,定时器间隔,以及定时器消息的处理函数。一般来讲,我们只需要对前三者进行设置即可,因为指定窗口一般都会有消息处理函数,所以第四个变量一般为NULL。而其余的变量,则需要根据实际情况进行设定,譬如该放大镜软件的更新消息处理时间为50ms,我需要让其50ms更新一次画面,那么我需要将第三个变量设为50即可。3.1.2.4 放大窗口优化模块放大窗口模块是在整个放大镜软件的主要功能“放大”完成之后,在图像处理模块加入的小模块,它的作用是用简单的手
30、段,创建一些额外的画面或者提示,提高用户的体验感。目前已经实现的功能有:在放大窗口添加额外的显示,使得用户可以得到当前鼠标所在位置。这一功能使得用户可以根据两条线的交点,更加迅速的得到自己鼠标的所在位置,从而可以更快的确定放大目标,以及更快的得到所需消息。MFC有自己的HPEN结构体,利用该结构体以及CreatePen()函数,我们可以创建一个画笔,CreatePen()函数有三个变量,画笔风格,宽度,以及画笔颜色。一般画笔风格如无特殊要求,均使用默认风格PS_SOLID,颜色,则可以使用预定义的颜色,或者使用三原色来确定颜色,例如RGB(255,0,0)便代表红色。确定画笔之后,利用Sele
31、ctObject()函数将所创建的画笔选至放大窗口,然后在其内部使用MoveToEx()以及LineTo()两个函数来画线。前者的功能是将点移动至目标点,后者的功能则是从A点画线至B点。它们都有自己的变量以及函数使用方法,其具体使用方式将在代码设计中体现并解释。3.2 方案论证分析3.2.1 方案的技术可行性C+是在C语言的基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言。它在C语言的基础之上加入了类的概念,派生类,类的多重继承,抽象类,const成员函数,共有和私有成员,构造函数,析构函数,友元,内联函数,赋值运算符的重载,虚函数,函数和运算符的重载,引用等。C语言是C+
32、的基础,C+和C语言在很多方面是兼容的。C语言是一个结构化语言,它的重点在于算法与数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事物)控制)。C+则首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事物)控制。所以C语言和C+的最大区别在于它们解决问题的思想方法不一样。C+语言最有意义的方面是支持面向对象的特征。虽然与C的兼容使得C+具有双重特点,但他在概念上完全与C不同,更具面向对象的特征。而出于保证语言的简洁和运行高效等方面的考虑,C+的很多特性都是以库(如M
33、FC)或其他的形式提供的,而没有直接添加到语言本身里。C+引入了面向对象的概念,使得开发人机交互类型的应用程序更为简单、快捷。很多优秀的程序框架包括Boost、Qt、MFC、OWL、wxWidgets、WTL就是使用的C+。MFC(MicrosoftFoundationClasses)是微软基础类库的简称,是微软公司实现的一个C+类库,主要封装了大部分的Windows API函数,VC+是微软公司开发的C/C+的集成开发环境,所谓集成开发环境,就是说利用它你可以编辑,编译,调试,而不是使用多种工具轮换操作,灵活性较大。MFC除了是一个类库以外,还是一个框架,并且MFC提供了大量的窗口类,其功能
34、和用途各异。所以使用C+语言,引入MFC类库,能够书写更简洁的代码,拥有更快速的开发速度,省却了在C+语言中再写入窗口以及框架的时间。并且利用C+语言进行开发,不需要牺牲任何C语言的特点,从另一方面来讲,C+在C语言的基础上重新开发,熟悉C开发的人员也能更快地进入C+领域,只需要一个MFC帮助文档并且了解MFC的运行机制,便能更快的进行基于C+和MFC框架的程序开发。同时该软件由VS2010进行编译,运行在Windows操作系统上,在程序编写过程中,使用Windows所规定的消息循环机制与消息响应机制,同时使用Windows系统的API与MFC库,这使得该软件可以在Windows操作系统上不同
35、的架构下进行移植并提高了软件的通用性,这使得软件的移植性大大提高。所以此方案具有技术可行性。3.2.2 方案的经济可行性随着计算机的普及,计算机已成为我们不可或缺的物件,与之而来的各种软件使用频率也不断增加。从目前角度来看,个人PC上的放大镜是一个可有可无的软件,多用于在特殊情况下放大屏幕,得到用户想要的信息。由于实际生活问题,个人PC的放大镜软件多面向老年人或者残疾人,使用普及率并不高。所以从私人角度来讲放大镜的经济可行性并不高。这也是导致个人PC放大镜软件很少并且编写粗糙的主要原因。但是结合当前世界工业发展情况,我们可以看到,科学技术的发展,使得生产零件精度愈加提高,人眼识别能力在发展下已
36、略显吃力,若是将放大镜软件与硬件相结合,进行智能放大镜与工业用放大镜的开发,便可在一些特定区域获得利益,当前市场上的800倍光钎放大镜已取得极好的收益。投资小,所以经济可行性尚可。3.2.3 方案的优点该放大镜方案最大的优点可从两方面解读,一方面是从代码编写谈微观方面,一方面是从界面谈宏观方面。在代码编写过程中,该软件加入了MFC类库的引用,这使得软件代码简短,处理速度快,软件体积大幅缩小,并且使用switch.case语句使得软件的逻辑结构非常清晰,软件的代码运行均是针对性、选择性的运行,并且内含资源优化机制,使得软件内存消耗极小,可保证软件的长期运行。加入Windows消息循环机制使得用户
37、可以快速理解软件的运行方式与函数回调机制,同时可以使得长期使用Windows编程的软件工程师快速了解软件的编写结构与思想,容易实现软件的二次开发与维护。在用户界面方面来看,该软件去除了设置界面,将放大镜的设置全部以热键的形式融合入程序中,省却了用户不断设置的繁复。使用热键来进行设置改变,符合当前社会快速生活的主旨。并且该软件结合Windows上放大镜软件的三种显示方式,整个软件的窗口显示为仿停靠模式,窗口默认固定在左上角,在运行过程中可以根据鼠标位置来改变窗口位置,排除了放大窗口挡住被放大部分的缺陷。Windows是当前中国使用率最高的软件系统,开发Windows下的放大镜软件,也能满足大量私
38、人用户的需求,符合一个软件的编写应有利于社会工作效率提高的宗旨。3.3 程序设计3.3.1 总体流程该放大镜软件程序从主函数进入,运行后先运行创建窗口函数,添加WM_CREATE消息至消息队列中,执行消息循环模块,创建窗口,抓取窗口的句柄为之后窗口的各项操作提供变量。然后默认执行WM_TIMER后的代码行,即图像采集模块,计算被放大区域,对被放大区域的数据进行抓取,并将该数据直接拷贝到放大窗口。在之后的运行过程中,定时器循环监测虚拟消息,对虚拟消息进行转译并决定执行代码,并返回消息给放大窗口,放大窗口根据选择代码行对窗口进行操作。当用户输入ESC或者ALT+F4时,触发关闭窗口消息,关闭窗口,
39、退出程序。其流程如图3-1所示。图3-1 放大镜软件运行总体流程4 代码实现放大镜软件根据需求分析以及功能模块的划分,来进行代码的编写,但是并不是每一个模块都有自己绝对对应的代码区域,它们互相组合,譬如图像抓取模块就与放大窗口优化模块放在一起,写在WM_TIMER指令判断之后,在窗口不断的重新建立中一起运行。各模块的具体区域以及含义解读,将在小章节划分,程序的注释,以及之后的部分代码解读中体现。4.1 主程序入口该部分为程序的主入口,即main函数。从代码中我们可以看出,程序的运行流程为先根据各变量,声明并定义窗口类,创建窗口时获取窗口句柄,为之后的窗口属性修改做准备。创建窗口后为消息循环模块
40、,其作用为不断读取线程中的消息,处理消息后丢弃消息。消息循环模块具体设计在之后小章节中。int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)WNDCLASSEX wcex;/WNDCLASSEX wcex1;/定义windows类wcex.cbSize = sizeof(WNDCLASSEX);wcex.style= CS_CLASSDC;/窗口类型wcex.lpfnWndProc= WndProc;/定义窗口处理函数wcex.cbClsExtra= 0;/
41、窗口类无扩展wcex.cbWndExtra= 0;/窗口实例无扩展wcex.hInstance= hInstance;/当前实例句柄wcex.hIcon= NULL;/窗口的最小化图标wcex.hCursor= LoadCursor(NULL, IDC_ARROW);/窗口采用箭头光标wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);/窗口背景色wcex.lpszMenuName= NULL;/窗口菜单wcex.lpszClassName= szWindowClass;/窗口类名wcex.hIconSm= NULL;/窗口的图标缩略图/wcex1.cbS
42、ize = sizeof(WNDCLASSEX);/wcex1.style= CS_CLASSDC;/wcex1.lpfnWndProc= WndProc;/wcex1.cbClsExtra= 0;/wcex1.cbWndExtra= 0;/wcex1.hInstance= hInstance;/wcex1.hIcon= NULL;/wcex1.hCursor= LoadCursor(NULL, IDC_ARROW);/wcex1.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);/wcex1.lpszMenuName= NULL;/wcex1.lpszClass
43、Name= szWindowClass;/wcex1.hIconSm= NULL;/RegisterClassEx(&wcex1);RegisterClassEx(&wcex);/为之后调用CreateWindow函数使用的窗口注册一个窗口类m_hInst = hInstance; / 将实例句柄存储在全局变量中m_hWnd = CreateWindow(szWindowClass, szTitle, WS_POPUPWINDOW,m_iWndX, m_iWndY, m_iWndCX, m_iWndCY, NULL, NULL, m_hInst, NULL);/创建windows实例类名,标题
44、,风格,初始坐标,窗口大小,父窗口句柄,菜单句柄,模块实例句柄if (!m_hWnd)return FALSE;/创建失败ShowWindow(m_hWnd, SW_SHOWNORMAL);/窗口句柄,激活并显示一个窗口UpdateWindow(m_hWnd);/重绘窗口/ 消息循环处理MSG msg;ZeroMemory(&msg,sizeof msg);/用填充消息while (msg.message != WM_QUIT)if (PeekMessage(&msg, NULL, 0, 0,PM_REMOVE)/API函数检查线程消息队列/消息读取后移除TranslateMessage(&m
45、sg);/ 该函数将虚拟键消息转换为字符消息/ 字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数GetMessage或PeekMessage时被读出DispatchMessage(&msg);/该函数分发一个消息给窗口程序elseUnregisterClass(szWindowClass,m_hInst);/销毁4.2 放大窗口模块该模块的实现逻辑为:首先在主函数外声明之后创建窗口所需的全部变量以及过程函数的声明。声明的变量为之后使用CreateWindow()创建窗口做准备。CreateWindow()在主程序中,运行至CreateWindow()时向消息队列加入WM_CREATE
46、消息,由消息循环模块对消息进行读取,转移,选择性执行代码。从而达到创建放大窗口的目的,而不是在执行至CreateWindows()时便创建窗口。#include#define MAX_LOADSTRING 100/全局变量HINSTANCE m_hInst;/ 当前实例,定义的应用程序句柄CHAR szTitleMAX_LOADSTRING = Magnifier_Test;/ 应用程序的标题CHAR szWindowClassMAX_LOADSTRING = Magnifier_Test;/ 主窗口类名HWND m_hWnd;INT m_iWndCX = 300;INT m_iWndCY =
47、 300;/窗口预设大小INT m_iWndX = 0;INT m_iWndY = 0;POINT m_ptCur = 0,0;FLOAT m_fMultyValue = 2.0f;/倍率RECT m_rcWnd;/矩形变量CHAR m_cWndType;enum enWndTypeWND_LEFT,/0WND_RIGHT,/1;LRESULT WINAPIWndProc(HWND, UINT, WPARAM, LPARAM);/过程函数switch (message)case WM_CREATE:m_hWnd = hWnd;SetTimer(hWnd,0,50,NULL);/接受消息的窗口,
48、定时器,定时器时间间隔,定时器消息的处理函数,如果为NULL,则由指定的窗口的消息处理函数来处理/m_iWndX = 0;/m_iWndY = 0;GetWindowRect(hWnd,&m_rcWnd);m_cWndType = WND_LEFT;SetWndPos();break;4.3 图像采集模块图像采集模块位于创建窗口,即消息循环模块读取WM_CREATE之后,执行定时器机制默认的消息WM_TIMER中。联系Windows消息系统可知,对放大窗口进行操作需要窗口的句柄,该句柄已在放大窗口模块创建放大窗口时被得到。关于被抓取区域的大小,需要根据鼠标位置以及放大窗口的大小来共同计算,在正
49、常情况下被抓取区域为:以鼠标位置为中心,经过与倍率相除之后的放大窗口。非正常情况包括四种情况:上界限超出屏幕边界,下界限超出屏幕边界,左界限超出屏幕边界以及右界限超出屏幕边界,此时需要根据鼠标所在位置,对被抓取区域重新计算。计算方法将在附录中体现。以下为代码实现:LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)/回调函数,消息响应机制PAINTSTRUCT ps;HDC hdc;switch (message)case WM_TIMER:GetCursorPos(&m_ptCur);/
50、获取鼠标位置HDC hDC = GetDC(hWnd);/取得程序句柄为之后的复制做准备HDC hDeskTopDC = GetDC(NULL);/取得窗口句柄RECT hDlgRgn,hImgRgn;/*hDlgRgn.left = m_ptCur.x - m_iWndCX/2;hDlgRgn.top = m_ptCur.y - m_iWndCY/2;hDlgRgn.right = m_ptCur.x + m_iWndCX/2;hDlgRgn.bottom = m_ptCur.y + m_iWndCY/2;*/hImgRgn.left = (INT)(m_ptCur.x - (FLOAT)m
51、_iWndCX/2/m_fMultyValue);hImgRgn.top = (INT)(m_ptCur.y - (FLOAT)m_iWndCY/2/m_fMultyValue);hImgRgn.right = (INT)(m_ptCur.x + (FLOAT)m_iWndCX/2/m_fMultyValue);hImgRgn.bottom = (INT)(m_ptCur.y + (FLOAT)m_iWndCY/2/m_fMultyValue);/被抓取区域与放大窗口重合if( (m_cWndType = WND_LEFT) &(hImgRgn.left=m_iWndCX) & (hImgRg
52、n.top=(GetSystemMetrics(SM_CXSCREEN)-m_iWndCX) & (hImgRgn.top=m_iWndCY) )m_cWndType = WND_LEFT;SetWndPos();/被抓取区域左界限到达边界if(hImgRgn.left0)hImgRgn.left=0;hImgRgn.right = (INT)(m_ptCur.x *2);hImgRgn.top=(INT)(m_ptCur.y (m_ptCur.x)*(m_iWndCY/2/m_fMultyValue)/(m_iWndCX/2/m_fMultyValue);hImgRgn.bottom=(IN
53、T)(m_ptCur.y +(m_ptCur.x)*(m_iWndCY/2/m_fMultyValue)/(m_iWndCX/2/m_fMultyValue);/被抓取区域上界限到达边界if(hImgRgn.topGetSystemMetrics(SM_CYSCREEN)hImgRgn.bottom = GetSystemMetrics(SM_CYSCREEN);hImgRgn.top=(INT)(m_ptCur.y)*2-GetSystemMetrics(SM_CYSCREEN);hImgRgn.left = (INT)(m_ptCur.x -( GetSystemMetrics(SM_CYSCREEN) -(m_ptCur.y) )*( m_iWndCX/2/m_fMultyValue ) /( m_iWndCY/2/m_fMultyValue );hImgRgn.right = (INT)(m_ptCur.x +( GetSystemMetrics(SM_CYSCREEN)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 陶瓷制品订购协议三篇
- 智能物流系统投资合同三篇
- 信阳师范大学《热力学与统计物理》2022-2023学年第一学期期末试卷
- 信阳师范大学《变态心理学》2022-2023学年第一学期期末试卷
- 小班节日文化的教育传承计划
- 手术室主管工作计划
- 汽车燃料运输合同三篇
- 新余学院《编舞技法》2022-2023学年第一学期期末试卷
- 西南林业大学《家具设计基础》2021-2022学年第一学期期末试卷
- 信阳师范大学《Python语言程序设计实验》2022-2023学年第一学期期末试卷
- 【MOOC】国际交流学术英文写作-湖南大学 中国大学慕课MOOC答案
- 【课件】第21课《小圣施威降大圣》课件2024-2025学年统编版语文七年级上册
- 《管理的实践》读后感
- 专升本数学知到智慧树章节测试课后答案2024年秋江苏财会职业学院
- 《技术的含义及作用》课件
- 全新药店劳动合同(2024版):员工福利、社会保险及假期规定2篇
- 《声波的反射和折射》课件
- 山西省2024年中考物理试题(含答案)
- 《忆读书》说课稿
- 国家职业技术技能标准 6-28-01-03 汽轮机运行值班员 人社厅发202226号
- 高空抛物安全宣传教育课件
评论
0/150
提交评论