2009-02-12 84 views
24

我看到的大多数示例都会将它放在剪贴板上并使用粘贴,但这看起来不太好,因为它会覆盖剪贴板。如何将图像插入RichTextBox?

我确实看到one method手动将图像插入RTF使用pinvoke将图像转换为wmf。这是最好的方法吗?有没有更直接的事情可以做?

回答

47

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

在RTF,画面被定义如下:

'{' \ PICT(????BRDR &遮光& picttype & pictsize & metafileinfo)数据 '}' 的问号表示控制字是可选的。 “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 testerhttp://your-translations.com/toys)。

您可以将一些RTF内容(例如Word)粘贴到左RTF框中,然后单击“显示RTF代码”以在右RTF框中显示RTF代码,或者可以将RTF代码粘贴到右RTB并点击“应用RTF代码”查看左侧的结果。

您当然可以编辑代码,这样可以非常方便地测试RichTextBox是否支持您需要的命令,或者学习如何使用RTF控制字。

您可以在线下载RTF的完整规格。


NB这只是我在5分钟内拼凑一个小东西,所以我没有实现文件打开或保存,拖放,或其他文明的东西。

+1

我无法让RTB显示PNG,但至少它确实显示了WMF。 – 2009-11-08 13:32:15

+0

1“twip”= 1/20的一个点。 1点〜1.333像素(这取决于屏幕分辨率;今天大多数显示器的原始分辨率为每英寸96像素,所以这成立) – KeithS 2016-01-18 21:15:57

4

这是我做破解富文本控件:

插入在写字板或MS-WORD所需要的图像。将文件保存为'rtf'。在记事本中打开rtf文件以查看原始rtf代码。将所需标记&复制到Rich Text Box的“rtf”属性(附加到现有文本)。

有一些试验和错误,但涉及作品。

随着C#,我用占位符StringBuilder对象与必要的rtf代码。然后我只是追加图像路径。

这是不必学习RTF语法的解决方法。

+3

这是我听说过的最丑陋的解决方案。 – 2010-08-08 14:45:39

+0

我从早晨开始搜索“如何在Richtextbox中插入图像”,但都是面包车。读完这个答案后,我已经在180秒内完成了。为你+1。 – 2013-05-31 18:34:34

0

如果您使用C++,则通过OLE执行此操作。更具体地说,如果您搜索Google ImageDataObject,它将显示C++代码如何将HBITMAP插入到RTF控件中。一个链接是here

现在,这怎么翻译成.Net代码,我不知道。我目前没有时间通过​​细节工作。

6
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); 
      } 
     } 
    } 
11

我用下面的代码首先从剪贴板中获取数据,将其保存在内存中,在剪贴板中设定的图像,将其粘贴在富文本框,并终于在剪贴板中恢复数据。

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打开文件对话框,分别为格式文本框和按钮控件。

0

我也一直在寻找的东西完成相同的任务,发现了这个 - >

http://sourceforge.net/projects/netrtfwriter/

您可以生成任何类型的RTF文本的,你想,然后用它自己的喜好。结构非常好的例子,它会自动感知正在使用的图像类型(jpg/jpeg/png等),并为我一直使用的图像文件工作。如果你匆忙,那么这是一个伟大的RTF发电机!

0

我所做的只是在c#中创建一个小图片框控件,并确保它隐藏在另一个足以隐藏它的对象后面。然后,我做了一个按钮来插入一张图片,并将图片加载到图片框中,然后将图片放入richTextBox中,然后清除pictureBox控件。

这是代码。

private void InsertPicture_Click(object sender, EventArgs e) 
    { 

        { 
      if (openFileDialog4.ShowDialog() == DialogResult.OK) 
      { 
       // Show the Open File dialog. If the user clicks OK, load the 
       // picture that the user chose. 
       pictureBox2.Load(openFileDialog4.FileName); 
       Clipboard.SetImage(pictureBox2.Image); 
       pictureBox2.Image = null; 
       this.richTextBox1.Paste(); 

      } 
    } 
} 
0

我自己的版本,我张贴在一个新的线程,显然我应该搜索并张贴在这里。无论如何,再次使用剪贴板,非常容易。

private 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(); 
     } 

    } 
}