众所周知,富文本控件,Rich Text Control,用来呈现文本内容的一个控件,功能上相对记事本来说更加丰富,但又不及 Word。
但,我们的目标又不是开发另外一个 Word。
我们可以使用 EM_STREAMIN 消息将整个文件加载到富文本控件,此消息接受一个 IStream 的数据源,并一次性地将整个文件的内容加载的控件上。听起来,是不是还不错?
如果你 MSDN 上阅读了关于 EM_STREAMIN 的更多信息,则可以很容易地理解它的基本用法,我们来看看下面的例子。
>> 请移步至 www.topomel.com 以查看图片 <<
上面的代码,你可以先自行体会一下。
EM_STREAMIN 消息希望告知它流的格式 (SF_RTF) 并提供指向控制输入的 EDITSTREAM 结构的指针。由于我们要从文件中读取,因此我们打开一个文件进行读取,并将其用作 EditStreamCallback 的 dwCookie。唯一棘手的部分是获取回调的正确返回值。出于某种原因,富文本控件希望在成功时为零,在失败时为非零,因此我们需要相应地翻转 ReadFile 返回值的意义。除此之外,没有什么其他高深的东西。
“但是我试过了这个,只有文件的第一行被读入。我做错了什么?”
啊,一个典型的菜鸟错误。在创建富文本控件时,你可能忘记设置ES_MULTILINE样式。
别担心,我也犯了这个错误。
“如果我的数据不是文件,该怎么办?”
只要可以编写生成接下来几个字节数据的函数,就可以将其流式传输到富文本控件中。例如,下面是一个将任意 IStream 加载到丰富的编辑控件中的版本:
>> 请移步至 www.topomel.com 以查看图片 <<
在上面的代码中,仍然存在一个Bug,并且它不是我们所期望的。你发现了吗?
总结
这个小技巧,值得记录,因为载入文件到富文本控件这个需求,几乎总是时不时的冒出来,以后有这个需求了,直接看此文即可知道如何下手了。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《How do I load an entire file into a rich text control?》