读书人

小弟我该怎么把一幅图片插入到C# .NET

发布时间: 2013-08-04 18:26:15 作者: rapoo

我该如何把一幅图片插入到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,也会花费大量的运算时间,这个方法虽然保证了图片的完整性,但大大牺牲了系统性能。也是个下策


3、仍是一个manager类,不过在后台重载WndProc消息和ProcessCmdKey,监控所有的编辑消息,建立一个基于plainText纯文本的index来维护图片,这样可以根据index作为key来查找id或者name。但是这个方法,我一向觉得疯子才会用。光是粘贴的消息,就能通过ctrl+v和shift+insert来发送,也可以通过右键粘贴来发送,而这两者在WndProc中是不同的消息。
总之我疯了。
是的,被一个RichTextBox搞了整整一个周,谁能不疯。
我数据库和网络方面还没弄呢!
//我甚至用语言翻译工具把我的问题翻译成俄文贴到俄罗斯论坛那边。
于是如果大家能帮我解决这个问题。
我也会疯了地撒花。
当然包括分数。
请拯救一个疯子。 NET RichTextBox 图片 C# 控件
[解决办法]
我有个思路.首先我用的是RIchtetbox.我把他重写了可以显示GIF图片,

/// <summary>
/// 添加一个文件资源到RTF数据
/// </summary>
/// <param name="p_FileFullPath">文件路径</param>
public void AddFile(string p_FileFullPath)
{
int i = p_FileFullPath.LastIndexOf(@"\");
string dasdasd = p_FileFullPath.Substring(i, p_FileFullPath.Length - i);
dasdasd = dasdasd.Substring(1, dasdasd.Length - 2);
dasdasd = dasdasd.Replace("-", "");
dasdasd = dasdasd.Substring(0, dasdasd.Length - 3).ToUpper();
byte[] _FileBytes = File.ReadAllBytes(p_FileFullPath);
Image _Image = Image.FromStream(new MemoryStream(_FileBytes));
string _Guid = BitConverter.ToString(Guid.NewGuid().ToByteArray()).Replace("-", "");
StringBuilder _RtfText = new StringBuilder(@"{\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe2052{\fonttbl{\f0\fnil\fcharset134 \'cb\'ce\'cc\'e5;}}\uc1\pard\lang2052\f0\fs18{\object\objemb{\*\objclass Paint.Picture}");//


int _Width = _Image.Width * 15;
int _Height = _Image.Height * 15;
_RtfText.Append(@"\objw" + _Width.ToString() + @"\objh" + _Height.ToString());
_RtfText.AppendLine(@"{\*\objdata");
_RtfText.AppendLine(@"010500000200000007000000504272757368000000000000000000" + BitConverter.ToString(BitConverter.GetBytes(_FileBytes.Length + 20)).Replace("-", ""));
_RtfText.Append("7A676B65" + dasdasd);//标记
//_RtfText.Append("7A676B65" + _Guid);
_RtfText.AppendLine(BitConverter.ToString(_FileBytes).Replace("-", ""));
_RtfText.AppendLine(@"0105000000000000}{\result{\pict\wmetafile0}}}}");
base.SelectedRtf = _RtfText.ToString();
}



这个是代码.就是显示GIF用的.其中有一段使用到了GUID的这个.唯一标识.我就让图片的名称变成唯一标识符号.这样.在rtf中就可以直接获取"7A676B65"后面的32位就是图片的名称.在稍微处理下加上'-' .gif 就出来了图片的名称.我想了几天才想到 的哦.亲.有什么我没说清楚的就问我.我就不能提供详细的代码给你了,因为我也是一个小菜鸟.只是想到了思路.小弟我该怎么把一幅图片插入到C# .NET控件中的RichTextBox,同时还能把该图片的id或者名字嵌入进去
[解决办法]
用JQ来套一个div层不知道行不行
[解决办法]
直接获取id和图片名,然后插进去不行吗?

读书人网 >C#

热点推荐