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.dllRiched20.dllRiched20.dll
控件的类名RicheditRichedit20A

Richedit20W

Richedit20A

Richedit20W

拖放编辑支持支持支持
流输入输出支持支持支持
Unicode编辑不支持支持支持
非窗口操作不支持支持支持
自动URL识别不支持支持支持
加速键不支持支持支持
分行符CR+LFCRCR(可模拟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)

第09章 通用控件

版权所有 © 云南伯恩科技 证书:粤ICP备09170368号