RichEditCtrl是一款富文本编辑器控件,相对于CEdit来说,其功能更加强大。另外,它自带RTF格式文本的解析功能。今天就总结一下我在使用这款控件的一些经验。
关于RichEditCtrl的版本
随着Windows每次版本的发布,RichEditCtrl的版本也在不断升级。从最初的1.0版本一直到目前最新的4.1版本。以下版本历史来自的MSDN:
![517f2e374578461d9b88878beba2bb06.png](https://i-blog.csdnimg.cn/blog_migrate/d0f13258f1c6ce0718d26f134d6dc9ce.jpeg)
这里需要注意的是,1.0版本对应的DLL文件是Riched32.dll,2.0和3.0对应的DLL文件是Riched20.dll,最新的4.1对应的DLL是Msftedit.dll。另外,1.0~3.0对应的Window Class名称没有变,这样,应用程序就可以无缝使用各个版本而无需修改代码。对于各个DLL文件,我们可以在system32目录下找到它们。
关于RichEditCtrl的初始化
在MFC应用程序中使用RichEditCtrl控件之前,必须要在InitInstance中初始化该控件,如下所示:
![c3404750abe237db8c5111502c3d05d1.png](https://i-blog.csdnimg.cn/blog_migrate/a1d5c7ef4b1ca3a5b5e4a850ce0ee62b.jpeg)
这里的AfxInitRichEdit2将尝试加载Riched20.dll这个DLL,并返回加载是否成功的结果。如果想使用1.0版本,还有对应的AfxInitRichEdit可供调用。
如何载入内容到RichEditCtrl控件
RichEditCtrl控件有个方法StreamIn,我们可以使用这个方法将我们需要显示在控件的内容渲染到控件上。该函数原型如下:
long StreamIn(int nFormat, EDITSTREAM& es);
该方法的工作原理:调用方需要提供一个回调函数指针,该回调函数周期性的拷贝文本内容到控件缓冲区,直到文本内容全部拷贝完毕。
以下代码演示了该回调函数的使用:
![52e3c762fc92e456c625fff55264e5e8.png](https://i-blog.csdnimg.cn/blog_migrate/2d3ff82ae07ace48cbd1e592aa52ebb7.jpeg)
回调函数如下:
![b2ad658bfba91d3f3f997d2353ef2a44.png](https://i-blog.csdnimg.cn/blog_migrate/2aaf3217c2c24edd710b0fd13ccfbae5.jpeg)
如何使用最新版4.1的控件
在默认情况下,我们从VS工具箱拖出来的控件为2.0版本。那么如何使用最新的4.1版本呢?
首先,我们需要在CWinApp的InitInstance中加载4.1对应的DLL:Msftedit.dll,示例代码如下:
![0d6157435b46f7c44f4c94eeb55dfc73.png](https://i-blog.csdnimg.cn/blog_migrate/a55bfa32eb73509b6515c423bf5d1c4c.jpeg)
别忘了在ExitInstance中释放该Lib,示例代码如下:
![838122a75acfcf0c9b5cb21b88944d88.png](https://i-blog.csdnimg.cn/blog_migrate/23d46f3a7905f732e25ea0065014b19a.jpeg)
然后,打开rc文件,进入文本编辑模式,将”RichEdit20W”改为”RichEdit50W”,保存后编译工程,就可以通过Spy++查看控件已经升级到4.1版本了.
今天总结了关于CRichEditCtrl的一些开发经验,详细的使用方法,请大家参考MSDN中的相关内容。