基于VC--图形处理软件开发学士学位论文-外文原文及翻译.docx
-
资源ID:86252350
资源大小:412.43KB
全文页数:49页
- 资源格式: DOCX
下载积分:9金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
基于VC--图形处理软件开发学士学位论文-外文原文及翻译.docx
摘要摘 要在现代社会中,电脑被视为视觉艺术中越来越常用的工具。原本依托于纸张的信件和绘画,依托于胶片的照相摄影及医学检查,它们均在慢慢向电子化与网络化发展。各种显示设备已经能够满足人们对于图像几乎所有的需求。因此,人们也需要能够在显示屏上像用纸和笔一样进行绘画。这篇论文针对这一需求,提出了使用VC+利用微软公司的MFC类库,在Windows平台上制作一个简易的、轻量的、低学习成本的画板程序的方法。关键词:MFC,C+,图形图像编程,画板程序IABSTRACTABSTRACTIn modern society, computers are seen as more and more commonly used in visual arts. Letters and paintings were originally based on paper, photography and medical check were originally based on film, but now they are becoming electronic and networked. A variety of display devices have been able to meet people's demand for almost all images. Therefore, people also need to be able to paint on the screen like using paper and pen. In response to this demand, this paper presents a method of making a drawing board program with using Microsoft's MFC class library in Visual C+, which is lightweight and low learning costs.Keywords: MFC, VC+, Graphic image programming, Drawing board program 45目录目录第一章 绪论11.1 数字图像的发展11.2 绘图软件的发展现状11.3 编程语言简介21.4 本文主要研究内容3第二章 编程基础42.1 编程原理42.1.1 C语言编程原理42.1.2 面向对象编程52.1.3 类简介52.1.4 MFC简介62.2 程序创建原理72.2.1 创建源代码文件82.2.2 编译和链接92.3 本章小结10第三章 MFC程序的实现113.1 创建MFC应用程序框架113.2 控件113.2.1 静态控件133.2.2 编辑框控件143.2.3 按钮163.2.4 组合框203.3 图形图像编程243.3.1 GDI坐标系与映射模式253.3.2 颜色和颜色设置263.3.3 GDI对象263.3.4 画笔工具273.3.5 图形绘制工具283.3.6 画刷工具293.4 本章小结30第四章 总结31致 谢32参考文献33附 录34外文文献原文39外文文献译文44第一章 绪论第一章 绪论1.1 数字图像的发展有证据表明,在书面沟通之前,绘画是人类表达思想的最古老形式之一1。大约3万年前,在书面语言发明之前,绘画就已经作为智人专门的交流方式出现在他们洞穴的壁画及岩画中2。那些图形被称为象形图,描绘其所指对象的抽象概念3。史前时期的草图和绘画不断的被风格化和简化,推动了书面语言的产生发展。绘画在人类历史上一直是公众表达的流行和基本手段。它是传达视觉想法的最简单和最有效的手段之一4。绘画是使用各种各样的工具和技术制作图像的手段。传统的绘画过程使用铅笔、钢笔、刷子、蜡笔、木炭和(或)粉彩。在数字化的绘图软件中,很多基础工具都对实物工具进行的模仿与改进,如直线工具、铅笔工具、矩形和椭圆工具、橡皮擦工具及字符输入工具等。视觉艺术家已经不再局限于传统的艺术媒体。20世纪60年代以来,电脑被视为视觉艺术中越来越常用的工具。其用途包括捕获或创建图像,编辑以及最终的渲染和打印。对于电脑的使用模糊了插画师、摄影师、照片编辑、3D建模工作者和工艺品艺术家之间的区别。复杂的渲染和编辑软件促成了多技能的图像开发人员的出现。艺术家等创作者更愿意使用个人电脑进行创作。因为使用绘图软件比传统方法需要较少的手眼协调,较少的想象能力,同时利用计算机的自动渲染功能可以更高效的(有时更准确的)来创建图像。然而,随着计算机计算能力的提升,绘图软件的风格、特效和编辑方法复杂多样,可能需要比传统绘画更多的学习成本,并且这一成本随着对软件掌握的程度直线上升。此时软件是激发还是压抑创造力就取决于其界面的直观性5。1.2 绘图软件的发展现状图形从广义上说,是能在人的视觉系统中形成视觉印象的客观对象。计算机图形学由Ivan Sutherland于1962年提出,并于近些年来飞速发展。计算机图形学是计算机科学的重要分支。目前图形的应用软件很多,例如Photoshop,AutoCAD等,但就开发图形系统本身来说,仍需构筑其底层平台,以便研究新的算法,扩充新的功能,加快图形处理速度,产生更加逼真的造型效果。Visual C+作为一种通用的软件开发工具,目前仍然是开发底层软件不可或缺的平台。本次研究正是基于这些因素,利用MFC的基础类库开发一个基本绘图环境,力求为图形系统的进一步开发研究提供一个良好的平台5,6。图形是Windows应用程序的重要组成部分,优美的图形界面是所有成功软件的共同特点。VC+是当前最为流行的基于Windows的开发工具之一,其功能的强大,精通VC+是不少程序开发人员的努力方向。在VC+中,每一项功能的实现都有着严密的逻辑与算法,只有清楚功能背后的原理与方法,才能做到运用自如。VC+的编程方式有两种,一种是直接使用API函数,另一种是使用MFC类库。第一种方式是传统的Windows编程方式,保留传统编程中面向过程的特征。第二种方式下MFC把API函数封装到各种类与对象内,是面向对象与Windows编程的有机结合,真正体现出了VC+编程的风格。本文具体分析MFC方式下实现绘图功能的几个关键问题,并给出具体实例。1.3 编程语言简介在过去的几十年,计算机技术以令人惊讶的速度发展,编程工作也随之发生翻天覆地的变化,程序员不再需要将穿孔卡片提交给充斥整个房间的大型计算机系统,而这种系统可能只有100KB的内存。计算机语言也得到了发展,尽管变化可能没有更大,但也是非常重要的。体积更大、功能更强的计算机引出了更大、更复杂的程序,而这些程序在程序管理和维护方面又带来了新的问题。20世纪70年代,C和Pascal语言标志着进入结构化编程时代,同时C语言还能生成简洁、快速运行的程序,并提供了处理硬件问题的能力。这些因素使C语言成为20世纪80年代占统治地位的编程语言。同时,20世纪80年代,人们也见证了一种新编程模式的成长:面向对象编程(Object Oriented Programming,OOP)。20世纪70年代早期,贝尔实验室的Dennis Ritchie致力于开发UNIX操作系统。完成这项工作需要一种语言,它必须能够生成简洁、快速的程序,并能有效地控制硬件。传统上,程序员使用汇编语言来满足这些需求,汇编语言依赖于计算机的内部机器语言。然而,汇编语言是低级语言,即直接操作硬件,如直接访问CPU寄存器和内存单元,因此汇编语言针对于特定的计算机处理器。如果想将汇编程序移植到另一种计算机上,必须使用不同的汇编语言重新编写程序。然而UNIX是为在不同的计算机或平台上工作而设计的,这意味着需要一种高级语言。高级语言致力于解决问题,同时不会专用于特定的硬件,编译器则将高级语言翻译成特定计算机的内部语言。这样,就可以通过对于每个平台使用不同的编译器,而实现不同平台上使用同一个高级语言程序了。Ritchie希望有一种语言能将低级语言的效率、硬件访问能力和高级语言的通用性、可移植性融合在一起,于是他在旧语言的基础上开发了C语言。“C+主要是为了我的朋友和我不必再使用汇编语言、C语言或其他现代高级语言来编程而设计的。它的主要功能是可以更方便地编写出好程序,让每个程序员更加快乐”。C+发明者Bjarne Stroustrup如此认为。Stroustrup比较关心的是让C+更有用,而不是实施特定的编程原理或风格。在确定C+语言特性方面,真正的编程需要比纯粹的原理更重要。C+是C语言的超集,这意味着任何有效的C程序都是有效的C+程序。它们之间有些细微的差异,但C+程序仍可以使用已有的C软件库。库是编程模块的集合,可以从程序中调用它们。库对很多常见的编程问题提供了可靠的解决方法,因此能节省程序员大量的时间和工作量。这也有助于C+的广泛传播。名称C+来自C语言中的递增运算符+,该运算符将变量加1。名称C+表明,它是C的扩充版本。1.4 本文主要研究内容本文主要研究在Visual Studio平台下使用VC+的MFC基础类库实现一个画板程序的基本功能,其功能包含有:·铅笔工具,可自定义绘制的线形与粗细;·直线工具,可自定义绘制的线形与粗细;·矩形、圆角矩形与椭圆工具,可自定义所绘图形的填充物。·以XY轴坐标方式定位光标位置,方便精细操作;·支持以jpg、bmp等格式保存文件。其中,绘图工具均支持选择黑色、蓝色、绿色、红色、白色或自定义颜色。第二章 编程基础第二章 编程基础2.1 编程原理C+融合了3种不同的编程方式:以C语言代表的过程性语言;C+在C语言基础上添加的类代表的面向对象语言;C+模板支持的泛型编程。编程技术人员使用C+的原因之一就是为了利用其面向对象的特性。而要利用这种特性,就需要对标准C语言知识有较深入的了解,因为C+与C语言存在一些共有特征:C语言提供了基本类型、运算符、控制结构和语法规则。但这并不仅仅是学习更多的关键字和结构。初学者在掌握了C之后学习C+,其学习量与从头学习C语言一样大。另外,如果不了解C语言,则学习C+时需要掌握C语言知识、面向对象编程知识以及泛型编程知识。2.1.1 C语言编程原理由于C+在C语言的基础上移植了新的编程理念,因此我们首先来看一看C所遵循的旧的理念。一般来说,计算机语言要处理两个概念数据和算法。数据是程序使用和处理的信息,而算法是程序使用的方法。C语言与当前主流的语言一样,在最初面世时也是过程性语言,这意味着它强调的是编程的算法方面。从概念上说,过程化编程首先要确定计算机应采取的操作,然后使用编程语言来实现这些操作。随着程序规模的扩大,早期的程序语言都会遇到组织方面的问题。例如,程序经常使用分支语句,根据某种测试的结果,执行一组或另一组指令。很多旧式程序的执行路径很混乱,几乎不可能通过阅读程序来理解它,修改这种程序简直是一场灾难。为了解决这种问题,计算机科学家开发了一种更有序的编程方法¬结构化编程。C语言具有使用这种方法的特性。例如,结构化编程可以将分支限制为一小组行为良好的结构。C语言的词汇表中就包含了这些结构(for循环、while循环、do while循环和if else语句)。另一个新原则是自上向下的设计。在C语言中,其理念是将大型程序分解成小型、便于管理的任务。如果其中的一项任务仍然过大,则将它分解为更小的任务。迭代这一过程,直到将程序划分为小型的、易于编写的模块。C语言的设计有助于使用这种方法,它鼓励程序员开发程序单元(函数)来表示各个任务模块。如上所述,结构化编程技术反映了过程性编程的思想,根据执行的操作来构思一个程序。2.1.2 面向对象编程虽然结构化编程的理念提高了程序的清晰度、可靠性,并使之便于维护,但它在编写大型程序时,仍面临着挑战。为应付这种挑战,面向对象编程提供了一种新方法。与强调算法的过程性编程不同的是,面向对象编程强调的是数据。面向对象编程不像过程性编程那样,试图使问题满足语言的过程性方法,而是试图让语言来满足问题的要求。其理念是设计与问题的本质特性相对应的数据格式。在C+中,类是一种规范,这种新型数据格式,其对象是根据这种规范构造的特定数据结构。例如,类可以描述公司管理人员的基本特征(姓名、头衔、工资、特长等),而对象则代表特定的管理人员。通常,类规定了可使用哪些数据来表示对象以及可以对这些数据执行哪些操作。如本例,开发一个能够绘制矩形的计算机绘图程序,则可以定义一个描述矩形的类。定义的数据部分包括顶点的位置、长和宽、四条边的样式、矩形内部的填充颜色和图案等;定义的操作部分可以包括移动、改变大小、改变颜色和图案等操作。这样,当使用该程序来绘制矩形时,它将根据类定义创建一个对象。该对象保存了描述矩形的所有数据值,因此可以使用类方法来修改该矩形。如果绘制两个矩形,程序将创建两个对象,每个矩形对应一个。面向对象编程程序设计方法首先设计类,它们准确地表示了程序要处理的东西。例如,绘图程序可能定义表示矩形、直线、圆、画笔的类。类定义描述了对每个类可执行的操作,然后便可以设计一个使用这些类的对象的程序。从低级组织(如类)到高级组织(如程序)的处理过程叫做自下向上的编程。面向对象编程不仅仅是将数据和方法合并为类定义,面向对象编程还有助于创建可重用的代码,这将减少大量的工作。信息隐藏可以保护数据,使其免遭不适当的访问;多态能够为运算符和函数创建多个定义,同时通过编程上下文能确定使用哪个定义;继承能够使用旧类派生出新类。面向对象编程引入了很多新的理念,使用的编程方法不同于过程性编程。它的重点不是放在任务上,而是放在表示概念上。设计有用、可靠的类是一项艰巨的任务,幸运的是,面向对象编程语言使程序员在编程中能够轻松地使用已有的类。厂商提供了大量有用的类库,包括设计用于简化Windows环境下编程的类库,如本次研究中使用了Microsoft设计的MFC类库。2.1.3 类简介类是C+中一种重要的格式,其理论支撑是面向对象编程。类规范由两个部分组成。类声明:以数据成员的方式描述数据部分,以成员函数的方式描述公有接口;类方法定义:描述如何实现类成员函数。简单地说,类声明提供了类的蓝图,而方法定义则提供了细节。面向对象编程是一种编程风格,这种风格主要存在于C+的编程中。类定义了一种抽象类型,它将存储格式和函数原型置于头文件中,对函数的使用者隐藏了实际的数据表示。C+包括了许多专门用来实现面向对象编程方法的特性。首先,将数据表示和函数原型放在一个类声明而不是放在一个文件中,通过将所有内容放在一个类声明中,来使描述成为一个整体。其次,让数据表示成为私有,使得数据只能被授权的函数访问。在C语言中、如果main()直接访问了结构成员,就违反了面向对象编程的精神、但没有违反c语言的规则。如果试图直接访问私有数据,编译器将捕获这种错误。数据隐藏不仅可以防止直接访问数据,还让程序开发者无需了解数据是如何被表示的。从他们的角度看,数据隐藏与否没有什么区别,所需要知道的只是各种成员函数的功能;也就是说,需要知道成员函数接受什么样的参数以及返回什么类型的值。另外,如果以后找到了更好的实现数据表示或成员函数的方法,可以针对这些进行修改,而无须修改程序接口,这使程序维护起来更容易。无论类成员是数据成员还是成员函数,都可以在类的公有部分或私有部分中声明它。但由于隐藏数据是OOP主要的目标之一,因此数据项通常放在私有部分,组成类接口的成员函数放在公有部分;否则就无法从程序中调用这些函数。通常,程序员使用私有成员函数来处理不属于公有接口的实现细节。除了public和private两个关键字可以控制对类成员的访问外,还存在另一个访问类别,这种类别用关键字protected表示。关键字protected与private相似,在类外只能用公有类成员来访问protected部分中的类成员。private和protected之间的区别只有在基类派生的类中才会表现出来。派生类的成员可以直接访问基类的保护成员,但不能直接访问基类的私有成员。因此,对于外部世界来说,保护成员的行为和私有成员相似;但对于派生类来说,保护成员的行为与公有成员相似。2.1.4 MFC简介Visual Studio作为Windows平台最早发布并发展沿用至今的开发工具集,其功能的完全性、多样性是大部分编程软件无法比拟的。它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。使用其所写的目标代码适用于微软支持的所有平台8。MFC即微软基础类(Microsoft Foundation Classes),由微软提供,用于在C+语言下编写应用程序。VC+是WinDOS下开发人员使用的专业C+ SDK,MFC则是挂载在VC+下的辅助软件开发包。MFC是Win API与C+的结合,API即微软提供的WinDOS下应用程序的编程语言接口,是软件编程的规范,但不是程序开发语言本身。它可以允许用户使用各种各样的第三方的编程语言来进行对WinDOS下应用程序进行开发,使这些被开发出来的应用程序能在WinDOS下运行,比如VB,VC+,Java,它们的编程语言函数本质上全部源于API,因此用它们开发出来的应用程序都能工作在WinOS的消息机制和绘图里,遵守WinDOS的内部实现。MFC作为微软对API函数的专用C+封装,这种结合让用户使用微软的专业C+ SDK来进行Win下应用程序的开发变得容易,程序开发人员在Windows下用MFC编制软件时的大量内节被隐藏,例如应用程序实现消息处理,设备环境绘图等。这种结合是以方便为目的的,势必要付出一定代价,因此就造成了MFC对类封装中的一定程度的冗余和迂回,这种代价是可以接受的。最后,MFC不只是一个功能单纯的界面开发系统,它提供的类绝大部分被用来进行界面开发,关联一个窗口的动作。但它提供的类中有很多不与一个窗口关联。对于这部分类,它们不是一个界面类,不实现对一个窗口对象的控制(如创建,销毁),而是一些在WinDOS(用MFC编写的程序绝大部分都在WinDOS中运行)中实现内部处理的类,如数据库的管理类等9-11。MFC是微软封装了的API。Windows是功能强大的应用程序接口编程的操作系统,方便了许多程序员。传统的win32开发,即直接使用Windows的接口函数API对于程序员来说非常的困难,因为API函数很多,内容杂乱,从零构架一个窗口动辄就是上百行的代码。MFC是面向对象程序设计与application framework的完美结合,它将传统的API进行了分类封装,并且创建了程序的一般框架。2.2 程序创建原理编写一个C+程序,其最终目的就是让它能够运行,具体的步骤取决于计算机环境和使用的C+编译器,但大体如下(如图2-1所示):·使用文本编辑器编写程序,并将其保存到文件中,这个文件就是程序的源代码。·编译源代码。这意味着运行一个程序,将源代码翻译为主机使用的内部语言机器语言。包含了翻译后的程序的文件就是程序的目标代码。·将目标代码与其他代码链接起来。例如,C+程序通常使用库。C+库包含一系列计算机例程(被称为函数)的目标代码,这些函数可以执行诸如在屏幕上显示信息或计算平方根等任务。链接指的是将目标代码同使用的函数的目标代码以及一些标准的启动代码组合起来,生成程序的运行阶段版本。包含该最终产品的文件被称为可执行代码。图 2-1 编程步骤要创建C+程序,可创建一个或多个源代码文件,其中包含了以C+语言表示的程序。这些文件是文本文件,它们经过编译和链接后将得到机器语言文件,后者构成了可执行的程序。上述任务通常是在IDE中完成的,IDE提供了用于创建源代码文件的文本编辑器、用于生成可执行文件的编译器和链接器以及其他资源,如项目管理和调试功能。这些任务也可以在命令行环境中通过调用合适的工具来完成12。2.2.1 创建源代码文件本节讨论创建源代码文件的技巧。有些C+实现提供了集成开发环境(Integrated Development Environment,缩写为IDE),能够让程序员在主程序中管理程序开发的所有步骤,包括编辑。有些实现只能处理编译和链接阶段,要求在系统命令行输入命令。在这种情况下,可以使用任何文本编辑器来创建和修改源代码。如果将文件保存为标准ASCII文本文件,甚至可以使用字处理器。另外,还可能有IDE选项,让用户能够使用这些命令行编译器。给源文件命名时,必须使用正确的后缀,将文件标识为C+文件。这将告知编译器该文件是C+源代码。后缀的字符被称作扩展名。对于本例, Windows系统的Visual Studio而言,C+文件的扩展名通常为cpp,cxx与cc。2.2.2 编译和链接最初实现C+时,是使用C+到C的编译器程序,而不是开发直接的C+到目标代码的编译器。这种方法简化了向C的领域引入C+的过程。随着C+的日渐普及,越来越多的实现转向创建C+编译器,直接将C+源代码生成目标代码。这种直接方法加速了编译过程,并强调C+是一种独立的语言。编译的机理取决于如何实现。对于Windows系统,实现方法一般有Windows命令行编译器及Windows编译器程序。对于其他系统实现的方法,在此不作赘述。1. Windows命令行编译器要在Windows PC上编译C+程序,最便宜的方法是下载一个在Windows命令提示符模式下运行的命令行编译器。Cygwin和MinGW都包含编译器GNUC+,它们使用的编译器名为g+。要使用g+编译器,首先需要打开一个命令提示符窗口。启动程序Cygwin和MinGW时,它们将自动打开一个命令提示符窗口。要编译名为great.cpp的源代码文件,可以在提示符下输入命令:g+ great.cpp如果程序编译成功,则可得到名为a.exe的可执行文件。2. Windows编译器Windows编译器产品很多且修订频繁,无法对它们分别进行介绍。虽然设计和目标不同,但大多数基于Windows的C+编译器都有一些相同的功能。通常,必须为程序创建一个项目,并将组成程序的一个或多个文件添加到该项目中。所有厂商提供的集成开发环境(IDE)都包含用于创建项目的菜单选项。必须确定的非常重要的一点是,需要创建的是什么类型的程序。通常,编译器提供了很多选择,如Windows应用程序、MFC Windows应用程序、动态链接库、ActiveX控件、DOS或字符模式的可执行文件、静态库或控制台应用程序等。创建好项目后,需要对程序进行编译和链接。IDE通常提供了多个菜单项,如Compile(编译)、Build(建立)、Make(生成)、Build All(全部建立)、Link(链接)、Execute(执行)、Run(运行)和Debug(调试),不过同一个IDE中不一定包含所有这些选项。Compile通常意味着对当前打开的文件中的代码进行编译。Build和Make通常意味着编译项目中所有源代码文件的代码。这通常是一个递增过程,也就是说,如果项目包含3个文件,而只有其中一个文件被修改,则只重新编译该文件。Build All通常意味着重新编译所有的源代码文件。Link意味着将编译后的源代码与所需的库代码组合起来。Run或Execute意味着运行程序。通常,如果还没有执行前面的步骤,Run将在运行程序之前完成这些步骤。Debug意味着以步进方式执行程序。编译器可能让您选择要生成调试版还是发布版。调试版包含额外的代码,这会增大程序、降低执行速度,但可提供详细的调试信息。如果程序违反了语言规则,编译器将生成错误消息,指出存在问题的行。遗憾的是,不熟悉语言将会难以理解这些消息。有时,真正的问题可能在标识行之前;有时,一个错误可能引发一连串的错误消息。改正错误时,应首先改正第一个错误。如果在标识为有错误的那一行上找不到错误,则需要查看前一行。程序能够通过某个编译器的编译并不意味着它是合法的C+程序;同样,程序不能通过某个编译器的编译也并不意味着它是非法的C+程序。编译器通常提供了可用于控制严格程度的选项。有时,编译器在不完全地构建程序后将出现混乱,显示无法改正的、无意义的错误消息。在这种情况下,可以选择Build All,重新编译整个程序,以清除这些错误消息。更加遗憾的是,这种情况和更常见的情况即错误消息只是看上去无意义而实际上有意义,是很难做出区分的。通常,IDE允许在辅助窗口中运行程序。若需要查看输出,必须在程序的最后加上一些代码:cin.get();cin.get();return 0;其中cin.get()语句的作用是读取下一次键击,因此上述语句让程序等待,直到按下了Enter键。在按下Enter键之前,键击将不被发送给程序,因此按其他键都是无效的。如果程序在其常规输入后留下一个没有被处理的键击,则第二条语句是必需的。例如,如果要输入一个数字,则需要输入该数字,然后按Enter键。程序将读取该数字,但Enter键不被处理,这样它将被第一个cin.get()读取13。2.3 本章小结本章主要介绍使用Visual Studio进行VC+编程的原理与概念,介绍了Windows平台上主要的编程环境Visual Studio的基本使用方法,介绍了编写一个后缀为exe的可执行文件的基本原理与步骤。第三章 MFC程序的实现第三章 MFC程序的实现3.1 创建MFC应用程序框架创建一个应用程序,首先要创建一个工程项目,利用项目管理程序中的所有元素,进而编译、生成应用程序。MFC App Wizard是一个创建基于微软基础类库MFC的Windows应用程序的向导,是Visual Studio常用的向导工具。当利用MFC App Wizard创建一个项目时,可以自动生成MFC的应用程序框架。MFC将每个应用程序共同需要使用的代码封装起来,完成默认的程序初始化功能,建立应用程序界面和基本的Windows消息,避免重复工作14。Visual Studio中MFC框架的创建方法:1. 选择文件新建项目,在Visual C+模板中选择MFC应用程序,单击确定,打开MFC应用程序向导。同时根据画板程序的特性,对以下的选项进行选择。2. 在应用程序类型中选择“单个文档”,即一次只允许在程序中打开一个文件。3. 在MFC的使用中,如果选择“在共享DLL中使用 MFC”,则表示代码在生成与调试时不会将头文件中的#include文件包含于得到的exe文件内,此时运行该应用程序会调用计算机系统中的数据库文件。若系统缺失对应文件将导致程序无法启动。对于较轻量的程序,这样做可以大幅减少软件体积。如果选择“在静态库中使用MFC”则与之相反,优点是能保证软件的正常运行,但会增大程序的体积。4. 在数据库支持中选择“无”。其他选项使用默认设置即可。之后根据需要,可使用类向导等工具添加需要的类及类成员函数15。3.2 控件在Windows应用中,对话框和控件是密不可分的。控件搭载与对话框上,对话框通过这些控件与用户进行交互。Windows提供的控件有两类,分别是标准控件和公共控件,说明如下。1. 标准控件包括静态库、编辑框、按钮、列表框、组合框和滚动条等。利用标准控件可以满足大部分用户界面程序设计的基本要求,如编辑框用于输入数据,复选框用于选择不同选项,列表框用于选择要输入的信息。2. 公共控件如滑块、进度条、标签控件和树状图控件等,以实现应用程序用户界面风格的多样性。因为画板软件不需要公共控件扩展功能,可以仅使用标准控件完成,故下文只介绍标准控件的实现。Windows系统标准控件的创建分为静态创建和动态创建两种,说明如下15。1. 静态创建它是指在对话框模板中创建控件并设置控件属性。在调用对话框时,窗口会自动按照预先的设置为对话框创建控件,而且程序员可以使用类向导ClassWizard为该控件在对话框类中创建一个控件类对象。2. 动态创建它是指在程序运行中根据需要,定义一个控件类的对象,再通过窗口函数CreateWindow()或者CreateWindowEx()创建控件,调用函数ShowWindow()显示控件,正如操作一个子窗口一样。每个控件都有一个属性表,对于静态创建的控件来说,可以在对话框模板中打开控件的属性对话框,并直接设置控件的初始属性。在设计程序的过程中,可以通过控件类对象调用方法设置控件的属性。在Windows标准控件中,除了静态控件通常不发送消息外,其他控件对于用户的操作都能发送消息,且不同种类的控件发送的消息不同。可以使用类向导ClassWizard为控件映射各种消息处理函数。在程序的运行过程中,可以通过函数UpdateData()主动控制数据在控件显示和成员变量之间的数据交换,同时MFC保留了Windows API函数用于直接对控件ID操作控件,获取或者设置控件的显示值,例如函数SetDlgItemText()和SetDlgItemText()用于设置或获取编辑框中的文本。Windows应用程序对控件的操作实质上是对窗口的操作,对话框窗口中的控件被视为对话框窗口的子窗口,具有通用窗口的属性,所以控件的操作还可以通过对一组窗口操作函数来完成。常用的控件子窗口的操作函数如下。CreateWindow()或CreateWindowEx(),在程序运行过程中,可以通过创建窗口的函数来动态创建控件。ShowWindow(),显示或者隐藏控件。EnableWindow(),激活控件或者禁止控件接受用户的输入。MoveWindow(),移动控件或者改变控件的大小。DestroyWindow(),关闭一个控件。3.2.1 静态控件静态控件包括静态文本和图片控件。其中静态文本控件用来显示正文,而图片控件可以显示位图、图标、方框和图元文件。在图片控件中显示图片的好处是不必担心图片的重绘问题。静态控件不能接受用户的输入,主要起到说明和装饰的作用。在MFC应用中,类CStatic封装了静态空间。类CStatic的成员函数Create()负责创建静态控件。该函数的格式声明如下。BOOL Create (LPCTSTR lpszText,DWORD dwStyle,const RECT&rect,CWnd* pParentWnd,UNIT nID=0xffff);lpszText指定了控件显示的文本。dwStyle制订了静态控件的类型,在表3-1中列出了静态控件的各种类型。rect是一个对RECT或CRect结构的引用,用来说明控件的位置和尺寸。pParentWnd指向父窗口,该参数不能为NULL。nID说明了空间ID,如果创建成功该函数返回TRUE,否则返回FALSE。表3-1 静态控件的类型控件类型用 途SS_BLACKFRAME指定一个与窗口边界同色的框(默认黑色)SS_BLACKRECT指定一个与窗口边界同色的实心矩形(默认黑色)SS_CENTER使显示的文本居中对齐,文本可以回绕SS_GRAYFRAME指定一个与屏幕背景同色的边框SS_GRAYRECT指定一个与屏幕背景同色的实矩形SS_ICON使空间显示一个在资源中定义的图标,图标的名字由Create()函数lpszText的参数指定SS_LEFT左对齐文本,文本可以回绕SS_LEFTNOWORDWRAP左对齐文本,文本不能回绕SS_NOPREFIX使静态文本串中的&不是热键提示符SS_NOTIFY使控件能向父窗口发送鼠标事件消息SS_RIGHT右对齐文本,文本可以回绕SS_SINPLE使静态文本在运行时不能被改变且文本单行显示SS_USERITEM指定一个用户定义项SS_WHITEFRAME指定一个与窗口背景同色的框(默认白色)SS_WHITERECT指定一个与窗口背景同色的实心矩形(默认白色)除了表3-1所示的窗口类型外,一般还要为控件指定WS_CHILD和WS_VISIBLE窗口类型。类CStatic主要的成员函数如表3-2所示。可以利用类CWnd的成员函数GetWindowText,SetWindowText和GetWindowTextLength等来查询和设置静态控件中显示的文本。表3-2 CStatic类的主要成员函数函数声明用 途HBITMAP SetBitmap (HBITMAP hBitmap);指定要显示的位图HBITMAP GetBitmap () const;获取由SetBitmap指定的位图HICON SetIcon (HICON hIcon);指定要显示的图标HICON GetIcon () const;获取由SetIcon指定的图标HCURSOR SetCursor (HCURSOR hCursor);指定要显示的光标图片HCURSOR GetCursor ();获取由SetCursor指定的光标图片HENHMETAFILE SetEnhMetaFile (HENHMETAFILE hMetaFile);指定要显示的增强图元文件HENHMETAFILE GetEnhMetaFile () const;获取由SetEnhMetaFile指定的图元文件3.2.2 编辑框控件编辑框控件实际上是一个简易的文本编辑器,用户可以在编辑框中输入并编辑文本。编辑框既可以是单行的,也可以是多行的。多行编辑框是从零行开始进行行编号的。在一个多行编辑框中,除了最后一行外,每一行的结尾处都有一对回车换行符(rn),这对回车换行符是正文换行的标志,屏幕上是不可见的。编辑框控件会向父窗口发出如表3-3所示的控件通知消息。表3-3 编辑框控件通知消息消 息含 义EN_CHAGE编辑框的内容被用户改变了。与EN_UPDATE不同,该消息在编辑框显示的正文被刷新后发出EN_ERRSPACE编辑框控件无法申请足够的动态内存来满足需要EN_HSCROLL用户在水平滚动条上单击EN_KILLFOCUS编辑框失去输入焦点EN_SETFOCUS编辑框获得输入焦点EN_MAXTEXT输入的字符超过了规定的最大字符数。在没有ES_AUTOHSCROLL或ES_AUTOVSCROLL的编辑框中,当正文超出了编辑框的边框时也会发出该消息EN_UPDATE在编辑框准备显示改变了的正文时发送该消息EN_VSCROLL用户在垂直滚动条上单击MFC中的类CEdit封装了编辑框控件。类CEdit的成员函数Create负责创建按钮控件。该函数的格式声明如下。BOOL Create (DWORD dwStyle,const RECT & rect,CWnd* pParentWnd,UNIT nID);其中dwStyle指定了编辑框控件的类型,具体的信息如表3-4所示。dwStyle可以是某些类