如何将图像插入RichTextBox?

我看到的大多数示例都说要把它放在剪贴板上并使用粘贴,但这似乎不是很好,因为它会覆盖剪贴板。

我确实看到一种方法 ,使用pinvoke手动将图像放入RTF,将图像转换为wmf。 这是最好的方法吗? 我还能做更直接的事吗?

最直接的方法是修改RTF代码以自己插入图片。

在RTF中,图片的定义如下:

‘{‘\ pict(brdr?&shading?&picttype&pictsize&metafileinfo?)data’}’问号表示控制字是可选的。 “data”只是hex格式的文件内容。 如果要使用二进制文件,请使用\ bin控制字。

例如:

{\pict\pngblip\picw10449\pich3280\picwgoal5924\pichgoal1860 hex data} {\pict\pngblip\picw10449\pich3280\picwgoal5924\pichgoal1860\bin binary data} 

\ pict =开始一个图片组,\ pngblip = png图片\ picwX =图片的宽度(X是像素值)\ pichX =图片的高度\ picwgoalX =图片的所需宽度,以缇为单位

因此,要插入图片,您只需打开图片,将数据转换为hex,将这些数据加载到字符串中,并在其周围添加RTF代码以定义RTF图片。 现在,您有一个包含图片数据的自包含字符串,您可以将其插入文档的RTF代码中。 别忘了关闭“}”

接下来,从RichTextBox(rtbBox.Rtf)获取RTF代码,将图片插入适当的位置,并设置rtbBox.Rtf的代码

您可能遇到的一个问题是.NET RTB对RTF标准没有很好的支持。

我刚刚创建了一个小应用程序*,它允许您快速测试RTB中的一些RTF代码并查看它如何处理它。 您可以在此处下载: RTB测试仪 ( http://sofzh.miximages.com/c%23/ppre codeprivate void button1_Click(object sender, EventArgs e) { openFileDialog1.Filter = Images .bmp;*.jpg;*.png;*.gif;*.ico”; openFileDialog1.Multiselect = false; openFileDialog1.FileName = “”; DialogResult result = openFileDialog1.ShowDialog(); if (result == DialogResult.OK) { Image img = Image.FromFile(openFileDialog1.FileName); Clipboard.SetImage(img); richTextBox1.Paste(); richTextBox1.Focus(); } else { richTextBox1.Focus(); } } }

如果您使用的是C ++,那么执行此操作的方法是通过OLE。 更具体地说,如果您在Google上搜索ImageDataObject,它将显示如何将HBITMAP插入RTF控件的C ++代码。 一个链接在这里 。

现在,我不知道这如何转化为.Net代码。 我目前没有时间通过​​细节工作。

我也在寻找同样的任务,发现了这个 – >

http://sofzh.miximages.com/c%23/ assuming the image is in your Resources var img = Resources.ImageWithTransparentBckgrnd; var g = Graphics.FromImage(img); using (var ms = new MemoryStream()) { img.Save(ms, ImageFormat.Png); IntPtr ipHdc = g.GetHdc(); Metafile mf = new Metafile(ms, ipHdc); g = Graphics.FromImage(mf); g.FillEllipse(Brushes.White, 0, 0, 16, 16); // size you want to fill in g.Dispose(); mf.Save(ms, ImageFormat.Png); IDataObject dataObject = new DataObject(); dataObject.SetData(“PNG”, false, ms); Clipboard.SetDataObject(dataObject, false); richTextBox1.Paste(); SendKeys.Send(“{RIGHT}”); richTextBox1.Focus(); }