WIN32汇编语言教程:第09章 通用控件 · 9.4 使用Richedit控件(1)
Richedit控件和Edit控件类似,可以用于文本的输入和编辑。但两者在功能上各有侧重点。
Edit控件广泛使用于对话框中,用来供用户输入少量的文字,因此加快速度和减少资源的占用是最重要的,各种高级编辑功能不是主要的,所以Edit控件在短小精悍的同时,也存在诸多限制,最主要的就是在单行模式下,能容纳的文本不能超过32 KB,在多行模式下也不能超过64 KB。
Richedit控件则侧重于文字的高级编辑功能,控件能够容纳的文本长度可以支持操作系统中的最大文件尺寸,并内置了很多高级编辑器才具有的特征,如多级的撤销或重做,向前或向后搜索,支持Unicode编辑等,最重要的就是支持RTF(Rich Text Format)格式的带段落格式的文本编辑。由于实现这些功能的代码比较复杂,所以Richedit控件的规模比较大,以至于Windows将它划分出来以一个单独的DLL库文件方式提供。
到目前为止,Richedit控件总共有3个版本,这些版本的功能有所不同,总的来说高版本包括了低版本的所有功能,但在某些细节的实现上又有些不同,随着版本的升高,一些设置工作也随之增多,所以如果不需要某些特殊功能的话,使用最高的版本可能并不是最适合的。
1.0版本的Richedit控件对应的库文件是Riched32.dll,Windows 95只提供1.0版本,文件名中的32是32位版本的意思(不过并没有一个Riched16.dll)。从Windows 98开始,系统中多了一个2.0版本的Richedit控件,Windows 2000开始则有了3.0版本。2.0版本和3.0 版本的库文件名都是Riched20.dll,同时Riched32.dll文件仍然存在于系统中,不过Riched20.dll文件名中的20总是让人迷惑,很多人第一次使用Richedit控件的时候误认为Riched32.dll的版本要比Riched20.dll的版本高。
除了在功能上的不同,不同版本Richedit控件的类名称也有所不同,表9.4列出了3个版本之间的一些区别。
表9.4 不同版本Richedit控件之间的区别
1.0版本 | 2.0版本 | 3.0版本 | |
DLL库文件名 | Riched32.dll | Riched20.dll | Riched20.dll |
控件的类名 | Richedit | Richedit20A
Richedit20W | Richedit20A
Richedit20W |
拖放编辑 | 支持 | 支持 | 支持 |
流输入输出 | 支持 | 支持 | 支持 |
Unicode编辑 | 不支持 | 支持 | 支持 |
非窗口操作 | 不支持 | 支持 | 支持 |
自动URL识别 | 不支持 | 支持 | 支持 |
加速键 | 不支持 | 支持 | 支持 |
分行符 | CR+LF | CR | CR(可模拟1.0版) |
撤销/重做 | 支持单级 | 支持多级 | 支持多级 |
文本搜索 | 向前搜索 | 向前/向后搜索 | 向前/向后搜索 |
表9.4中列出的仅是一些最重要的区别,很多细微的区别并没有列出来,比如每个版本都可以为文本设定下划线,但3.0版比2.0版又增加了点、划、划-点、划-点-点等多种样式的下划线。
Richedit控件的2.0版本和3.0 版本使用的控件名和类名是相同的,有时候为了使用某些版本特有的功能,需要预先检测版本号,但Microsoft并没有提供一个官方的检测方法,所以必须利用一些版本之间的区别来进行检测(这种方法好像在检测不同的CPU),比如,排版样式功能(TYPOGRAPHY)是3.0版本才支持的,设置排版样式选项使用EM_SETTYPOGRAPHYOPTIONS消息,如果排版样式被设置后能够再检测到,说明控件的版本肯定是3.0的,代码如下:
invoke SendMessage,hwndRichEdit,EM_SETTYPOGRAPHYOPTIONS,\ TO_SIMPLELINEBREAK,TO_SIMPLELINEBREAK invoke SendMessage,hwndRichEdit,EM_GETTYPOGRAPHYOPTIONS,1,1 .if eax==0 ;说明设置消息没被处理,版本是2.0版 mov dwVersion,2 .else mov dwVersion,3 .endif
另外,也可以通过检测操作系统来确定Richedit控件的版本,如2.0版本在Windows 98和Windows NT 4.0中使用,而Windows 2000使用的是3.0版本。
在本节中,用一个简单的例子来演示Richedit控件的使用,包括如何创建控件、如何使用流操作装入和输出文件以及如何进行文本查找等,由于篇幅有限,程序并没有演示所有的高级编辑功能,程序代码存放在所附光盘的Chapter09\Richedit目录中,其中汇编源代码Richedit.asm文件的内容如下:
.386 .model flat, stdcall option casemap :none ;#################################################################### ; Include 文件定义 ;#################################################################### include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include comdlg32.inc includelib comdlg32.lib ;#################################################################### ; Equ 等值定义 ;#################################################################### ICO_MAIN equ 1000 IDA_MAIN equ 2000 IDM_MAIN equ 2000 IDM_OPEN equ 2101 IDM_SAVE equ 2102 IDM_EXIT equ 2103 IDM_UNDO equ 2201 IDM_REDO equ 2202 IDM_SELALL equ 2203 IDM_COPY equ 2204 IDM_CUT equ 2205 IDM_PASTE equ 2206 IDM_FIND equ 2207 IDM_FINDPREV equ 2208 IDM_FINDNEXT equ 2209 ;#################################################################### ; 数据段 ;#################################################################### .data? hInstance dd ? hWinMain dd ? hMenu dd ? hWinEdit dd ? hFile dd ? hFindDialog dd ? idFindMessage dd ? szFileName db MAX_PATH dup (?) szFindText db 100 dup (?)
上页:第09章 通用控件 · 9.3 使用工具栏(6) 下页:第09章 通用控件 · 9.4 使用Richedit控件(2)