我看到的大多数例子都说要把它放在剪贴板上并使用粘贴,但这似乎不是很好,因为它会覆盖剪贴板.
我确实看到一种方法,使用pinvoke手动将图像放入RTF,将图像转换为wmf.这是最好的方法吗?我还能做更直接的事吗?
最直接的方法是修改RTF代码以自己插入图片.
在RTF中,图片的定义如下:
'{'\ pict(brdr?&shading?&picttype&pictsize&metafileinfo?)data'}'问号表示控制字是可选的."data"只是十六进制格式的文件内容.如果要使用二进制文件,请使用\ 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 =图片的所需宽度,以缇为单位
因此,要插入图片,只需打开图片,将数据转换为十六进制,将这些数据加载到字符串中,并在其周围添加RTF代码以定义RTF图片.现在,您有一个包含图片数据的自包含字符串,您可以将其插入文档的RTF代码中.不要忘记关闭"}"
接下来,从RichTextBox(rtbBox.Rtf)获取RTF代码,将图片插入适当的位置,并设置rtbBox.Rtf的代码
您可能遇到的一个问题是.NET RTB对RTF标准没有很好的支持.
我刚刚制作了一个小应用程序*,它允许您快速测试RTB中的一些RTF代码并查看它如何处理它.您可以在此处下载: RTB测试仪(http://your-translations.com/toys).
您可以将一些RTF内容(例如,从Word)粘贴到左侧RTF框中,然后单击"显示RTF代码"以在右侧RTF框中显示RTF代码,或者您可以在右侧RTB中粘贴RTF代码并单击在"应用RTF代码"上查看左侧的结果.
您当然可以根据需要编辑代码,这样可以非常方便地测试RichTextBox是否支持您需要的命令,或者学习如何使用RTF控制字.
您可以在线下载RTF的完整规范.
NB这只是我在5分钟内拍了一下的小东西,所以我没有实现文件打开或保存,拖放或其他文明的东西.
我使用以下代码首先从剪贴板获取数据,将其保存在内存中,将图像设置在剪贴板中,将其粘贴到Rich Text Box中,最后在剪贴板中恢复数据.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click OpenFileDialog1.Filter = "All files |*.*" OpenFileDialog1.Multiselect = True Dim orgdata = Clipboard.GetDataObject If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then For Each fname As String In OpenFileDialog1.FileNames Dim img As Image = Image.FromFile(fname) Clipboard.SetImage(img) RichTextBox1.Paste() Next End If Clipboard.SetDataObject(orgdata) End Sub
OpenFileDailog1,RichTextBox1和Button1分别是打开文件对话框,富文本框和按钮控件.
private void toolStripButton1_Click(object sender, EventArgs e) { FileDialog fDialog = new OpenFileDialog(); fDialog.CheckFileExists = true; fDialog.CheckPathExists = true; fDialog.RestoreDirectory = true; fDialog.Title = "Choose file to import"; if (fDialog.ShowDialog() == DialogResult.OK) { string lstrFile = fDialog.FileName; Bitmap myBitmap = new Bitmap(lstrFile); // Copy the bitmap to the clipboard. Clipboard.SetDataObject(myBitmap); DataFormats.Format format = DataFormats.GetFormat(DataFormats.Bitmap); // After verifying that the data can be pasted, paste if(top==true && this.rtTop.CanPaste(format)) { rtTop.Paste(format); } if (btmLeft == true && this.rtBottomLeft.CanPaste(format)) { rtBottomLeft.Paste(format); } if (btmCenter == true && this.rtBottomCenter.CanPaste(format)) { rtBottomCenter.Paste(format); } if (btmRight == true && this.rtBottomRight.CanPaste(format)) { rtBottomRight.Paste(format); } } }