日期:2014-05-17  浏览次数:20868 次

我该如何把一幅图片插入到C# .NET控件中的RichTextBox,同时还能把该图片的id或者名字嵌入进去?
本帖最后由 seasonhdyy 于 2013-04-10 23:31:24 编辑
How can I insert an image with an id to a RichTextBox in .NET?
I just came across a problem with RichTextBox in .NET.

Using http://www.codeproject.com/Articles/4544/Insert-Plain-Text-and-Images-into-RichTextBox-at-R I can insert an image to the RichTextBox. Then what I want is that when the image in the RichTextBox is clicked, a MessageBox pops-up showing its name or id.

My question is: how can I embed the name or id of the image into the rtf of the RichTextBox?

I have tried to add parameters into the rtf string using: {\pict{\pictName myName}{\pictID myID}\wmetafile8...} and then set to richtextbox1.Rtf; but I found that there are still no parameters in

 richtextbox1.Rtf:{\pict\wmetafile8...}
Is there any other way, except comparing the whole WmfBits to the list in the background, to get the image's name or id?

Thanks in advance.

以上方便外籍人员阅读。
我现在遇到这个需求,打算在RichTextBox中插入图片,并同时能把它的ID或者Name属性嵌入到rtf字符串中。
根据http://www.codeproject.com/Articles/4544/Insert-Plain-Text-and-Images-into-RichTextBox-at-R我得到了往RichTextBox中插入图片的方法。但是很遗憾的是,我目前还没有一个很好的解决办法能把该图片的ID或者姓名同时插入进去。
我曾经尝试过往该图片的rtf字符串中添加参数。原本图片的rtf字符串是
{\pict\wmetafile8...}
我添加了参数的rtf字符串是
{\pict{\pictName myName}{\pictID myID}\wmetafile8...}
然后我把修改后的rtf字符串set到我的richtextbox控件的Rtf属性上。
已知Rtf可以添加自定义参数,并且rtf的阅读器都具有忽略不识别的参数的功能的。
所以我修改后的rtf字符串是符合规范的。
但是当我set之后,然后get该richtextbox的rtf字符串时,却得到了没有添加参数的原始字符串:
{\pict\wmetafile8...}
意思就是我的自定义参数被过滤掉了。
请问大家,RichTextBox中,是否有函数能进行相关自定义参数的设置?
我反编译了微软的System.Windows.Forms;然后找到了richtextbox的官方控件代码。貌似有12万行。我当时很晕就没有进行仔细分析。总之MSDN上我是没有找到很清楚的说明。总之我实在不能花太大的精力在这个小控件上,老师在催成果了,现在每天都很愁……
我现在只能想出两个折中的办法。
1、把ID嵌入到metafile字符串中。已知RichTextBox所使用的RTF规范中,图片是作为\pict嵌入的,在一串属性之后,便是代表图片像素点的metafile的16进制字符串(下简称metafile字符串)。详情请参见我百度来的rtf格式的解释
http://blog.163.com/nightice@126/blog/static/23355781200762045646957/
而在metafile的16进制字符串中,从第217位开始,每6位可以算是一个像素点(我是这么理解的,虽然metafile是号称基于矢量和点阵的,我也没有深入理解,大家请见谅)。那么我就把217~222位所代表的像素点去掉,以及以一个像素点的丢失为代价,嵌入我的字符串的ID。总共能嵌入16^6=16777216个图片ID,已经满足我的需求了。但是这个方法首先破坏了图片的完整性,其次我也没有搞清楚metafile的具体结构,具有危险性,是个下策
2、在我的后台建立一个manager类,管理整个RichTextBox中的图片,提供整个RichTextBox中的图片和其ID的对应关系。唔……就是,我把每个图片的metafile字符串作为key,然后在manager类中提供对应该key进行查找id和name的工作。这也很无奈啊,要知道metafile字符串往往都是kb级大小的,不得不说即使使用StringBuilder,也会花费大量的运算时间,这个方法虽然保证了图片的完整性,但大大牺牲了系统性能。也是个下策