您的位置首页百科问答

求教Windows编程里面的RichEdit,速度来拿分

求教Windows编程里面的RichEdit,速度来拿分

的有关信息介绍如下:

求教Windows编程里面的RichEdit,速度来拿分

理论:RichEdit提供了普通简单Edit控件所缺少的很多令人合意的功能,譬如可以使用多种字体和字体大小,多级Undo/Redo,文本搜索,内嵌OLE对象,编辑的拖放支持等等。由于RichEdit控件有这么多功能,因此它独存于一个单独的DLL文件。这个意味着如果你要使用RichEdit控件,就不能象使用其他普通控件那样只调用InitCommonControls 函数。你必须先使用 LoadLibrary 来载入RichEdit DLL文件。 这里有个问题,就是至今为止RichEdit控件共有3个版本,版本1,2和3。下面的表格显示了每个版本的相应的DLL文件名。DLL NameRichEdit versionRichedit Class NameRiched32.dll1.0RICHEDITRichEd20.dll2.0RICHEDIT20ARichEd20.dll3.0RICHEDIT20A你会注意到版本2和3都使用了相同的DLL文件名,而且它们也使用了相同的类名!这样在你想要明确的使用RichEdit 3.0的功能的时候就会产生问题. 到目前为止,我还找到一个正式的方法来区分版本2.0和3.0.不过,有个解决方法工作良好,我会在后面演示给你看.hRichEdit = LoadLibrary(RichEditDLL);......FreeLibrary(hRichEdit);当Richedit DLL文件被载入时,它会注册 RichEdit 窗口类,因此需要在你创建Richedit控件之前必须先要载入DLL.Richedit控件的类名是不同的。现在你可能会有一个问题要提:我怎么样才能够知道我要使用哪个版本的Richedit控件?如果你不需要使用那些特别的功能,使用最新的版本也不定是最适宜的.下面的表格列出了每个RichEdit版本提供的功能.功能版本 1.0版本 2.0版本 3.0选择条xxxUnicode 编辑xx字符段落格式xxx文本搜索向前搜索向前/向后搜索向前/向后搜索内嵌OLExxx拖放编辑xxxUndo/Redo单级多级多级自动 URL 识别xx加速键支持xx非窗口操作xx分行符CRLFCRCR (可以模拟1.0版本)ZoomxParagraph numberingxsimple tablexnormal and heading stylesxunderline coloringxhidden textxfont bindingx上面的表格不是全面的:我只是列出了那些重要的功能.创建RchEdit 控件 载入DLL文件后,你可以调用CreateWindowEx 来创建RichEdit控件,创建控件时你可以使用Edit控件风格和普通窗口风格,但是ES_LOWERCASE, ES_UPPERCASE 和 风格除外.CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hWnd,(HMENU)RichEditID,g_hInstance,NULL);设置缺省的文本和背景颜色 在使用Edit控件时设置文本和背景颜色可能有点问题,但是在RichEdit控件中已经修正了这个问题.要设置RichEdit的背景色,你要发送 EM_SETBKGNDCOLOR 消息给RichEdit控件.这个消息具有以下语法.wParam == 颜色选项. 如果是0说明Windows使用 lParam 中的颜色值作为背景色.如果该参数不为0,Windows使用系统背景色.因为我们要发送该消息来改变背景色,所以我们必须令wParam为0.lParam == 指定要设置的颜色的 COLORREF 结构,仅当 wParam 为 0 时才有效.譬如, 如果我要设置背景为纯蓝色,我需要写入以下代码:SendMessage(hwndRichEdit,EM_SETBKGNDCOLOR,0,0x0FF0000); 要设置文本颜色,RichEdit控件提供了另外的新消息,EM_SETCHARFORMAT来做这个工作. 这个消息控制控件中一段选定的文本或者全部正文的格式. 这个消息的语法如下:wParam == 格式选项: SCF_ALL本次操作影响控件中全部文本.SCF_SELECTION本次操作仅影响选定的文本SCF_WORD or SCF_SELECTION本次操作仅影响所选定的那个单词. 如果选定是空的话,仅将插入点(光标)设置到指定字的位置. SCF_WORD 标志必须跟 SCF_SELECTION 一起使用.lParam == CHARFORMAT 或者 CHARFORMAT2 结构的指针,说明要使用的正文格式. CHARFORMAT2 只在 Richedit 2.0 和更高版本才提供.这个不是说在RichEdit 2.0以后你一定要使用 CHARFORMAT2 . 如果你不需要使用到 CHARFORMAT2 中新加的功能, 你仍然可以使用CHARFORMAT .typedef struct _charformat {UINT cbSize;DWORD dwMask;DWORD dwEffects;LONG yHeight;LONG yOffset;COLORREF crTextColor;BYTE bCharSet;BYTE bPitchAndFamily;TCHAR szFaceName[LF_FACESIZE];} CHARFORMAT; Field NameDescriptioncbSize该结构的大小. RichEdit控件使用该域来判断该结构的版本是 CHARFORMAT 还是 CHARFORMAT2dwMask位标记, 用来指定下面的那些成员是有效的.CFM_BOLDdwEffects 成语中的 CFE_BOLD 值是有效的.CFM_CHARSETbCharSet 成员是有效的。CFM_COLORcrTextColor 成员跟 dwEffects中的 CFE_AUTOCOLOR 值是有效的.CFM_FACEszFaceName 成员是有效的.CFM_ITALICdwEffects 成员中的 CFE_ITALIC 值是有效的.CFM_OFFSETyOffset 成员是有效的.CFM_PROTECTEDdwEffects 成员中的 CFE_PROTECTED 值是有效的.CFM_SIZEyHeight 成员是有效的.CFM_STRIKEOUTdwEffects 成员中的 CFE_STRIKEOUT 值是有效的.CFM_UNDERLINEdwEffects 成员中的 CFE_UNDERLINE 值是有效的.dwEffects字符效果. 可以是以下值的组合CFE_AUTOCOLOR使用系统正文颜色CFE_BOLD粗体字符CFE_ITALIC斜体字符CFE_STRIKEOUT字符带删除线CFE_UNDERLINE字符带下划线CFE_PROTECTED字符是受保护的; 企图改变字体会产生一个EN_PROTECTED 通知消息. yHeight字符高度, 单位是 twips ( 1/1440 英寸 或者 1/20 的打印机的打印点). yOffset字符偏移,单位是 twips, 从基线算起.如果该成员是正值,字符是下标,如果负值,字符是下标. crTextColor 正文颜色. 如果指定了 CFE_AUTOCOLOR 字符效果,这个值会被忽略.bCharSet字符集bPitchAndFamilyFont family and pitch. szFaceName 字体名字,是一个空字符结尾的字符数组._wPad2填充通过检查这个结构,你会发现我们可以改变正文效果(粗体,斜体,删除线,下划线),正文颜色 (crTextColor) 和字体外观/大小/字符集. 值得注意的是 CFE_RPOTECTED 标志. 具有该标志的正文会被标志上受保护标志,意味着当用户试图改变它时, EN_PROTECTED 这个通知消息会被发送到父窗口.同时你可以允许该更改是是否可以进行.增加更多的正文风格,象字体权值,间距,正文背景色,字距调整等等.如果你不需要这些额外的功能,只要使用 CHARFORMAT即可. 要设置正文格式,你必须考虑你想要该格式应用到的正文的范围.RichEdit控件引入了字符正文范围的概念.RichEdit 分派给每个字符一个从0开始数字值:控件中的第一个字符具有数字ID值为0,第二个为1...等等。要说明一个正文范围,你必须提供给RichEdit控件两个数值:范围的第一个和最后一个字符的ID值。要跟 EM_SETCHARFORMAT 一起应用字符格式,你有最多3种选择: 应用于控件中的所有正文。 (SCF_ALL) 应用于当前选定的正文。 (SCF_SELECTION) 应用于当前选定的一个单词。 (SCF_WORD 或者 SCF_SELECTION) 第一、二种情况是直观的,最后一个选择需要一点解释。如果当前选择只覆盖了词中的一个或多个字符但是不是整个词,指定 SCF_WORD+SCF_SELECTION 标志将正文格式应用于整个单词。即使没有当前选定,只有插入点(光标)位于单词中,第三种情况下仍然会将正文格式应用到整个单词中。要使用 EM_SETCHARFORMAT, 你需要填充 CHARFORMAT (或者 CHARFORMAT2) 结构的结果成员。譬如,如果我们要设置正文颜色,需要如下一样填充 CHARFORMAT 结构:cf.dwMask = CFM_COLOR;cf.crTextColor = 0x0FF0000;SendMessage(hwndRichEdit,EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&cf); 以上的代码片段设置RichEdit控件的正文颜色为纯蓝色。注意当 EM_SETCHARFORMAT 发生时,如果控件中没有正文,在这个消息之后键入的正文将会使用消息 EM_SETCHARFORMAT 中指定的正文格式。