摘要: 本文对Rich Edit控件底层消息机制进行了讲解,以期读者对Windows平台下的Rich Edit控件有一个更深入的认识,同时对于使用Win32 SDK进行开发的人员具有一定参考价值。因为文章的初衷是引领VB程序员通过Win32 API调用来扩展VB下的Rich Edit控件的功能,所以对于每个消息的详细说明和注意事项未作过多说明,感兴趣的朋友可以参考Visual Studio下的MSDN Library。
关键字:Rich Edit Control、RTF、SDK、MSDN。
Rich Edit控件是一个可用于输入、编辑、格式化、打印和保存文本的窗体。这些文本可以设置字符和段落格式,并且可以包含嵌入的COM对象。Rich Edit控件提供格式化文本的编程接口。不过,应用程序必须实现这些用户接口组件,以便用户可以进行格式化操作。
Rich Edit控件几乎支持所有用于多行Edit控件的消息和通知。因此,已经使用了Edit控件的程序可以很容易的改为Rich Edit控件。额外的消息和通知使得应用程序可以访问Rich Edit控件特有的功能。获取更多关于Edit控件的信息,请参阅Edit Controls。
正如大家所熟知的,Windows控件是基础窗口,它处理那些控制窗口显示和特征的消息。而ActiveX控件是把那些消息变成属性和方法的COM 容器。RichEdit Windows控件是Edit Windows控件的扩展集,TextBox ActiveX控件也是从它派生而来。RichEdit能够识别Edit消息并且加入了自己特有的消息。你可以在Win32帮助文件中认出Edit和RichEdit的消息常数,因为他们均采用EM_作为前缀。
ActiveX RichTextBox控件将绝大多数的这种消息映射为其属性。例如,EM_LIMITTEXT与MaxLength属性相对应。但是你同时会注意到一些感兴趣的消息并没有与之对应的RichTextBox属性。为什么呢?
ActiveX控件为最通用的特性提供方法和属性,更具体讲,是提供给VB设计者最感兴趣的特性。设计者们似乎喜欢每个新版本里更多的特征。 例如,TextBox 和RichTextBox控件现在具备Locked属性。在旧版本的VB中你不得不通过EM_SETREADONLY消息来模拟。但是,还有许多其他隐藏的或者不是很明显的特性在ActiveX控件中尚未提供。为了使用这些特性,我们就必须对Rich Edit控件的底层消息机制进行较深入的了解。
Rich Edit控件的最初规范为1.0版。目前规范为2.0版。(译者注:目前最新版本为4.1版本!)在创建一个Rich Edit控件之前,你应该调用LoadLibrary函数来确认安装的Rich Edit控件的版本。下表显示了不同版本与其DLL间的对应关系。
Rich Edit 版本 |
DLL名称 |
版本号 |
1.0 |
RICHED32.DLL |
|
2.0 |
RICHED20.DLL |
低于5.30.23.1200 |
3.0 |
RICHED20.DLL |
5.30.23.1200或更高 |
4.1 |
Msftedit.dll |
下表给出了不同版本Windows下与其包含的不同版本的Rich Edit对应关系:
Windows XP SP1 |
包含 Rich Edit 4.1, Rich Edit 3.0, 和一个 Rich Edit 1.0 仿真程序。 |
Windows XP |
包含Rich Edit 3.0和一个 Rich Edit 1.0 仿真程序。 |
Windows Me |
包含Rich Edit 1.0和3.0。 |
Windows 2000 |
包含Rich Edit 3.0和一个 Rich Edit 1.0 仿真程序。 |
Windows NT 4.0 |
包含Rich Edit 1.0和2.0。 |
Windows 98 |
包含Rich Edit 1.0和2.0。 |
Windows 95 |
只包含Rich Edit 1.0。不过,Riched20.DLL与Windows 95系统兼容,所以可以在正确安装后使用。 |
Rich Edit 2.0包含几个新特性,比如支持Unicode和远东语言,多级撤消,以及大量的增强用户接口。
Rich Edit 2.0采用与Rich Edit 1.0一致的Win32函数,结构和消息,极少例外。他们的区别在于:
消息 |
描述 |
EM_AUTOURLDETECT |
是否开启/关闭自动URL检测。 |
EM_CANREDO |
判断是否在Redo队列中有一些动作。 |
EM_GETIMECOMPMODE |
获取当前输入方式编辑(IME)模式。 |
EM_GETLANGOPTIONS |
获取IME和远东语言支持选项。 |
EM_GETREDONAME |
获取Redo队列中的下一动作的类型名称。 |
EM_GETTEXTMODE |
获取文本模式或者Undo级别。 |
EM_GETUNDONAME |
获取Undo队列中的下一动作的类型名称。 |
EM_REDO |
重做Redo队列中的下一动作。 |
EM_SETLANGOPTIONS |
设置IME和远东语言支持选项。 |
EM_SETTEXTMODE |
设置文本模式或者Undo级别。 |
EM_SETUNDOLIMIT |
设置Undo队列的最大动作数目。 |
EM_STOPGROUPTYPING |
终止当前Undo动作的连续键入动作的组合。 |
消息 |
描述 |
CHARFORMAT2 |
包含字符格式信息。 |
PARAFORMAT2 |
包含段落格式属性。 |
EM_CONVPOSITION |
EM_GETIMECOLOR |
EM_GETIMEOPTIONS |
EM_GETPUNCTUATION |
EM_GETWORDWRAPMODE |
EM_SETIMECOLOR |
EM_SETIMEOPTIONS |
EM_SETPUNCTUATION |
EM_SETWORDWRAPMODE |
可用通过CreateWindowEx函数中指定Rich Edit 窗体类来创建一个Rich Edit控件。如果使用1.0版本(RICHED32.DLL),窗体类参数应该为"RichEdit"。如果采用2.0版本(RICHED20.DLL),窗体类参数应该为"RICHEDIT_CLASS"。
Rich Edit控件支持大部分的Edit控件采用的窗体样式,同时也支持一些额外的样式。你如果希望控件中的文本支持不止一行的话就应该给出ES_MULTILINE窗体样式。
应用程序可以通过给Rich Edit控件发送消息来格式化字符和段落以及获取这些格式化信息。段落格式属性包含对齐、跳格、缩进和编号。对字符而言,你可以指定字体、尺寸、颜色以及如粗体、斜体和保护等效果。
你可以采用EM_SETPARAFORMAT消息来应用段落格式。获取当前选中文本的段落格式属性,则采用EM_GETPARAFORMAT消息。PARAFORMAT结构将会在这两个消息中用到,它用于描述段落格式属性。
你可以采用EM_SETCHARFORMAT消息来应用字符格式。获取当前选中文本的字符格式属性,则采用EM_GETCHARFORMAT消息。CHARFORMAT结构将会在这两个消息中用到,它用于描述字符格式属性。
你也可以采用EM_SETCHARFORMAT和EM_GETCHARFORMAT消息来设置和获取默认字体格式,它将应用于所有随后插入的字符。例如,应用程序将默认字符格式设置为粗体,则用户随后敲入的字符都将为粗体。
只有在当前选择内容为空的时候默认字符格式才会被应用到新插入的文本上。否则,新的文本将假定沿用其所替换的文本的格式。如果选择内容改变,则默认字体格式将将采用该内容的首字符的格式。
保护(Protected)字符效果是唯一不改变其文本显示的例子。如果用户试图修改保护文本,Rich Edit控件将发送EN_PROTECTED通知到其父窗口,让其父窗体决定是否允许或者拒绝修改。为了接收该通知,你必须使用EM_SETEVENTMASK消息来启用它。
前景色是一个字符属性,但是背景色是一个Rich Text控件属性。要设置背景色,请采用EM_SETBKGNDCOLOR消息。
用户可以在Rich Edit控件中通过鼠标和键盘来选择文本。当前选择内容指的是选中字符的范围,或者表示没有字符选中时的插入点位置。应用程序可以获取选中内容的相关信息,设置当前选中内容,决定当前选中内容何时改变,显示或者隐藏当前高亮显示的选中内容等。
确定Rich Edit控件中的当前选中内容,采用EM_EXGETSEL消息。设置当前选择区域,采用EM_EXSETSEL消息。CHARRANGE结构用于在这两个消息中描述字符范围。获取当前选中内容的相关信息,你可以采用EM_SELECTIONTYPE消息。
应用程序可以通过处理EN_SELCHANGE通知来检测当前选中内容何时被改变。该通知通过SELCHANGE结构给出新选中内容的相关信息。Rich Edit控件只有在你通过EM_SETEVENTMASK消息开启它之后才会发送该通知。
默认情况下,Rich Edit控件在获取和失去焦点时将开启和隐藏选中文本的高亮显示。你可以通过EM_HIDESELECTION消息在任何时候开启或者隐藏选中区域的高亮显示。例如,某个应用程序可能提供一个查找对话框用于在Rich Edit控件中查找文本,这种情况下就必须使用EM_HIDESELECTION消息来保持选中文本的高亮显示。
与Edit控件一样,你可以使用ES_NOHIDESEL窗体样式来防止Rich Edit控件在失去焦点时隐藏选中区域的高亮显示。你也可以在Rich Edit控件创建之后使用EM_HIDESELECTION消息来改变窗体的ES_NOHIDESEL样式。
获取和设置当前选中内容使用EM_GETSEL和EM_SETSEL Edit控件消息,而非EM_EXGETSEL和EM_EXSETSEL消息。EM_GETSEL消息将两个16位字符索引压缩为它的32位返回值,因此,仅仅适用于选中区域的前64K字节。然而,一个Rich Edit控件不可能包含超过32K字节的文本,除非你使用EM_EXLIMITTEXT消息扩展了这个限制。对于选中文本中超过前64K字节的文本,EM_GETSEL消息将返回-1。
应用程序可以发送消息来获取或者查找Rich Edit控件中的文本。你既可以获取选中区域的文本也可以获取给定范围的文本。
获取Rich Edit控件中的选中文本,使用EM_GETSELTEXT消息。文本将被拷贝到指定字符数组中。你必须确保数组大小足以容纳选中文本再加上一个终止NULL字符。
获取给定范围的文本,使用EM_GETTEXTRANGE消息。该消息将使用TEXTRANGE结构,用于描述需要获得的文本范围以及用于获取该文本的字符数组指针。在这里,同样的,你必须确保数组大小足以容纳选中文本再加上一个终止NULL字符。
你可以使用EM_FINDTEXT消息在一个Rich Edit控件中查找字符串。该消息将使用结构,用于描述文本查找范围及需要查找的字符串。你也可以指定诸如是否区分大小写等搜索选项。
Rich Edit 控件调用叫做"断字处理过程"的函数来查找单词间分隔符以及判断何处可以换行。控件在执行自动换行操作时以及处理Ctrl+左箭头和Ctrl+右箭头的组合键时将利用这些信息。应用程序可以通过向Rich Edit控件发送消息来替换默认的"断字处理过程",获取断字信息,以及判断一个给定字符属于哪一行。
Rich Edit控件的断字处理过程与Edit控件相似,但是它拥有更多能力。两种控件的断字处理过程均可以识别一个字符是否是一个分隔符,并且能够在找到给定位置的前一个或者后一个字分隔符。分隔符指的是一个标志单词结束的字符,比如空格。在Edit控件中,断字只出现在分隔符之后。
Rich Edit控件的断字处理过程同时将字符组合为字符类,由到0x00的0x0F值来标识。断字可以出现在分隔符之后或者在不同类的字符之间。因此,在字符串"WIN.COM"中,由于字母数字和标点属于不同类别,断字程序将找到两个字分隔符。
一个字符类别可以由0个或者更多的字分隔符标志位组成一个8位的值。当执行自动换行操作时,Rich Edit控件使用这些分隔符标志位来决定何处可以换行。有如下这些字分隔标志位:
WBF_BREAKAFTER |
字符后面可以换行。 |
WBF_BREAKLINE |
该字符为一个分隔符。分隔符标记单词的结束。也可以在分隔符后换行。 |
WBF_ISWHITE |
该字符为一个白空格字符。跟随的白空格字符在换行时不包含在行长度中。 |
WBF_BREAKAFTER表示允许在该字符后面折行,但是并不标记单词的结束,比如连字符-。
你可以使用EM_SETWORDBREAKPROC消息来替换Rich Edit控件的默认断字处理过程。获取更多关于断字处理过程的信息,请参阅EditWordBreakProc函数说明。
另外,你可以使用EM_SETWORDBREAKPROCEX消息来替换默认的扩展断字处理过程EditWordBreakProcEx函数。该函数提供有关该文本的更多信息,比如字符集。你可以使用EM_GETWORDBREAKPROCEX消息来获取当前扩展断字处理过程的地址。
你可以使用EM_FINDWORDBREAK消息来查找断字符或者确定一个字符类和断字标志位。控件依次调用其断字处理过程,获取所需信息。
判断给定字符属于哪一行,你可以使用EM_EXLINEFROMCHAR消息。
应用程序可以粘贴剪贴板中内容到一个Rich Edit控件中,采用最佳可用剪贴板格式或者指定的剪贴板格式。你也可以决定是否一个Rich Edit控件可以粘贴某种剪贴板格式。
对于一个Edit控件而言,你可以使用WM_COPY或者WM_CUT消息来拷贝或者剪切当前选中内容。同样的,你可以使用WM_PASTE消息将这些剪贴板内容粘贴到一个Rich Edit控件中。控件将粘贴它所识别的第一个可用格式,这大概是最具描述性的格式。
你可以使用EM_PASTESPECIAL消息来粘贴指定的剪贴板格式。这个消息对具有"特殊粘贴"命令的应用程序很有用,该命令可以让用户选择剪贴板格式。你可以使用EM_CANPASTE消息来决定控件是否识别某种指定的格式。
你也可以使用EM_CANPASTE消息来决定Rich Edit控件是否识别所有可用的剪贴板格式。该消息在处理WM_INITMENUPOPUP消息时很有用。应用程序可以启用或者屏蔽"粘贴"命令,取决于控件是否可以粘贴任一个可用类型。
Rich Edit控件注册两种剪贴板格式:"富文本格式(RTF)"和一种叫做"RichEdit 文本与对象"的格式。应用程序可以使用RegisterClipboardFormat函数来注册这些格式,其取值为CF_RTF与CF_RETEXTOBJ。
你可以使用流(Stream)向Rich Edit控件传入或者传出数据。流由EDITSTREAM结构所定义,该结构描述一个缓冲区及一个应用程序定义的回调函数。
将数据读入Rich Edit控件(或者说,数据传入),使用EM_STREAMIN消息。控件将重复调用应用程序的回调函数,该函数每次传入数据的一部分到缓冲区中。
保存Rich Edit控件内容(或者说,数据传出),你可以使用EM_STREAMOUT消息。控件将重复写入缓冲区然后调用应用程序的回调函数。对于每次调用,回调函数将保存缓冲区中的内容。
你可以向Rich Edit控件发送消息来将其输出重定向到指定设备,比如打印机。你也可以指定一个用于Rich Text文本格式化的输出设备。
对于特殊设备而言,要格式化Rich Edit控件中部分内容,你可以使用EM_FORMATRANGE消息。FORMATRANGE结构用于在该消息中描述需要格式化的文本范围以及目标设备的设备场景。
在输出设备文本格式化完成后,你可以使用EM_DISPLAYBAND消息将输出发送至设备。通过反复使用EM_FORMATRANGE和EM_DISPLAYBAND消息,打印Rich Text控件内容的应用程序可以实现条带化操作。(条带化操作指的是将输出分割为较小部分用于打印目的的操作。)
你可以使用EM_SETTARGETDEVICE消息来指定一个用于Rich Text文本格式化的目标设备。该消息对于WYSIWYG(所见即所得)模式非常有用,在该模式下应用程序采用默认打印机字体规格而非屏幕字体规格来定位文本。
应用程序可以调整Rich Edit控件的大小以便它总是与其内容大小匹配。Rich Edit控件支持这种所谓的"无底"特性,在任何时候若其内容大小改变,它将向其父窗体发送EN_REQUESTRESIZE通知。
在处理EN_REQUESTRESIZE通知时,应用程序应该调整控件尺寸为REQRESIZE结构所给出的大小。应用程序同样可以变换控件相关的任何信息以适应控件的高度改变。调整控件大小,你可以使用SetWindowPos函数。
你可以使用EM_REQUESTRESIZE消息强制一个无底Rich Edit控件发送EN_REQUESTRESIZE通知。该消息在处理WM_SIZE消息时很有用。
为了接收EN_REQUESTRESIZE通知,你必须采用EM_SETEVENTMASK消息来启用它。
Rich Edit控件父窗体可以处理通知,这些消息记录影响该控件的事件。Rich Edit控件支持所有Edit控件所使用的通知,同时具有几个新增的通知。你可以通过设置它的事件掩码(Event Mask)来判断Rich Edit控件发送到其父窗体的是何种通知。
设置Rich Edit控件的事件掩码,采用EM_SETEVENTMASK消息。你可以使用EM_GETEVENTMASK消息来获取当前Rich Edit控件的事件掩码。
Rich Edit控件的父窗体可以通过处理EN_MSGFILTER通知来过滤所有的键盘和鼠标输入。父窗体可以防止键盘和鼠标消息被处理,或者可以通过修改指定的MSGFILTER结构来修改这些消息。
应用程序可以处理EN_PROTECTED通知,用以检测何时用户试图修改受保护的文本。为了置某个范围的文本为受保护状态,你可以设置受保护字符效果。获取更多信息,请参阅文本格式。
你可以通过处理EN_DROPFILES通知来允许用户Drop一个文件到Rich Edit控件中。指定的ENDROPFILES结构包含了即将被Drop的文件的相关信息。
Rich Edit 控件支持绝大多数而并非全部的多行Edit控件的特性。本节列举出Rich Edit控件所不支持的Edit控件的消息和窗体样式。
下面的消息由Edit控件处理,而不被Rich Edit控件所支持。
不支持的消息 |
注释 |
EM_FMTLINES |
不支持。 |
EM_GETHANDLE |
Rich Edit控件并非将文本存储为简单的字符数组。 |
EM_GETMARGINS |
不支持。 |
EM_GETPASSWORDCHAR |
不支持ES_PASSWORD样式。 |
EM_SETHANDLE |
Rich Edit控件并非将文本存储为简单的字符数组。 |
EM_SETMARGINS |
不支持。 |
EM_SETPASSWORDCHAR |
不支持ES_PASSWORD样式。 |
EM_SETRECTNP |
不支持。 |
EM_SETTABSTOPS |
采用EM_SETPARAFORMAT消息。 |
WM_CTLCOLOR |
采用EM_SETBKGNDCOLOR消息。 |
WM_GETFONT |
采用EM_GETCHARFORMAT消息。 |
下面的窗体样式用于多行Edit控件,而不被Rich Edit控件所支持:
ES_LOWERCASE |
ES_PASSWORD |
ES_OEMCONVERT |
ES_UPPERCASE |
Rich Text控件相关的消息、通知和结构体分组汇总如下。部分API元素也用于Edit控件。
下列回调函数是Rich Edit控件所特有的:
EditStreamCallback |
EditWordBreakProcEx |
EditStreamCallback函数是一个应用程序定义的回调函数,用于EM_STREAMIN和EM_STREAMOUT消息。它用于将数据传入或者传出一个Rich Edit控件。EDITSTREAMCALLBACK类型定义了一个指向该回调函数的指针。EditStreamCallback是一个用于该应用程序定义的函数名的占位符。
DWORD CALLBACK EditStreamCallback(
DWORD dwCookie, // application-defined value
LPBYTE pbBuff, // 缓冲区指针
LONG cb, // 读或写的字节数
LONG *pcb // 实际传输的字节数的指针
);
dwCookie
指定EDITSTREAM结构中的dwCookie成员的值。应用程序在发送EM_STREAMIN和EM_STREAMOUT消息时将指定该值。
pbBuff
用于读取或写入的缓冲区指针。对于一个流入(读)操作,回调函数将数据填入该缓冲区,再传入Rich Edit控件。对于流出(写)操作,缓冲区包含从控件中读取的数据,回调函数负责将其写入存储器中。
cb
指出读取和写入的字节数。
pcb
一个变量的指针,回调函数将设置该变量的值为实际读取或写入的字节数。
回调函数返回0表示成功。.
回调函数返回非0值表示发生错误。一旦发生错误,读写操作将终止,Rich Edit控件将放弃pbBuff缓冲区中的任何数据。如果一个回调函数返回一个非0值,Rich Edit控件将采用EDITSTREAM结构的dwError成员将该值传回应用程序。
当你发送EM_STREAMIN和EM_STREAMOUT消息到一个Rich Edit控件时,需要为EDITSTREAM结构的pfnCallback成员指定一个EditStreamCallback函数指针。Rich Edit控件将不断调用该函数来输出或者输入数据。
当你发送EM_STREAMIN和EM_STREAMOUT消息时,你需要给出一个EDITSTREAM结构的dwCookie成员的值。Rich Edit控件使用dwCookie参数将该值传递到EditStreamCallback函数中。例如,你可能使用dwCookie来传递一个打开的文件的句柄,回调函数就可以使用该dwCookie句柄来读取和写入文件。
控件不断调用回调函数,每次传递部分数据。控件不断调用回调函数,直至出现如下情况之一为止:
EditWordBreakProcEx函数是一个应用程序定义的回调函数,用于EM_SETWORDBREAKPROCEX消息。它决定字符在某段给定文本中的字分隔符的字符索引,或者是字符类和字分隔符标志位。EDITWORDBREAKPROCEX类型定义了一个回调函数的指针。EditWordBreakProcEx是一个应用程序定义的函数名的占位符。
LONG EditWordBreakProcEx(
char *pchText,
LONG cchText,
BYTE bCharSet,
INT code
);
pchText
当前位置的文本的指针。如果code指定要向左移动,则文本为元素pchText[-1]到pchText[-cchText]的文本,pchText[0]未定义。对于其他所有操作,文本指的是pchText[0]到pchText[cchText - 1]的文本。
cchText
由code指定的搜索方向上的缓冲区中的字符数。
bCharSet
文本的字符集。
code
所执行的断字动作。可用的取值由EM_FINDWORDBREAK消息的code参数所描述。
返回字母分隔符的字符索引值,除非code参数是WB_CLASSIFY和WB_ISDELIMITER值。
应用程序必须安装回调函数,方法是在EM_SETWORDBREAKPROCEX消息中给出回调函数的地址。
下列结构体用于Rich Edit控件:
CHARFORMAT |
CHARFORMAT2 |
CHARRANGE |
COMPCOLOR |
EDITSTREAM |
ENCORRECTTEXT |
ENDROPFILES |
ENLINK |
ENOLEOPFAILED |
ENPROTECTED |
ENSAVECLIPBOARD |
FINDTEXT |
FINDTEXTEX |
FORMATRANGE |
MSGFILTER |
PARAFORMAT |
PARAFORMAT2 |
PUNCTUATION |
REOBJECT |
REPASTESPECIAL |
REQRESIZE |
SELCHANGE |
TEXTRANGE |
以下消息由Rich Edit控件所独有:
EM_AUTOURLDETECT |
EM_CANPASTE |
EM_CANREDO |
EM_DISPLAYBAND |
EM_EXGETSEL |
EM_EXLIMITTEXT |
EM_EXLINEFROMCHAR |
EM_EXSETSEL |
EM_FINDTEXT |
EM_FINDTEXTEX |
EM_FINDWORDBREAK |
EM_FORMATRANGE |
EM_GETCHARFORMAT |
EM_GETEVENTMASK |
EM_GETIMECOLOR |
EM_GETIMECOMPMODE |
EM_GETIMEOPTIONS |
EM_GETLANGOPTIONS |
EM_GETOLEINTERFACE |
EM_GETOPTIONS |
EM_GETPARAFORMAT |
EM_GETPUNCTUATION |
EM_GETREDONAME |
EM_GETSELTEXT |
EM_GETTEXTMODE |
EM_GETTEXTRANGE |
EM_GETUNDONAME |
EM_GETWORDBREAKPROCEX |
EM_GETWORDWRAPMODE |
EM_HIDESELECTION |
EM_PASTESPECIAL |
EM_REDO |
EM_REQUESTRESIZE |
EM_SELECTIONTYPE |
EM_SETBKGNDCOLOR |
EM_SETCHARFORMAT |
EM_SETEVENTMASK |
EM_SETIMECOLOR |
EM_SETIMEOPTIONS |
EM_SETLANGOPTIONS |
EM_SETOLECALLBACK |
EM_SETOPTIONS |
EM_SETPARAFORMAT |
EM_SETPUNCTUATION |
EM_SETTARGETDEVICE |
EM_SETTEXTMODE |
EM_SETUNDOLIMIT |
EM_SETWORDBREAKPROCEX |
EM_SETWORDWRAPMODE |
EM_STOPGROUPTYPING |
EM_STREAMIN |
EM_STREAMOUT |
WM_CONTEXTMENU |
Rich Edit控件支持绝大多数的Edit控件所使用的通知,同时增加了如下的通知。一个Rich Edit控件只有在使用EM_SETEVENTMASK消息启用了它之后才能发送下面的通知。
EN_CORRECTTEXT |
EN_DROPFILES |
EN_IMECHANGE |
EN_LINK |
EN_MSGFILTER |
EN_OLEOPFAILED |
EN_PROTECTED |
EN_REQUESTRESIZE |
EN_SAVECLIPBOARD |
EN_SELCHANGE |
EN_STOPNOUNDO |
Rich Edit 控件支持由OLE所定义的客户端的支持。该控件为大多数的OLE客户端提供完全的支持。它不支持链接到自身内容。客户端负责处理对话框和错误消息、OLE对象的存储处理,以及文档和应用程序窗体级的实时激活支持。客户端可以使用EM_GETOLEINTERFACE消息从Rich Edit控件获取一个IRichEditOle接口,该接口允许它控制OLE对象。客户端使用EM_SETOLECALLBACK消息注册一个IRichEditOleCallback接口,控件将使用它获取所需接口和存储。
下列OLE接口用于Rich Edit控件:
IRichEditOle |
IRichEditOleCallback |
指定用于Rich Edit控件执行OLE相关操作的接口。IRichEditOle接口有下列方法:
IUnknown 方法 |
描述 |
QueryInterface |
返回支持的接口的指针。 |
AddRef |
增加引用计数。 |
Release |
减少引用计数。 |
IRichEditOle方法 |
描述 |
GetClientSite |
在创建一个新对象时获取一个可用的IOleClientSite接口。 |
GetObjectCount |
获取Rich Edit控件中包含的对象数目。 |
GetLinkCount |
获取Rich Edit控件中链接的对象数目。 |
GetObject |
返回Rich Edit控件中一个REOBJECT结构描述的对象信息。 |
InsertObject |
将一个对象插入到Rich Edit控件中。 |
ConvertObject |
将一个对象转换为一个新类型。 |
ActivateAs |
卸载属于旧类的对象,告诉OLE将其看做新类对象,然后重新调入这些对象。 |
SetHostNames |
当对象插入到Rich Edit控件中时,设置一个"Host Names"给该对象。 |
SetLinkAvailable |
设置对象标志位中的可用链接位的值。 |
SetDvaspect |
设置Rich Edit控件用于绘制一个对象的特征。 |
HandsOffStorage |
告诉Rich Edit控件释放其指定对象相关的访问存储器接口。 |
SaveCompleted |
告诉Rich Edit控件最近的保存操作已经完毕,应该继续存储该对象至不同存储器。 |
InPlaceDeactivate |
告诉Rich Edit控件立即使当前激活的对象处于非激活状态。 |
ContextSensitiveHelp |
告诉Rich Edit控件进入或者退出上下文相关帮助模式。 |
GetClipboardData |
获取一个剪贴板对象,用于Edit控件的某一区域。 |
ImportDataObject |
导入一个剪贴板对象至Rich Edit控件,替换当前选中的内容。 |
指定一个用于Rich Edit控件从客户端获取OLE相关信息的接口。Rich Edit 控件的客户端负责实现该接口,并通过EM_SETOLECALLBACK消息将其指派给一个控件。IRichEditOleCallback接口包含如下方法:
IUnknown 方法 |
描述 |
QueryInterface |
返回支持的接口的指针。 |
AddRef |
增加引用计数。 |
Release |
减少引用计数。 |
IRichEditOleCallback 方法 |
描述 |
GetNewStorage |
为一个粘贴自剪贴板或者从一个RTF流读取的对象提供存储。 |
GetInPlaceContext |
提供应用程序和文件级的接口以及支持原地激活的必需的信息。 |
ShowContainerUI |
告诉应用程序是否显示其用户接口容器。 |
QueryInsertObject |
询问应用程序是否一个对象应该被插入。 |
DeleteObject |
通知某一对象将在Rich Edit中被删除。 |
QueryAcceptData |
访问一个粘贴或者拖拽,以决定是否其粘贴/拖拽的数据应该被接受。 |
ContextSensitiveHelp |
告诉应用程序应该进入或者退出上下文相关帮助模式。 |
GetClipboardData |
允许客户端支持其自身剪贴板对象。 |
GetDragDropEffect |
允许客户端指定其拖放操作的执行结果。 |
GetContextMenu |
在一个鼠标右键按下事件中,询问应用程序提供一个上下文菜单。 |
下列枚举类型用于Rich Edit控件:
TEXTMODE |
UNDONAMEID |
TEXTMODE 枚举类型包含用于表示Rich Edit控件的文本模式的值。EM_SETTEXTMODE 和 EM_GETTEXTMODE m消息将使用这个枚举类型。
typedef enum tagTextMode
{
TM_PLAINTEXT = 1,
TM_RICHTEXT = 2, // 默认值
TM_SINGLELEVELUNDO = 4,
TM_MULTILEVELUNDO = 8, // 默认值
TM_SINGLECODEPAGE = 16,
TM_MULTICODEPAGE = 32
} TEXTMODE;
常数 |
涵义 |
TM_PLAINTEXT |
纯文本模式,这种模式下控件类似标准编辑控件。 |
TM_RICHTEXT |
富文本模式,这种模式下控件具备标准Rich Edit功能。为默认设置。 |
TM_SINGLELEVELUNDO |
控件只允许撤销Undo队列中的最后一个动作。 |
TM_MULTILEVELUNDO |
控件支持多级撤销操作。为默认属性。使用EM_SETUNDOLIMIT消息来设置撤销操作的最大级数。 |
TM_SINGLECODEPAGE |
不支持。 |
TM_MULTICODEPAGE |
不支持。 |
UNDONAMEID 枚举类型包含指示Rich Edit控件动作的常数,这些动作可以用于撤销和重做操作。 EM_GETREDONAME 和 EM_GETUNDONAME 将使用该枚举类型作为一个返回值。
typedef enum _undonameid {
UID_UNKNOWN = 0,
UID_TYPING = 1,
UID_DELETE = 2,
UID_DRAGDROP = 3,
UID_CUT = 4,
UID_PASTE = 5
} UNDONAMEID;
常数 |
涵义 |
UID_UNKNOWN |
Undo操作类型未知。 |
UID_TYPING |
键入操作。 |
UID_DELETE |
删除操作。 |
UID_DRAGDROP |
拖拽-放下操作。 |
UID_CUT |
剪切操作。 |
UID_PASTE |
粘贴操作。 |
下列窗体样式属于Rich Edit控件所独有:
样式 |
描述 |
ES_DISABLENOSCROLL |
在不需要滚动条时将它们置灰,而非隐藏。 |
ES_EX_NOCALLOLEINIT |
禁止控件在创建时调用OleInitialize函数。仅在对话框模式下有用,因为CreateWindowEx不支持该样式。 |
ES_NOIME |
禁止输入方式编辑(IME)操作。只对亚洲语言有效。 |
ES_SAVESEL |
在控件失去焦点时保持选定区域。默认情况下,在控件重新获取焦点时将选择所有内容。 |
ES_SELFIME |
指示Rich Edit控件允许应用程序控制所有的IME操作。只对亚洲语言有效。 |
ES_SUNKEN |
控件显示为下凹边框样式,看起来像是嵌入到其父窗体中。 Windows 95: Windows 95下的应用程序应该使用WS_EX_CLIENTEDGE,而非ES_SUNKEN。 |
ES_VERTICAL |
垂直绘制文本和对象。只对亚洲语言有效。 |
Rich Edit 控件同样支持下面的Edit控件样式。为了允许多行文本,你就必须指定ES_MULTILINE样式。
ES_AUTOHSCROLL |
ES_NOHIDESEL |
ES_AUTOVSCROLL |
ES_READONLY |
ES_CENTER |
ES_RIGHT |
ES_LEFT |
ES_WANTRETURN |
ES_MULTILINE |
Rich Edit控件不支持下面的Edit控件样式:
ES_LOWERCASE |
ES_PASSWORD |
ES_OEMCONVERT |
ES_UPPERCASE |
事件掩码用于指定一个Rich Edit控件向父窗体发送何种通知。事件掩码可以为0或下列多种取值:
值 |
涵义 |
ENM_CHANGE |
发送EN_CHANGE 通知。 |
ENM_CORRECTTEXT |
发送EN_CORRECTTEXT通知。 |
ENM_DROPFILES |
发送EN_DROPFILES通知。 |
ENM_KEYEVENTS |
发送EN_MSGFILTER键盘事件通知。 |
ENM_MOUSEEVENTS |
发送EN_MSGFILTER 鼠标事件通知。 |
ENM_PROTECTED |
发送EN_PROTECTED通知。 |
ENM_RESIZEREQUEST |
发送EN_REQUESTRESIZE通知。 |
ENM_SCROLL |
发送EN_HSCROLL通知。 |
ENM_SELCHANGE |
发送EN_SELCHANGE通知。 |
ENM_UPDATE |
发送EN_UPDATE通知。 |
默认事件掩码为ENM_NONE,这种情况下将不会发送任何通知到父窗体。你可以通过ENM_GETEVENTMASK和ENM_SETEVENTMASK消息来获取和设置Rich Edit控件的事件掩码。
1、MSDN Library Visual Studio6.0(CHS),我们在MSDN上可以找到最新版本的SDK文档,地址如下: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/richedit/richeditcontrols/aboutricheditcontrols.asp
2、Wind32 SDK下的RICHEDIT.H头文件(2.0版本):包含了绝大多数函数声明和结构体及常数的C定义。对于其对应的VB声明,我会在接下来发布。