哈工大计算机系暑期实践项目UCE.doc_第1页
哈工大计算机系暑期实践项目UCE.doc_第2页
哈工大计算机系暑期实践项目UCE.doc_第3页
哈工大计算机系暑期实践项目UCE.doc_第4页
哈工大计算机系暑期实践项目UCE.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1 35 Ultimate Chinese Editor 文档文档 Documents of UCE 1 0 哈尔滨工业大学计算机系哈尔滨工业大学计算机系 Last modified on 2002 9 12 2 35 目录目录 Contents 关于本软件关于本软件 3 软件描述 3 背景 3 软件的主要特色 4 参与人员 本软件 4 功能模块功能模块 4 内核模块 4 键盘控制模块 6 汉字输入法模块 7 UNDO模块 8 MESSAGEBOX对话框模块 8 显示输出模块 9 文件列表文件列表 9 功能模块函数列表功能模块函数列表 10 LIST C 10 EDITOR C 11 BITMAP H 12 I How come 12 II Crack it 12 III First Use the Power 15 IV Future Improvement 16 WINFUNC H 16 I Design Purpose 16 II The Data Structure 17 II The Functions 19 III Apply The Header 21 GOUTPUT H 22 IMD H 24 功能函数的算法说明功能函数的算法说明 部分部分 25 APPENDCHAR 在末尾追加一个字符 25 VOID INTERRUPT FAR CURSORHANDLER 显示光标的时间中段句柄的函数 25 VOID SCROLLWINDOWUP UNSIGNED INT N 从第N行后显示区域下滚 26 VOID GETHZ CHAR INCODE CHAR BYTES 获取汉字字模 28 VOID PUTASCCOLOR 在特定位置用特定颜色显示 ASCII 字符 28 3 35 VOID PUTCNCOLOR 在特定位置用特定颜色显示汉字字符 28 问题解决及存在的问题问题解决及存在的问题 30 个人感受个人感受 30 虚空中的执著 30 感受团队 ENJOY TEAMWORK 31 经验及教训经验及教训 32 致谢致谢 32 附录附录 32 西文方式下挂接 UCDOS 5 0 中的万能汉字输入法 32 4 35 关于本软件关于本软件 软件描述软件描述 软件中文名称 中文编辑器 软件英文名称 Ultimate Chinese Editor 运行环境 DOS 环境 编写语言 C 编译环境 Turbo C V1 0 版本 Version 1 0 背景背景 本软件是哈尔滨工业大学计算机系 2001 级本科生的年级作业作品 2001 年 7 月 和为等计算机系 2001 级 7 名本科生在关毅关毅老师的领导下组成开发小组 利用假期时间完成两个题目 通讯录和编辑器 本软件即是编辑器小组的作品 此次活动的目 的是 通过年级大作业形式的活动来培养互相协作 互相配合的团队精神 通过活动中的 实际练习来加深已学知识的理解 同时又增加了学习新知识的乐趣 如果加学分就更好了 关老师考虑到 2001 级本科生所学的专业课有限 高级语言课程仅涉及 C 语言 要求软件 的所有代码用 C 编写 这个编辑器的所有代码可在 TurboC v1 0 中编译通过 Turbo C V1 0 是 Borland 公 司的产品 编辑环境比 TurboC2 0 有较大的改善 而且对 C 支持的非常好 故此成为我们 的首选 而且我们还用工程管理 使各自的模块相对独立 方便管理 软件的主要特色软件的主要特色 Ultimate Chinese Editor V1 0 具有以下几方面特色 较强的处理中文的能力 对中文整体识别 您不会看到 半个汉字 引起的屏幕 混乱 能够脱离汉字系统 有独立的输入法 让您在没有汉字系统的情况下能够自由录 入 编辑文本 支持块操作 有比较友好的界面 有提示对话框 帮助您更好的编辑 提供源代码 期望与您交流 贻笑大方了 有详细的文档 值得一看哦 不是吹牛吧 5 35 参与人员 本软件 参与人员 本软件 杨碧辉 0103111 班 负责显示模块部分frozenwind 陈奂章 0103112 班 负责菜单和界面部分hanzac 高立琦 0103113 班 负责数据操作 管理模块部分gao lq 功能模块功能模块 内核模块内核模块 内核是对数据处理的核心程序 著名的计算机科学家沃斯 N Wirth 提出了 数据结构 算法设计 程序 确定了合适的数据结构 设计出精美的算法 我们的程序的功能的实现 才能变为可能 我们首先分析了一下编辑器的数据结构特点 1 不定性 编辑器的行列是不定的 即我们不能预先知道要处理多大的文本 2 不规则性 每一行的数据量不定 不能用一个固定 通用的数组来存放 3 非连续性 编辑器需要频繁的插入 删除操作 如果用固定 连续的空间存放 势必降低运算的效率 这些特点是我们排除了数组 队列等数据结构类型 我们的目光锁定在链表上 链表 具有可以动态添加 删除节点 不需要连续的内存区域等特点 适用于编辑器的数据要求 我们设计以每个字符为单位的基本结构 为了方便处理中文 我们将一个汉字看作一个中 文自符 字符单元的结构如下 struct CHAR NOTE char c c1 CHAR NOTE pNext pPre 若干个字符节点连在一起便形成了一行 行链表示意图 我们又设计了一个行的结构体 6 35 struct LINE NOTE int Len int MaxCaretx CHAR NOTE pHead pEnd LINE NOTE pNext pPre int Bx1 Bx2 用来管理一行的链表 如 pHead 用来记录链表表头的指针 pEnd 用来记录链表最末一 个字符的指针 编辑器的核心任务就是维护这样的一个复杂的 双链表 文件 LIST C 中提供许多函数 如 InsertAfter AppendChar SeekChar 等函数来维护双链 表 函数的功能在模块功能中有详细介绍 7 35 键盘控制模块键盘控制模块 键盘控制模块示意图 主干程序采用 while 循环 如代码 while 1 do k GetInputWord s 取当前输入法模块返回的字串 while k 0 if k 0 字串有效 p s while p AddChar p else 为不可显示按键 key i k if key c 0 0 flag 1 switch key i 控制键 case C Y case C Z case C S 8 35 if flag switch key c 0 case ENTER case BACKSPACE KeyBackspace break case ESC default AddChar key c 0 break else switch key c 1 功能键 case UP case DOWN 每一按键对应一个处理模块 各个处理模块调用 LIST C 中的模块并协调显示的数据和内存 中的数据的一致性 比如 KeyUp KeyDown 为控制光标键的处理模块 改动内存当前 字符的指针并改变屏幕上当前光标的位置 汉字输汉字输入入法模块法模块 由于我们的编辑器独立于汉字系统 且又要处理中文 故而我们必须提供中文输入法 模块以供用户来输入中文 汉字的输入是通过 bioskey 取得键盘的扫描码 根据键盘的扫 描码算出汉字的输入码 最后根据输入码从字库中查找相同的输入码 取得汉字的内码来 实现的 我们采用 UCDOS5 0 中的 IMD 输入法码表文件 该码表文件有几个优点 1 UCDOS 中广泛支持 提供众多码表文件 2 码表文件结构清晰 3 输入法算法通用 可以挂接多种输入法 关于输入法码表文件的结构 输入法算 法 请详见附录 这部分资料我们取自网络 9 35 Undo 模块模块 该模块提供简单的 Undo 功能 能恢复被删除的 200 个字符 并将恢复的字符插入当 前位置 Undo 模块采用循环队列的数据结构来管被删除节点的信息 一般的 队列遵循先进先 出的原则 FIFO First In First Out 普通的队列在一个元素出列时 期它的元素都要向前 移动一个位置 在内存中表现为所有单元的元素向前移动一个位置 这样势必会增加操作 时间 我们采用循环队列 因为循环队列采用两个指针 Head 和 Tail 分别指向队列的 第一个和最后一个元素 通过修改两个指针实现 先进先出 节省了操作时间 添加一个 元素时 Tail Tail mod maxsize 1 删除一个元素时 Head Head mod maxsize 1 当 Head 与 Tail 相等时 表示该队列为空 当 Head Tail mod maxsize 1 时 队列为满 环形队列示意图 MessageBox 对话框模块对话框模块 在编辑器中 我们增加了对话框模块 如图所示 对话框模块存放在 MESSBOX H 和 MESSBOX C 文件中 主要调用函数声明如下 int MessageBox char messtr char title MESSAGETYPE choice 参数说明 char messstr 为信息字符串 不能为空 10 35 char title为标题字符串 可以为空 或 NULL MESSTYPEINFO choice为按钮类型选择参数 共有以下几种选择 Q YESNO 1Q YESQ YESNOCANCEL IN YESNOIN YESIN YESNOCANCELIN OK IM YESNOIM YESIM YESNOCANCEL E YESNOE YESE YESNOCANCELE OK INPUT 其中 Q xxx 为疑问对话框 Questioning IN xxx 为信息对话框 Information IM xxx 为重要信息对话框 Important information E xxx 为错误对话框 Error 特别 地 INPUT 为输入对话框的入口参数 返回值说明 如果选择左边第一的按钮 返回 1 左边第二个按钮 返回 2 以此类推 显示输显示输出出模块模块 显示输出模块主要采用直接写视屏内存的方法来实现 通过视屏的端口 0 x3ce 0 x3cf 0 x3c4 0 x3c5 和视屏的内存地址 0 xa0000000 的直接操作来组成视屏显示的一系 列函数 虽然通过直接写视屏的方式来实现的函数有一些移植性问题 但是大大提高了显 示的速度 在鱼和熊掌不可兼得的情况下只好采取这样的措施 文件列表文件列表 LIST C内核数据操作函数库 CURSOR C光标操作函数库 EDITOR C键盘操作 IMD C输入法操作函数库 MAIN C主过程 OPENDLG C 打开 对话框的程序文件 UNDO CUndo 的程序文件 GOUTPUT H汉字显示的函数文件 WINFUNC H窗口绘制的函数文件 FACE C界面的程序文件 HZK16汉字库文件 XMS OBJ OBJ WB IMD五笔输入法文件 PY IMD拼音输入法文件 11 35 功能模块函数列表功能模块函数列表 LIST C 该文件中提供如下的功能函数 列表 函数名称参数声明功能介绍 InitDocument 初始化文档 void InitLinenote LINE NOTE ln void InitDocument void AppendLine void AppendChar char c char c1 int AppendString const char s int option添加一个字符串 option 为 1 在末尾添加 option 为 0 在当前位置添加 void ReleaseAll 释放所有节点 int NextLine 当前行指针下移 int PreLine 当前行指针上移 int GetLineLength 取得当前行的长度 int GetLines 取得总行数 int SeekLine int LineNo 按行号移动指针 int SeekLineTail 移动到最末行 int SeekLineHead 移动到首行 int SeekHead 移动到当前行的开始 int SeekTail 移动到当前行的最末节点 int NextChar 下一个字符 int PreChar 前一个字符 int SeekChar int x 按标号移动指针 int IsEmptyLine 测试该行是否为空 void InsertAfter char c char c1后插一个节点 void InsertBefore char c char c1前插一个节点 void DeleteBefore 删除前一个节点 void DeleteChar 删除当前节点 void DeleteHead 删除一行最先的一个节点 void DeleteTail 删除一行最后的一个节点 void DisplayLine 显示一行 int Free CHAR NOTE p 释放节点空间 int WriteTxt char filename写入文件 void InsertLineAfter 在当前行后插一行 void EnterLine 在当前实现换行功能 即把 当前字符以后的字符下移一 行 12 35 void DeleteCurrentLine N A删除当前行 void Delete CHAR NOTE pChar删除当前字符 int Undo N A实现 Undo 功能 void SetBlock int x1 int y1 int x2 int y2设置块 void ClearBlock N A清除定义的块 其中 Document 是由 DOCUMENT 的结构体定义的变量 DOCUMENT 定义如下 struct DOCUMENT type LINE NOTE pHead LINE NOTE pTail LINE NOTE pCur 当前行的指针 CHAR NOTE pCChar 点前字符指针 int Caretx int Lines 其中 pCur 指向当前接受操作的一行 pCChar 指向当前行中接受操作的一个字符 若为 NULL 则指向该行的最末 SeekChar NextChar PreChar SeekLine NextLine PreLine 等函数都是设定 pCChar 和 pLine 的函数 一些插入 删除的函数要求在之前将 pCur 和 pCChar 设置好 EDITOR C 函数名称参数声明功能介绍 void DisplayAll int Lines 显示当前页的模块 void KeyUp 光标键控制模块 void KeyDown void KeyLeft void KeyRight void KeyEnter 回车换行控制模块 void KeyEsc ESC 键控制模块 void KeyCtrl Y 删除一行 Ctrl Y 控制模块 void KeyPagedown 翻页控制模块 void KeyPageup void KeyF3 快控制模块 void KeyF4 void KeyF5 void KeyBackspace 回退键控制模块 void KeyDelete 删除键控制模块 void KeyHome 将光标移到行首 void KeyEnd 将光标移到行末 void KeyCtrl Z Undo 模块 int QuitBox 退出询问模块 13 35 int SaveBox 保存文件对话框 void CheckXY 检查坐标函数 void AddChar char c 添加一个字符模块 void AddString char s 添加字符串模块 void EditorInit 编辑器初始化模块 void Processor 编辑环境的主要处理模块 int ScrollDown int n 滚屏函数 int ScrollUp int n void Gotoxy int x int y 移动光标函数 void SetBlockStart 设置块的起始和终点模块 void SetBlockEnd void MakeBlock 生成一个块 int Load char Filename 读入一个文件 BITMAP H I How come 当我们在设计图形按钮和菜单功能的时候 首先考虑使用即时绘图来实现各种动态效 果 然而即时绘图有很多缺憾 在程序中加入鼠标支持后 即时绘图会受鼠标的影响 具体就是鼠标指针也是位 图 在绘图时可能鼠标指针会遮盖部分区域导致绘图函数不能正常工作 从而留 下这些区域没有正常显示 除非经常刷新 绘图函数是通过一个一个像素画到屏幕上去的 可见效率是比较低的 因此 我们需要有能够快速地把图片显示到屏幕上 通常有两种做法 1 直接写入屏 幕缓冲区 但使用了 Turbo C C 的图形库之后就不行了 我们这个程序已经使用了图形 库 再更改就太 2 使用 Turbo C C 提供的一些直接写屏的函数 getimage putimage imagesize 这些函数是能够实现动画效果的 但是我的想法是能够动 态的生成菜单项 即根据菜单项中字符串的大小来决定菜单项的大小 于是就考虑自己来 生成 Turbo C C 使用的 Bitmap Buffer II Crack it 要直接生成 Bitmap Buffer 必然需要了解它的结构和各方面的细节 然而 Borland 公 司从来就没有仔细的描述 getimage 函数所使用的图形缓冲 只是给出前两个字分别是图片 的宽和高 没办法了 破解吧 也好过过做个软件黑客的瘾 呵呵 14 35 首先 做个程序将 16 种色素分别画到屏幕上 原为竖立的 现将它横过来便于显示 将它用 getimage 保存到一块内存区域中 并且一个字节一个字节地显示出来 00000f00 图片的宽 width 和高 height 00000000 Palette 0 默认为 BLACK 00000080 Palette 1 BLUE 00008000 Palette 2 GREEN 00008080 Palette 3 CYAN 00800000 Palette 4 RED 00800080 Palette 5 MAGENTA 00808000 Palette 6 BROWN 00808080 Palette 7 LIGHTGRAY 80000000 Palette 8 DARKGRAY 80000080 Palette 9 LIGHTBLUE 80008000 Palette 10 LIGHTGREEN 80008080 Palette 11 LIGHTCYAN 80800000 Palette 12 LIGHTRED 80800080 Palette 13 LIGHTMAGENTA 80808000 Palette 14 YELLOW 80808080 Palette 15 WHITE 0000 结束字 明白了吗 Turbo C C 定义了 16 种调色板颜色通过四个字节来表示 哪种颜色使用 哪些字节一目了然吧 这些是通过一条竖直的 16 色线得到的 那么画一条横线的情况会是 怎么样呢 好 首先画一条 8 个像素的蓝色横线 再次用 getimage 的方法将缓冲区的字节都显示出来 07000000 同上 但这次宽是 7 1 个像素 高为 1 个像素 000000FF 看到了吧 对比上文 蓝色像素只同第四个字节相关哦 0000 15 35 通过以上的例子 我们已经对 Turbo C C 的图形缓冲区有了初步的了解 接下来 嗯 当然是更深入的研究 呵呵 我们要从一个井底之蛙变成一只活蹦乱跳的青蛙哦 OK Let s go 通过再次的试验 我们将蓝色横线伸长为 16 个像素 或者其它大于 8 个像素也可 主要用于验证 我们会发现缓冲区变为 0F000000 宽为 15 1 个像素 000000000000FFFF 奇怪吧 为什么呢 0000 呵呵 这就是 Borland 公司的大师们设下的陷阱哦 一不小心就会迷失方向 其实那 是相当容易的一个问题 那就是 等一下 别急 让我们来具体探讨一番 首先 在图形缓冲区中 像素信息是一行一行记载的 每一行又由许多组数据组成 每一组数据由四个字节组成 并且一组数据可以保存 8 个像素 那么 每四个字节又是如 何保存 8 个像素的信息的呢 从上文可以知道 每一种调色板颜色在这四个字节中对应特 定的几个字节 而且一组数据中的第一个像素在对应字节上的第一位设为 1 第二个像素 在第二位设为 1 以此类推 若还搞不明白 请看下面的图示 00 第一个字节 00 第二个字节 00 第三个字节 FF 第四个字节 第四个字节全赋值为 1 说明横向连续画 8 个蓝点 如果有颜色不相同的像素彼此交错呢 呵呵 很简单 也是按照这个规律 第几个像素就在其对应字节的第几位上设为 1 其次 各组像素信息设置好以后 需要将每组的四个字节交错排列 也就是先第一组 的第一个字节 第二组的第一个字节 第一组的第二个字节 第二组的第二个字节 第一组的第三个字节 第二组的第三个字节 以此类推 再次 当一行信息处理完成后 不管其是否有多余 都重新建立新的一行 总之 缓 冲区的每一行都是互不相关的 16 35 至此 Turbo C C 的图形缓冲区中像素信息在横向和纵向上的表示方法 我们都已经 搞清楚了 现在 我想大家都有点摩拳擦掌了吧 让我们来小试身手 下面是一张简单的 图片 分辨率是 16 5 0f000400 注意宽和高分别为原图片减 1 0efb0efb0efbffff 7efb7efb7efbffff 782078207820ffff 7efb7efb7efbffff 0efb0efb0efbffff 0000 这个例子能充分理解了吗 先用 2 进制编码 再转成 16 进制 好 我们继续我们的 征程 III First Use the Power 通过上面的 潜心研究 之后 我就开始动手编了一系列的函数来处理 Turbo C C 的 图形缓冲区 还有个函数直接将 Windows 的 BMP 文件 这个格式最简单嘛 转成图形缓 冲区的格式 以便直接调用 putimage 将其显示在屏幕上 以下是一些函数的说明 1 1 void far LoadImage char pszFileName 将文件名为 pszFileName 的 16 色 BMP 文件装载到图形缓冲区 返回值为图形缓冲区 的指针地址 注意 ceil 宽度 8 4 高度 6 的大小要求不能超过 64KB 2 2 void SetPalette FILE pFile 根据 16 色 BMP 文件的调色板来设置 VGAHI 模式下的调色板 pFile 为文件句柄的指 针 3 3 void ConvertLine BYTE pbBMPLine BYTE pbLine BYTE bBMPLineSize BYTE bLineSize 将一行 BMP 像素信息转成图形缓冲格式 1 pbBMPLine 为 BMP 文件一行数据的指针 17 35 2 pbLine 为该行图形缓冲区的指针 3 bBMPLineSize 为 BMP 文件该行数据的字节数 4 bLineSize 为该行图形缓冲区的字节数 4 4 void ConvertPixels BYTE pbBMPGroupInfo BYTE pbGroupInfo BYTE bBMPGroupSize 将一行中的一组 BMP 像素信息 8 个像素 转换成图形缓冲格式 1 pbBMPGroupInfo 为 BMP 文件该行中一组像素数据的指针 2 pbGroupInfo 为该组图形缓冲区的指针 3 bBMPGroupSize 为 BMP 文件该组数据的字节数 由于 BMP 文件最后一组像素 是实际的字节数 即 2 个像素每字节 然而图形缓冲区无论一组有多少像素 小于等于 8 个 都是四个字节 故要设定 BMP 文件在该组像素数据的字节数 5 5 void far CreateBuffer WORD wWidth WORD wHeight BYTE bBkColor 根据给定的宽度 wWidth 高度 wHeight 来创建一个图形缓冲区 背景色是 bBkColor 所指定的颜色 注意 ceil 宽度 8 4 高度 6 的大小要求不能超过 64KB IV Future Improvement 以后可以针对 Turbo C C 的图形缓冲区 编写一系列的绘图函数 如画点 画线 画圆等等 有了这些函数 我们就可以动态地修改缓冲区 即时地改变缓冲区的内容 以 便能够用 putimage 轻而易举地直接把改变的画面显示到屏幕上 相信这样做还是有一定的 应用价值的 呵呵 只是现在 Windows 如日中天 托胎于 Dos 却又大义灭亲 而 Dos 已经无人问津了啊 WINFUNC H I Design Purpose 在 遥远 的过去 Dos 下的编辑器很少有漂亮的图形界面 而现在 我们习惯了 Win dows 下花哨绚丽的界面 回过头来制作 Dos 下的文本编辑器 不来点图形化的见 面 难免有点对不起我们的视网膜 至少是有点不习惯吧 于是 我们决定制作一个在 Turbo C C 的图形模式 VGAHI 640 480 16 色模式 下的中文图形编辑器 时下 流行模块化 面向对象化的程序设计方法 但我们是用 C 语言来编写这个软件 就不可能大量地使用 C 的面向对象的要素 因此 我就只是设计了这个头文件 里面包 含了 窗体 按钮 菜单的结构 以及对这些对象操作的一系列函数 18 35 II The Data Structure 由于我使用了一些面向对象的思想 因此也不免要建立包含这些对象具体属性的结构 下面是我建立的数据结构以及它们的介绍 1 窗体结构 struct Window WORD wX 左上角 X 坐标 WORD wY 左上角 Y 坐标 WORD wWidth 宽度 WORD wHeight 高度 BYTE bColor 前景色 BYTE bBackColor 背景色 BYTE bTopColor 上边框颜色 BYTE bBottomColor 下边框颜色 BYTE bLeftColor 左边框颜色 BYTE bRightColor 右边框颜色 typedef struct Window WINDOW typedef struct Window PWINDOW 2 按钮结构 struct Button char pszTitle 名称 WORD wX 左上角 X 坐标 WORD wY 左上角 Y 坐标 WORD wWidth 宽度 WORD wHeight 高度 BYTE bColor 前景色 BYTE bBorderColor 边框颜色 BYTE bBackColor 背景色 BYTE bMouseOver 判断鼠标是否在按钮上 struct Button pBack 上一个按钮指针 struct Button pNext 下一个按钮指针 struct Menu pMenu 对应的菜单指针 typedef struct Button BUTTON 19 35 typedef struct Button PBUTTON 按钮数据结构示意图 按钮 1 按钮 2 按钮 3 按钮 N 3 菜单项结构 struct MenuItem char pszTitle 名称 void far pFunction 包含的指向函数的指针 struct MenuItem pNext 下一个菜单项指针 typedef struct MenuItem MENUITEM typedef struct MenuItem PMENUITEM 4 菜单样式结构 struct MenuStyle BYTE bColor 前景色 BYTE bBorderColor 边框颜色 BYTE bBackColor 背景色 BYTE bItemColor 菜单项颜色 typedef struct MenuStyle MENUSTYLE typedef struct MenuStyle PMENUSTYLE 5 菜单结构 struct Menu WORD wWidth 宽度 WORD wHeight 高度 BYTE bNo 当前指向第几个菜单项 BYTE bNum 菜单项的数量 BYTE bShown 判断菜单是否被显示 struct MenuStyle pStyle 对应的菜单样式指针 struct MenuItem pFirst 指向第一个菜单项 void far pCovered 菜单所覆盖的屏幕缓冲的指针 void far pLightBar 菜单项亮条图形缓冲的指针 20 35 typedef struct Menu MENU typedef struct Menu PMENU 菜单数据结构示意图 菜单 1 菜单项 1 菜单项 2 菜单项 N 菜单样式 菜单 2 菜单样式可以为多个菜单共享 II The Functions 建立了数据结构之后 就着手开始大刀阔斧地进行编写函数的最后攻坚战了 以下是 一系列的函数 1 窗体函数 void CreateWindow char pszTitle PWINDOW pWindow int hasStatusBar 根据给定的窗体标题 定义好的窗体结构来创建一个窗体 并显示在屏幕上 1 pszTitle 为窗体的标题 2 pWindow 为窗体结构的指针 3 hasStatusBar 决定窗体是否带有状态栏 void CopyWindow PWINDOW pWindow 将所给窗体所将要覆盖的屏幕区域保存到一个图形缓冲区 pWindow 为所给窗体的 指针 返回值为指向该图形缓冲区的指针 void HideWindow PWINDOW pWindow void pCovered 将显示的窗体隐藏起来 1 pWindow 为所要隐藏的窗体 2 pCovered 为预先保存的屏幕区域 2 按钮函数 void CreateButton PBUTTON pButton 根据定义好的按钮结构来创建一个按钮 并显示在屏幕上 pButton 为按钮结构的 指针 21 35 PBUTTON AddButton char pszTitle PBUTTON pButton PMENU pMenu WORD x WORD y BYTE bColor BYTE bBorderColor BYTE bBackColor 增加一个按钮在一个按钮链表 双向链表 中 1 pszTitle 为所加按钮的名称 2 pButton 为按钮链表中的前一个按钮 3 pMenu 为所加按钮所对应的菜单的指针 4 x 为所加按钮左上角的 X 坐标 5 y 为所加按钮左上角的 Y 坐标 6 bColor 为所加按钮的前景色 7 bBorderColor 为所加按钮的边框颜色 8 bBackColor 为所加按钮的背景色 函数返回值为所增加的按钮的指针 PBUTTON SearchButton char pszTitle PBUTTON pButton 根据给定的字符串 在按钮链表中搜索所需的按钮 1 pszTitle 为要搜索按钮的名称 2 pButton 为按钮链表中任意一个按钮皆可 函数返回值为所需按钮的指针 void SetButtonUp PBUTTON pButton 将 pButton 所指向的按钮设置为按钮浮起状 void SetButtonDown PBUTTON pButton 将 pButton 所指向的按钮设置为按钮按下状 void SetButtonBack PBUTTON pButton 将 pButton 所指向的按钮设置为原状 PBUTTON ChooseButton char pszTitle PBUTTON pButton PBUTTON pBtnHead 根据给定的字符串 将按钮链表中的指定的按钮设置为浮起状 并将对应的菜单都 显示出来 这是用来实现菜单功能的函数 1 pszTitle 为要搜索按钮的名称 2 pButton 为当前已经选定的按钮 需要将其恢复原状用 否则置为 NULL 3 pBtnHead 为按钮链表中任意一个按钮的指针作为头指针 函数返回值为新选择的按钮指针 PBUTTON GoButtonLeft PBUTTON pButton 将按钮和菜单选择向左移动 pButton 为当前显示的按钮 这也是用来实现菜单功 能的函数 PBUTTON GoButtonRight PBUTTON pButton 将按钮和菜单选择向右移动 pButton 为当前显示的按钮 这也是用来实现菜单功 22 35 能的函数 3 菜单函数 void DisplayMenu PMENU pMenu PBUTTON pButton 显示所指定的菜单 1 pMenu 为菜单的指针 2 pButton 为对应菜单的按钮的指针 用来决定菜单的坐标 void HideMenu PMENU pMenu PBUTTON pButton 隐藏所指定的菜单 1 pMenu 为菜单的指针 2 pButton 为对应菜单的按钮的指针 用来决定菜单的坐标 PMENUITEM AddMenuItem char pszTitle PMENU pMenu void far pFunction 根据给定字符串作为菜单项名 增加一项菜单项 1 pszTitle 为菜单项名 2 pMenu 为菜单项所在的菜单的指针 3 pFunction 为函数的指针 用以实现菜单项的功能 函数返回值为新增加的菜单项的指针 void SelectMenu PMENU pMenu PBUTTON pButton int iNo 选择菜单的某一菜单项 即将光条移到该菜单项 1 pMenu 为菜单项所在菜单的指针 2 pButton 为菜单对应的按钮的指针 用以给出菜单的坐标 3 iNo 决定第几个菜单项 void UnSelectMenu PMENU pMenu PBUTTON pButton int iNo 取消菜单项的选择 除去光条 各参数同上 void GoMenuUp PMENU pMenu PBUTTON pButton 将菜单的光条向上移动 1 pMenu 为所在菜单的指针 2 pButton 为菜单对应的按钮的指针 用以给出菜单的坐标 void GoMenuDown PMENU pMenu PBUTTON pButton 将菜单的光条向下移动 各参数同上 void ClickMenu PMENU pMenu PBUTTON pButton 实现当前光条所在菜单项的功能 菜单项结构所含的函数 各参数同上 23 35 III Apply The Header 以上将结构和函数都一一给大家 观赏 了一番 不来点实际的总是不完满的 对吗 下面 我为编辑器所制作的界面 face c 就是这些的实际应用 1 各常量的定义 由于界面结合了键盘操作 所以定义了一些键盘键码 2 全局变量的定义 1 MainWin 为编辑器的主窗体 2 AboutWin 为关于窗体 3 MenuStyle 为菜单样式 4 MenuFile MenuEdit MenuSearch 为各菜单 5 pBtnHead 为按钮链表的头指针 6 pCurrentBtn 代表当前选择的按钮 7 pCurrentMenu 代表当前显示的菜单 3 创建编辑器的界面 1 void SetMenus void 函数用于建立各菜单 使用 AddMenuItem 函数来添加各菜单项 具体使用参照前面的函数说明 2 void SetButtons void 函数用于建立按钮链表 使用 AddButton 函数将所要添加的按钮组成一个双向链表 便于按钮的操作 3 int InitEditorInterface void 函数用于启动编辑器的界面 4 界面的操作与管理 原本还加入了鼠标的支持 mouse h 由于 Windows 2000 下 DOS 图形模式 下 鼠标指针不能正常显示 而且也没有比较好的解决方法 还有就是鼠标的操作也 比较麻烦 这也是很重要的一条啊 呵呵 因此 界面的操作仅限于键盘操作 键盘的操作应用了消息的循环方法 通过 kbhit 检测是否有按键消息 若有 则 使用分支结构来处理各个消息 按键健码 5 主要就是这些了 24 35 GOUTPUT H 功能介绍 参数说明 void InitialzeGraph void 初始化整个图形输出函数库 void FinishMission void 图形输出函数库的析构函数 char far ObtainAddress void 获得 ROM 中 ASCII 码的地址 void DisableCursor void 禁止光标的显示 void EnableCursor void 允许表表的显示 void ShowCursor unsigned int x unsigned int y x y 分别为光标左 上角的 x 和 y 坐 标 显示光标 void RecoverCursor unsigned int x unsigned int y x y 分别为光标左 上角的 x 和 y 坐 标 恢复光标显示位置的图像 void interrupt far CursorHandler 显示光标的时间中段句柄的函数 int Locate unsigned int x unsigned int y x y 分别为光标左 上角的 x 和 y 坐 标 坐标定位 int CursorLeft void 光标左移 int CursorRight void 光标右移 int CursorUp void 光标上移 int CursorDown void 光标下移 unsigned int GetScreenX void 获取光标 x 轴位置 unsigned int GetScreenY void 获取光标 y 轴位置 void SetSpaceLine unsigned int n n 为行数清第 n 行 void SetSpaceClientLine unsigned int n n 为列数清当前行第 n 列后的所有字符 void ScrollWindowUp unsigned int n n 为行数显示区域上滚到第 n 行 void ScrollWindowDown unsigned int n n 为行数从第 n 行后显示区域下滚 void GPutc unsigned char s1 unsigned char s2 字符的第一 个内码 若字符 为 ASCII 则 s1 位字符的 ASCII 码 s2 0 若字符 为汉字则 s1 s2 分别为汉字的区 位码 显示字符 包括 ASCII 和汉字 25 35 void GetHZ char incode char bytes incode 汉字 的内码数组 前 两个字节有用 bytes 返回汉字 字模的数组 获取汉字字模 void CloseHZK 关闭汉字字模库文件 void OpenHZK void 打开汉字字模库文件 void PutASCColor unsigned int x0 unsigned int y0 unsigned char s unsigned int color unsigned int bkcolor x0 y0 位字符的 坐标 s 为字符 的 ASCII 码 color bkcolor 为 字符的前景色和 背景色 在特定位置用特定颜色显示 ASCII 字符 void PutCNColor unsigned int x0 unsigned int y0 unsigned char s unsigned int color unsigned int bkcolor x0 y0 位字符的 坐标 s 为汉字 内码的指针 color bkcolor 分 别为字符的前景 色和背景色 在特定位置用特定颜色显示汉字 字符 void GPuts unsigned char s 字符串的指针显示字符串 void GPutsColor unsigned int x0 unsigned int y0 unsigned char s unsigned int color unsigned int bkcolor x0 y0 位字符的 坐标 s 为字符 串的指针 color bkcolor 分 别为字符的前景 色和背景色 在特定位置用特定颜色显示字符 串 IMD H BYTE GetColor BYTE data BYTE forecolor BYTE backcolor BYTE i void Bar int x int y int w int h int bkcolor 清一矩形 int LIMD BYTE file int i 装入汉字输入法 IMD 文件 WORD GetInputWord BYTE buf 取用户输入的汉字或 ASCII 字符 void GetWord BYTE BYTE int IsInTable BYTE c void ShowCodeMsg BYTE s 在提示行显示汉字编码字符 void SetIMD int i 设置当前所用的汉字输入方法 26 35 void SetWordMode 设置全半角 热键为 Ctrl F9 void ShowCwordMsg BYTE s 在提示显示输入的汉字 void ClearShowCword 清显示输入重码汉字提示区 void ClearShowCode 清显示编码提示区 WORD InitializeIMD void 初始化函数 void IMD void 析构函数 BYTE GetErrorCode 取错误代码 功能函数的算法说明功能函数的算法说明 部分部分 AppendChar 在末尾追加一个字符在末尾追加一个字符 执行该操作时 主要有两种情况 1 pEnd 不为空 pEnd pNext pNewChar 2 pEnd 为空 说明该行没有节点 这是只要添加一个节点即可 void interrupt far CursorHandler 显示光标的时间中显示光标的时间中 段句柄的函数段句柄的函数 本函数在图形显示函数初始化过程中被设置成时间中段程序 本函数有一个计算本函 27 35 数执行次数的全局变量 HandlerTimes 时间中段每秒钟执行 18 5 次 每执行一次时间中 段 HandlerTimes 就加一 当 HandlerTimes 的值为 3 时 就执行一次函数中显示光标的函 数 ShowCursor 或恢复光标图像的函数 RecoverCursor 于是每经过大约 1 3 秒的时间 光标就闪烁一次 而程序中是如何确定要显示还是要恢复光标呢 程序模块中有一个全局变量 flag 他被初始化为 0 当 flag 为 0 并且光标的位置不超出 显示区域时 就调用显示光标的函数 ShowCursor 然后把 flag 设为 1 当 flag 为 1 并

温馨提示

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

评论

0/150

提交评论