基于C语言的文本编辑器——部分编辑功能模块和显示功能模块---毕业论文_第1页
基于C语言的文本编辑器——部分编辑功能模块和显示功能模块---毕业论文_第2页
基于C语言的文本编辑器——部分编辑功能模块和显示功能模块---毕业论文_第3页
基于C语言的文本编辑器——部分编辑功能模块和显示功能模块---毕业论文_第4页
基于C语言的文本编辑器——部分编辑功能模块和显示功能模块---毕业论文_第5页
免费预览已结束,剩余51页可下载查看

下载本文档

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

文档简介

基于C语言的文本编辑器本 科 毕 业 论 文 基于C语言的文本编辑器部分编辑功能模块和显示功能模块A Text Editor Based on C Programming LanguageEditing Module and Display Module姓 名:学 号:学院:软件学院系:软件工程专 业:软件工程年 级:指导教师: 年 月摘要随着科技的发展,计算机的应用领域已渗透到社会的各行各业,改变着我们传统的工作、学习和生活方式,推动着社会的发展。在计算机软件开发领域中,应用开发人员往往关注于业务逻辑的实现,而不是底层机制的实现。然而,了解系统底层机制的实现往往可以让我们站在一个更高的高度上俯视应用程序的软件架构,从而优化它的设计并提高它的执行效率。本文的项目背景是一个基于DOS环境的用C语言实现的文本编辑器。文本编辑器是用来编写纯文本的计算机软件,操作系统和软件开发包往往都提供文本编辑器,用以修改配置文件和程序的源代码。该编辑器最核心的设计思想体现在内存管理上,为了解决DOS环境下的内存限制问题,本软件借鉴了操作系统中的虚存实现机制的思想,像内存分页那样把文件也划分为“页”。由于用户在编辑文本时,编辑区域趋于聚集在一个较小的连续区域中,因此程序执行的局部性原理在这里也同样适用,所以文本分页机制是可行的。这样一来,只需要把当前用户编辑区域相关的页导入内存,而可以让其他的业依旧驻留在硬盘中,这样一来,内存限制的问题就解决了。本文主首先介绍编辑功能模块中一些编辑功能的实现,包括可显示字符键、Tab键和Ins键,然后介绍了一些显示功能的实现,主要是如何在DOS的字符模式下显示对话框这一图形界面,接下来,本文详细说明了一些数据结构的设计,包括如何将链表、堆栈等常用数据结构的模板化以及文本行结构体的设计。关键词:文本编辑器;虚拟内存;底层机制AbstractWith the development of science and technology, computer has been widely used in all fields of society, changing our traditional way of working, studying and living and promoting the development of society. In the field of computer software development, application developers tend to focus on business logic rather than the realization of the underlying mechanisms. However, understanding the underlying mechanisms of the system often allows us to achieve a higher standing looking down at the height of the application software architecture, to optimize its design and to improve the efficiency of its implementation. In this paper, the related project is a DOS-based environment using C language realization of a text editor. A text editor is a type of program used for editing plain text files. Text editors are often provided with operating systems or software development packages, and can be used to change configuration files and programming language source code. The core design concepts embodied in the memory management. In order to overcome the restriction of memory, we can learn from the virtual memory mechanism of the operating system, dividing the whole text into pages. When the user is editing a text, the edit area tend to gather in a smaller area, therefore the local principle is also applicable here. As a result, we only need to load several pages into memory, and let others still in the hard disk, so that the problem of memory limitations resolved. This article first introduces several implementations of the editing module including character keys, Tab key and the Ins key, and then introduced the display module, including how dialog displays and works in character mode, then, this article introduces a number of data structure design in detail, including list, stack and other data structures such as the text line structure.Key words: text editor; virtual memory; underlying mechanisms目录第一章 绪论11.1 研究背景11.2 研究内容11.3 开发工具及环境11.4 论文组织结构2第二章 系统设计32.1 设计思想32.2 功能设计32.3 系统模块划分42.4 系统体系结构图42.5 小结5第三章 文本编辑功能模块63.1 功能概述63.2 总体设计63.2.1 文本的屏幕输出73.2.2 编辑区域定义83.2.3 流程图93.2.4 逻辑数据设计113.2.5 视图更新函数设计113.3 详细设计123.3.1 可显示字符键123.3.2 Tab键153.4 小结17第四章 显示功能模块184.1 对话框的基本概念184.2 对话框模板的设计194.2.1 对话框结构体Dialog194.2.2 对话框操作函数194.2.3 对话框工作流程214.3 信息类对话框214.3.1 界面设计214.3.2 交互方式224.4 输入类对话框224.4.1 界面设计234.4.2 交互方式234.5 确认类对话框244.5.1 界面设计244.5.2 交互方式254.6 小结26第五章 数据结构模块275.1 定义标准模板库275.1.1设计思想285.1.2 建立标准模板库305.2 文本行结构体335.2.1 文本行存储结构345.2.2 基本操作35第六章 总结36致谢37参考文献38 ContentsChapter1 Introduction11.1 Background11.2 Contents11.3 Developing Tools and Environment11.4 Architecture of Thesis2Chapter2 Design of System32.1 Designing Ideas32.2 List of Functions32.3 Division of Modules42.4 System Structure42.5 Summary5Chapter3 Editing Module63.1 Overview63.2 Overall Design63.2.1 Text Display73.2.2 Definition of Editing Area83.2.3 Flow Chart93.2.4 Design of Logic Data113.2.5 Design of View Updating113.3 Detailed Design123.3.1 Character Keys123.3.2 Tab Key153.4 Summary17Chapter4 Display Module184.1 Definition of Dialog184.2 Design of Dialog Template194.2.1 Dialog Structure194.2.2 Functions of Dialog194.2.3 Process of Dialog214.3 Information Dialog214.3.1 Interface Design214.3.2 Interaction224.4 Input Dialog224.4.1 Interface Design234.4.2 Interaction234.5 Verify Dialog244.5.1 Interface Design244.5.2 Interaction254.6 Summary26Chapter5 Data Structure Module275.1 Template Library275.1.1 Designing Ideas285.2.2 Building of Template Library305.3 TextLine Strcture335.3.1 Storage Structure345.3.2 Base Functions35Chapter6 Summary36References37Acknowledgement38第一章 绪论1.1 研究背景随着科技的发展,计算机的应用领域已渗透到社会的各行各业,改变着我们传统的工作、学习和生活方式,推动着社会的发展。在计算机软件开发领域中,应用开发人员往往关注于业务逻辑的实现,而不是底层机制的实现。经常听到有人说“IT技术日新月异”,其实真正核心的东西是相对稳定不变的,变化的仅仅是它们外在的表现,因此很多计算机技术其实是相通的。深入的理解系统的底层机制,往往可以使我们在学习其他技术的时候能够很快的触类旁通,自下而上的去理解整个系统,更深刻、更透彻。比如MySQL的内存和文件系统的优化,如果对操作系统的虚拟内存和文件系统机制没有深入的了解,那么可能只能在配置参数上做一些猜测性质的调整。因此,了解系统底层机制的实现往往可以让我们站在一个更高的高度上俯视应用程序的软件架构,从而优化它的设计并提高它的执行效率。1.2 研究内容本文研究的主要内容是基于DOS环境的文本编辑器的设计和实现,具体包括以下几个方面:(1) 如何在DOS的字符模式下显示编辑器菜单、对话框等图形界面;(2) 如何使该文本编辑器处理大小超过DOS系统内存的文件;(3) 如何最优化内存的使用率。1.3 开发工具及环境(1) 开发工具:TC2.0Turbo C 2.0集成开发环境是由Borland公司开发的,是基于DOS系统的应用程序,它集成了程序编辑、调试、链接等多种功能。(2) 开发语言:C语言C语言是一种结构化语言,它层次清晰,便于按模块化方式组织程序,易于调试和维护。C语言具有很强的表现能力和处理能力,它具有丰富的运算符和数据类型,便于实现各类复杂的数据结构,它还可以直接访问内存的物理地址,进行位一级的操作。此外,C语言还具有效率高、可移植性强等特点。(3) 运行环境:Microsoft Virtual PCMicrosoft Virtual PC是一个虚拟机程序,可以让用户在一台PC上同时运行多个操作系统,使用它时用户不需重新启动系统,只要点击鼠标就可以打开新的操作系统或是在操作系统之间进行切换。1.4 论文组织结构本文将详细阐述该文本编辑器的编辑功能模块和显示功能模块的设计和开发。本文共分六章,各章的主要内容如下:第一章 绪论:首先介绍了本文的研究背景和意义,然后介绍了本文的研究 内容,接着对本文的结构进行了概述。第二章系统设计:主要介绍系统各个模块的划分以及它们之间的相互关系。第三章 文本编辑功能模块:详细阐述了可显示字符键、Tab键和Ins键的 功能实现。第四章 显示功能模块:首先介绍了对话框的,然后介绍了对话框模板及工作流程,接着举例说明了不同类型的对话框与用户的交互过程的实现。第五章 数据结构模块:介绍了常用数据结构的模板化,比如链表、堆栈等,还介绍了文本行结构体的设计。第六章 总结:总结了论文的主要内容以及对下一步开发的展望。第二章 系统设计本章主要介绍系统的核心设计思想、各个功能模块的划分以及它们之间的相互关系。2.1 设计思想众所周知,DOS是16位的操作系统,在内存的使用上有两个著名的限制,一是64K限制,就是DOS下连续使用的内存最大仅能达到64K,另一个就是640K限制,就是在DOS下实际使用的内存是640K。本文所要研究开发的编辑器需要处理大文件的能力,该文件的大小可能远远超过DOS系统的内存限制,例如,系统管理员需要读取很长的日志文件;程序员需要修改很大的源代码文件,或者检查那种异乎寻常的超大文件,比如用于存储整本词典的文件。如果直接把文件读入内存,则在处理较大文件时速度较慢,而对于超过内存大小的文件,则干脆无法处理。首先,把代码按功能分为多个源文件,并用project来管理,这样可以把源文件的大小限制在64K以内。然后,可以借鉴操作系统的虚拟内存的设计思想,把整个文本划分为若干个逻辑页。虚拟内存机制是建立在程序的局部性原理之上的,即CPU访问存储器时,无论是取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。同理,用户在编辑文本时,编辑区域也都趋于聚集在一个较小的连续区域中。因此,可以把整个文本按一定的分页机制划分为页,只把与用户当前的编辑区域相关的页载入内存, 当用户需要访问的页不在内存中时及时的换入,并把内存中与编辑区域无关的页换出。这样一来,编辑器就具备了处理大文件的能力,2.2 功能设计该文本编辑器支持的功能如表2-1所示:表2-1:编辑器功能列表文本编辑功能可显示字符键,Tab制表键,Enter回车键,Enter回车键,Del删除键,Ins插入字符开关键,方向键,Home行首键, End行尾键,PgUp向上翻页键, PgDn向下翻页键文件操作功能文件新建,文件打开,文件保存查找替换功能在一个文本文件中查找一个词或者字符串,把一个字符串替换成另一个字符串。剪切、复制、粘贴功能文本内容的复制或者移动。文本格式设置设置文本颜色2.3 系统模块划分在这里,把整个系统的功能模块划分如下:(1) 基础数据结构模块1:单链表模版,双链表模版,堆栈,键盘信息结构体,剪切板,页结构体,文本行;(2) 菜单功能模块:加载,新建,保存,另存为等;(3) 编辑功能模块:各个键的响应等;(4) 显示功能模块:菜单,各种类型的对话框显示等,同时显示功能也包括对应着编辑和菜单功能的部分,用户每一次键盘输入都会引起视图的更新。(5) 功能响应模块:根据来自键盘的消息将具体程序控制转接到相应的子模块。(6) 文件操作模块:临时文件的管理,文件的保存和读取等等操作。(7) 初始化模块:程序中必要的一些数据的初始化工作。(8) 资源回收模块:程序结束后需要清理的一些资源使用。各模块的实现过程均以C文件的格式存放在工程目录下的kernel文件夹下,本文涉及的模块主要包括:基础数据结构模块,菜单功能模块,编辑功能模块,显示功能模块,功能响应模块。2.4 系统体系结构图如图2-1,是系统的体系结构图:图2-1:系统体系结构图2.5 小结本章首先介绍了该编辑器的核心设计思想,然后列表展示了该编辑器的主要功能,接着阐述了各个功能模块的划分及各模块之间的相互调用关系。本文的以下章节将详细阐述编辑功能模块中可显示字符键、Ins键和Tab键的编辑功能的实现过程以及显示功能模块中对话框的设计和运行过程。第三章 文本编辑功能模块本章首先系统的介绍了Turbo C环境下文本的屏幕输出方式,在此基础上,进一步阐述对可显示字符键和Tab键、Ins键输入的处理过程的详细设计和实现。3.1 功能概述编辑功能是编辑器最重要的功能,也是实现过程最复杂的功能。该功能模块负责响应键盘输入,更新文本的逻辑内容及显示视图。把用户的键盘输入分为两种类型,一种是可显示字符,包括字母、数字、标点符号和其它常用符号(、&、$等);另一种是不可显示字符,即控制字符,包括Tab键、Enter键、Backspace键、Del键、Ins键、Home键、End键和方向键(、),它们的功能如表3-1所示:表3-1:控制字符键名称作用Tab制表键将光标向右移动tabsize个字符间隔Enter回车键将光标移到下一行的行首Backspace退格键删除当前光标位置的前一个字符,Del删除键删除当前光标所在位置的字符Ins插入字符开关键按一次该键,进入字符插入状态;再按一次,则取消字符插入状态方向键使光标分别向上、下、左、右移动一格Home行首键将光标移至当前行的开头位置End行尾键将光标移至当前行的末尾PgUp向上翻页键用于浏览上一页内容PgDn向下翻页键用于浏览下一页内容3.2 总体设计3.2.1 文本的屏幕输出(1) 文本窗口的定义显示器的屏幕显示方式有两种:文本方式和图形方式。文本方式就是显示文本的模式,它的显示单位是字符而不是图形方式下的象素,因而在屏幕上显示字符的位置坐标就用行和列表示。Turbo C默认定义的文本窗口为整个屏幕,共有80列25行的文本单元。如图3-1所示,规定整个屏幕的左上角坐标为(1,1),右下角坐标为(80,25),并规定沿水平方向为X轴,方向朝右;沿垂直方向为Y轴,方向朝下。每个单元包括一个字符和一个属性,字符即ASCII码字符,属性规定该字符的颜色和强度。Turbo C的显示函数主要包括文本窗口大小的设定、窗口颜色的设置、窗口文本的清除和输入输出等函数。这些函数的有关信息(如宏定义等)均包含在conio.h 头文件中,因此在用户程序中使用这些函数时,必须用include 将conio.h 包含进程序。图3-1:屏幕文本显示坐标Turbo C也可以让用户根据自己的需要重新设定显示窗口,即通过使用窗口设置函数window()定义屏幕上的一个矩形域作为窗口。(2) 文本颜色的设置文本颜色的设置包括背景色和字符颜色(即前景色)的设置,使用的函数及其原型为:设置背景颜色函数:void textbackground( int color );设置字符颜色函数:void textcolor( int color );(3) 窗口内文本的输入输出函数以前版本中的printf(),putc(),puts(),putchar()是以整个屏幕为窗口输出的,它们不受由window设置的窗口的控制,也无法用函数控制它们输出的位置,但是Turbo C提供了三个文本输出函数,它们受窗口的控制,窗口内光标的位置,就是它开始输出的位置,每输出一个字符光标后移一个字符位置,这三个输出函数原型为:int cprintf(char *format, 表达式表);int cputs(char *str);int putch(int ch);它们的使用格式同printf()、puts()和putc()。窗口内的输入函数可以直接使用stdio.h中的getch函数。(4) 有关屏幕操作的函数void clrscr(void);该函数将清除窗口中的文本,并将光标移到当前窗口的左上角。void gotoxy(int x, int y)该函数用来定位光标在当前窗口中的位置。int movetext(int x1, int y1, int x2, int y2, int x3, int y3 );该函数把屏幕左上角为(x1, y1),右下角为(x2, y2)的矩形内文本拷贝到左上角为(x3, y3)的一个新矩形内。3.2.2 编辑区域定义如图3-2,是编辑器运行的界面,编辑器提供给用户的编辑区域是位于整个屏幕中间的一块矩形区域,该矩形区域的属性:左上角(2,3)右下角(79,23)长度 78宽度 21图3-2:编辑器运行界面3.2.3 流程图如图3-3,是处理用户键盘输入的基本流程,该过程主要分为两步,第一步,逻辑更新,主要是对一些相关变量的值的更新;第二步,视图更新,有三种形式:刷新单行、刷新单列以及刷新整个屏幕。 图3-3:基本流程图3.2.4 逻辑数据设计在设计逻辑数据时,需要考虑的问题包括:(1) 如何获得光标所在位置在屏幕上的坐标?(2) 当前光标所在位置是整个文本中的第几行、第几列?由此,设计逻辑数据如表3-2所示:表3-2:逻辑数据名称类型定义currentpagePage用户当前编辑的页currentlineTextLine用户当前编辑的文本行presentrowint光标当前的位置在整个文本中的第几行presentcolint光标当前的位置在整个文本中的第几列startrowint屏幕上所显示的第一行文本在整个文件中位于第几行endrowint屏幕上所显示的最后一行文本在整个文本中位于第几行startcolint屏幕上所显示的第一列文本在整个文本中位于第几列endcolint屏幕上所显示的最后一列文本在整个文本中位于第几列totalrowsint该文本文件包含的文本行的总数3.2.5 视图更新函数设计视图更新包括三种形式的更新:刷新单行、刷新单列及刷新整个屏幕。定义函数refreshline()、refreshcolumn()和refreshscreen()来分别实现单行、单列和整个屏幕的刷新,它们的函数原型如下:void refreshline(int line, int sc, int ec, char *str);刷新屏幕上的一行,参数line表示需要刷新的行在整个文本中位于第几行,参数sc表示从该行的第几个字符开始刷新,参数ec表示刷新到该行的第几个字符,参数str是用来替换原文本的字符串。void refreshcolumn( int column );用来刷新屏幕上的一列,column表示需要刷新的是屏幕上的第几列,它主要是通过循环调用refreshline()函数实现列的刷新。void refreshscreen();用来刷新整个屏幕,它的实现主要也是通过循环调用refreshline()函数。3.3 详细设计3.3.1 可显示字符键可显示字符键包括字母键、数字键、标点符号键和其它常用符号键(如、&、$等),是用户在编辑文本的过程中最常用的键。用户可以在两种模式下输入字符,这两种模式分别是插入模式和改写模式。在插入模式下,编辑器在光标闪烁处插入用户输入的字符;在改写模式下,编辑器把光标后面的字符改写为用户输入的字符。用户可以通过Ins键在这两种模式之间进行切换。(1) 运行效果在初始状态下,屏幕上显示一行文本”abcdefg”,光标在第三个字符c的位置闪烁。如图3-4:图3-4:初始状态在插入模式下输入字符a,则编辑器在b和c之间插入字符a,如图3-5所示:图3-5:插入模式下输入字符a在改写模式下输入字符a,则编辑器把字符c替换为字符a,如图3-6所示:图3-6:改写模式下输入字符a(2) 逻辑更新的算法流程图逻辑更新即更新表3-2中的逻辑数据,如图3-7所示:图3-7:可显示字符键算法流程图(3) 视图更新如果光标位置不在编辑区域矩形的最后一列,则不需要滚屏,只需要刷新当前编辑行。如果光标位置在编辑区域矩形的最后一列,则需要将屏幕向左滚动一列。由于整个编辑区域是左上角为(2,3)、右下角为(79,23)的矩形,首先调用movetext函数屏幕左上角为(3,3),右下角为(79,23)的矩形内文本拷贝到左上角为(2,3)的一个新矩形内,然后调用refreshcolumn()刷新编辑区域的最后一列即可。3.3.2 Tab键Tab键是tabulator key的缩写,其含义是“制表人,制表机,(打字机为制表用的)跳格键”。它最基本的用法就是用来绘制无边框的表格。如图3-8,单词之间的间隔都是按下一次Tab键来实现的。图3-8:Tab键运行效果(1) 存储结构tab键与一般的字母数字键不同,在视图上,它占用了tabsize个字符的位置,因而必须用一种特殊的存储机制来存储它。对于字母数字键,存储的是它对应的ASCII码,而对于tab键,存储的不是它的ASCII码,而是tabsize个-1。(2) 逻辑更新的算法流程图由于tab键存储结构的特殊性,其逻辑更新过程也比可显示字符键更加复杂,如图3-9所示:图3-9:Tab键算法流程图(3) 视图更新由于Tab键在视图上占据了tabsize个字符的位置,而整个编辑区域是左上角为(2,3)、右下角为(79,23)的矩形,因此,假设当前光标的坐标为(x,y),当x + tabsize的值大于79时,就需要滚屏,向左滚动的列数为x +tabsize-79。其他刷新操作与可显示字符键类似。3.4 小结本章首先介绍了Turbo C环境下文本的屏幕输出方式,然后阐述了编辑功能的总体设计,包括逻辑变量的设计以及视图更新函数的设计,接着,详细分析了对可显示字符键、Ins键和Tab键输入后的逻辑更新和视图更新过程。接下来,本文将介绍与用户交互的对话框的设计和实现。第四章 显示功能模块本章首先介绍了对话框的基本概念,然后详细阐述了对话框模板的结构及其工作流程,接着分析了不同类别的对话框与用户交互的方式及过程。4.1 对话框的基本概念在图形用户界面中,对话框是一种特殊的视窗,用来在用户界面中向用户显示信息或接收用户的输入。之所以称之为“对话框”,是因为它使计算机和用户之间构成了一个对话或者是通知用户一些信息,或者是请求用户的输入,或者两者皆有。一个典型的对话框例子是编辑器启动时显示该编辑器作者、版本等信息的欢迎界面,如图4-1所示。当用户按下Enter键后,欢迎界面会自动消失,进入程序的主界面。图4-1:程序启动的欢迎界面不同的用户交互使用不同类型的对话框,在本章中,主要介绍以下三种交互模式的对话框的设计和实现:(1) 信息类对话框:显示用来提示用户的信息;(2) 输入类对话框:接收用户输入作为程序运行中的参数;(3) 确认类对话框:要求用户确认软件将要执行的某一项操作。4.2 对话框模板的设计无论是何种类型的对话框,都是一个窗口,它们有一些共有的属性,例如:窗口坐标、标题等等。此外,它们都是基于显示响应键盘输入释放资源的流程工作的,因此,为了使代码实现复用,首先需要构造一个通用的对话框模板。4.2.1 对话框结构体DialogDialog结构体描述了一些对话框的基本属性,其定义为:typedef structPosition upleft, bottomright; /*对话框的左上角坐标和右下角坐标*/int background, textcolor; /*对话框的背景色和前景色*/const char *msg; /*对话框显示的信息*/enum MenuOperateType optype; /*对话框对应的菜单操作*/在以上定义中,Position是一个表示坐标位置的结构体,其定义为:typedef structint x, y;Position;4.2.2 对话框操作函数在对话框操作函数的设计过程中,主要考虑的问题包括:(1) 如何把当前屏幕的焦点从主程序窗口转移到对话框窗口?(2) 在释放对话框资源后,如何把焦点转回主程序窗口?(3) 在释放对话框资源后,如何恢复之前被对话框遮住的那块矩形文本? TC屏幕操作函数要解决上述问题,首先需要了解TC系统中自带的一些屏幕操作函数:(1) void window(int left, int top, int right, int bottom);该函数定义屏幕上的一个矩形区域作为窗口,其中,(int left, int top)表示窗口左上角的坐标,(int right, int bottom)表示窗口右下角的坐标。窗口定义之后,用有关窗口的输入输出函数就可以只在此窗口内进行操作而不超出窗口的边界。一个屏幕可以定义多个窗口,但由于DOS为单任务操作系统,屏幕焦点(即现行窗口)只能有一个,当需要转移焦点时,可以调用定义那个窗口的window()函数,即可以把那个窗口定义为屏幕的焦点了。(2) int gettext(int x1, int y1, int x2, int y2, void *buffer);该函数把左上角为(x1, y1)、右下角为(x2, y2)的屏幕矩形区内的文本存到由指针buffer指向的内存缓冲区中,当操作成功,返回1;否则,返回0。矩形内文本字符在缓冲区内存放的次序是从左到右,从上到下,每个字符占连续两个字节并依次存放。(3) int puttext(int x1, int y1, int x2, int y2, void *buffer);该函数则是将gettext()函数存入内存buffer中的文字内容拷贝到屏幕上指定的位置。 自定义对话框操作函数(1) void dlginit(Dialog *dlg, Position *upleft, Position *bottomright, int background, int textcolor, const char *str, enum MenuOperateType);初始化Dialog结构体。 (2) void setlastwindow(Position *upleft, Position *bottomright);显示对话框之前,记录当前屏幕的焦点。(3) int showmsgdialog(Dialog *msgdlg);显示信息对话框。(4) char *showinputdialog(Dialog *inputdlg);显示输入对话框,返回用户输入的字符串。(5) int showverifydialog(Dialog *verifydlg);显示确认对话框,若用户输入Y,返回1;否则,返回0。4.2.3 对话框工作流程由于共用一个对话框模板,不同类型的对话框的工作流程是相似的,只在处理用户输入这个步骤中有差别,因此,以对话框Dialog为例,其工作流程如下:(1) 调用函数setlastwindow()保存现行窗口,即当前屏幕焦点所在窗口的坐标;(2) 调用函数gettext()把左上角(Dialog.up, Dialog.left)、右下角(Dialog.right, Dialog.bottom),即对话框所占用的矩形区域内的文本存到buffer指向的内存缓冲区中;(3) 调用屏幕文本输出函数画出对话框界面,例如:描绘对话框边框、输出对话框内的文本信息等。(4) 根据与用户的交互方式处理用户的键盘输入,例如:信息对话框等待接收用户输入回车键;确认对话框等待用户输入Y或N;(5) 调用puttext()函数把buffer指向的内存缓冲区中的文本内容输出到左上角(Dialog.up, Dialog.left)、右下角(Dialog.right, Dialog.bottom)的矩形区域,即对话框所占用的矩形区域;(6) 调用window()函数恢复之前的屏幕焦点。4.3 信息类对话框信息类对话框是一种最简单的对话框,它显示一条信息并仅仅需要信息已读的响应,在本系统中,为用户按下回车键。4.3.1 界面设计图4-1中的欢迎界面就是一个典型的信息类对话框。此外,还有一种信息类对话框是警告信息,通常在用户执行错误的操作时会出现,以此提醒用户。如图4-2所示,由于在DOS系统中文件名的长度必须限制在8个字节以内,因此当用户在创建文件时输入超过8个字符时,系统在屏幕上方输出信息提示用户。图4-2:警告信息对话框4.3.2 交互方式信息类对话框需要得到用户已读信息的响应,即需要用户输入回车键,其算法流程图如图4-3所示:图4-3:信息类对话框与用户交互4.4 输入类对话框输入类对话框请求用户输入相关信息,并把用户输入的信息返回给程序,输出类对话框分为单项输入和多项输入两种。单项输入对话框只要求用户输入一个字符串,返回指向该字符串的指针;多项输入对话框更复杂,有多个输入项目,用户需要使用Tab键来切换当前正在输入的项目,该对话框返回一个指针数组,例如:用户在使用查找替换功能时出现的对话框即为多项输入对话框,用户不但要输入要查找的字符串,还要输入用来替换的字符串。本节将详细介绍单项输入对话框的界面设计和它与用户的交互方式。4.4.1 界面设计如图4-4,是一个典型的输入类对话框,功能是在新建文件时请求用户输入文件名,把该文件名返回给程序。图4-4:输入类对话框4.4.2 交互方式输入类对话框需要获得用户的输入,并以回车键标识输入的结束,以新建文件时输入文件名这个对话框为例,其算法流程图如图4-5所示:图4-5:输入类对话框与用户交互4.5 确认类对话框确认类对话框请求用户确认系统即将执行的操作,用户输入Y或y表示同意执行此操作,用户输入N或n表示不执行此操作,对话框把用户的决策返回给系统,通常以1表示是,0表示否。4.5.1 界面设计一个典型的确认类对话框的例子是要求用户确认是否需要保存文件的对话框,如图4-6所示:图4-6:确认类对话框4.5.2 交互方式确认类对话框与输入类对话框与用户交互的方式是相似的,都需要获得用户的输入,其流程图如图4-7所示,不同的是,确认类对话框只要求得到用户是或否的响应,而且不需要在屏幕上显示用户的输入,其过程比输入类对话框简单的多。图4-7:确认类对话框与用户交互4.6 小结本章首先介绍了在DOS系统下对话框的定义,然后,定义了一个对话框模板结构,并阐述了对话框的工作流程,即绘制对话框界面与用户交互释放对话框资源,接着,举例说明了信息类对话框、输入类对话框和确认类对话框这三种主要类型的对话框与用户交互过程的实现。在编辑器运行过程中,还使用到了一些更复杂的对话框,例如多项输入的查找替换对话框以及颜色选择对话框等,它们都是基于以上三种基本类别的对话框的基本原理和实现过程,由于本文篇幅限制,在此不再一一列举。下一章,本文将要介绍系统开发过程中的一些公用的数据结构设计。第五章 数据结构模块本章主要介绍抽象数据结构(单链表、双链表、堆栈)模板库的建立以及文本行结构体的设计。5.1 定义标准模板库在用C语言开发软件的过程中,经常会用到一些经典的数据结构,例如链表、堆,然而由于具体需要的不同,经常会选择不同的数据类型,因此不得不常常重复着一些为了实现向量、链表等结构而编写的代码,这些代码都十分相似,只是为了适应不同的数据类型而在细节上有所出入。例如,创建一个整型单链表,定义节点类型如下:typedef struct Nodeint data;struct Node *next;Node, *List;实现的基本操作包括:(1) int listinit( List *L );将L初始化为空链表;(2) int getdata( List *L, int i );返回链表L中第i个数据元素的值;(3) int insert( List *L, int i, int e );在L中第i个位置之前插入新的数据元素e;(4) int del( List *L, int i );删除L的第i个数据元素;(5) int clearlist( List *L );将L置为空链表;显然,这不是一个通用的链表,在实际的应用中,其中的数据元素可能属多种类型,例如,如果用户需要创建一个char型的链表,则他不得不重写其结点定义以及所有的实现代码。因此,需要用C语言实现通用型的数据结构,即可以处理多种类型的数据,而不必为每一种类型重写代码,可以借鉴C+中模板的设计思想。模板被誉为C+最强有力的机制之一,它是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而减少源代码量并提高代码的机动性而不会降低类型安全。本节将详细介绍如何用C语言实现数据结构模板。5.1.1设计思想首先,声明一个联合Type,其成员包括用户可能使用到的数据类型。在这里,由于篇幅限制,仅列举int,char和void *三种类型。值得注意的是,用void *可以指代所有类型的指针,即你可以把任何类型的指针可以赋值给void指针,也可以把void指针转换成任何类型,当然,必须是它实际指向的类型。用void指针增加了程序的灵活性。联合体Type类型定义如下:typedef unionvoid *pointer;int integer;char character;Type;接着,重新定义结点类型Node,无论是何种类型的链表,都将其数据域的数据类型声明为Type。结构体Node的定义如下:typedef struct NodeType data;struct Node *next;Node, List;然后,修改定义在单链表上的各种操作,使其能够对用户隐藏数据元素的具体类型。在这里,可以通过把具体类型的数据元素包装在Node结构体中来实现这种隐藏。修改后的各种操作定义如下:(1) int listinit( List *L );将L初始化为空链表;(2) Node *getdata( List *L, int i );返回链表L中第i个结点;(3) int insert( List *L, int i, Node *n );在L中第i个位置之前插入新的结点n;(4) int del( List *L, int i );删除L的第i个数据元素;(5) int clearlist( List *L );将L置为空链表;现在,就可以用这个“万能”链表来处理所有类型的数据了。例如,建立一个char型单链表,并插入元素a,其具体实现代码如下:List *charL = ( List * )malloc( sizeof( List ) );Node *n = ( Node * )malloc( sizeof( Node ) );( n-data ).character = a;n-next = NULL;insert( L, 0, n );再比如,如果想要建立一个int型单链表并插入元素1,这个单链表依然是适用的,其具体实现如下:List *intL = ( List * )malloc( sizeof( List ) );Node *n = ( Node * )malloc( sizeof( Node ) );( n-data ).integer = 1;n-next = NULL;insert( L, 0, n );改进后的设计解决了数据结构的通用

温馨提示

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

评论

0/150

提交评论