我看到的大多数示例都会将它放在剪贴板上并使用粘贴,但这看起来不太好,因为它会覆盖剪贴板。如何将图像插入RichTextBox?
我确实看到one method手动将图像插入RTF使用pinvoke将图像转换为wmf。这是最好的方法吗?有没有更直接的事情可以做?
我看到的大多数示例都会将它放在剪贴板上并使用粘贴,但这看起来不太好,因为它会覆盖剪贴板。如何将图像插入RichTextBox?
我确实看到one method手动将图像插入RTF使用pinvoke将图像转换为wmf。这是最好的方法吗?有没有更直接的事情可以做?
最直接的方法是修改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 tester(http://your-translations.com/toys)。
您可以将一些RTF内容(例如Word)粘贴到左RTF框中,然后单击“显示RTF代码”以在右RTF框中显示RTF代码,或者可以将RTF代码粘贴到右RTB并点击“应用RTF代码”查看左侧的结果。
您当然可以编辑代码,这样可以非常方便地测试RichTextBox是否支持您需要的命令,或者学习如何使用RTF控制字。
您可以在线下载RTF的完整规格。
NB这只是我在5分钟内拼凑一个小东西,所以我没有实现文件打开或保存,拖放,或其他文明的东西。
这是我做破解富文本控件:
插入在写字板或MS-WORD所需要的图像。将文件保存为'rtf'。在记事本中打开rtf文件以查看原始rtf代码。将所需标记&复制到Rich Text Box的“rtf”属性(附加到现有文本)。
有一些试验和错误,但涉及作品。
随着C#,我用占位符StringBuilder对象与必要的rtf代码。然后我只是追加图像路径。
这是不必学习RTF语法的解决方法。
这是我听说过的最丑陋的解决方案。 – 2010-08-08 14:45:39
我从早晨开始搜索“如何在Richtextbox中插入图像”,但都是面包车。读完这个答案后,我已经在180秒内完成了。为你+1。 – 2013-05-31 18:34:34
如果您使用C++,则通过OLE执行此操作。更具体地说,如果您搜索Google ImageDataObject,它将显示C++代码如何将HBITMAP插入到RTF控件中。一个链接是here。
现在,这怎么翻译成.Net代码,我不知道。我目前没有时间通过细节工作。
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);
}
}
}
我用下面的代码首先从剪贴板中获取数据,将其保存在内存中,在剪贴板中设定的图像,将其粘贴在富文本框,并终于在剪贴板中恢复数据。
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打开文件对话框,分别为格式文本框和按钮控件。
我也一直在寻找的东西完成相同的任务,发现了这个 - >
http://sourceforge.net/projects/netrtfwriter/
您可以生成任何类型的RTF文本的,你想,然后用它自己的喜好。结构非常好的例子,它会自动感知正在使用的图像类型(jpg/jpeg/png等),并为我一直使用的图像文件工作。如果你匆忙,那么这是一个伟大的RTF发电机!
我所做的只是在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();
}
}
}
我自己的版本,我张贴在一个新的线程,显然我应该搜索并张贴在这里。无论如何,再次使用剪贴板,非常容易。
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();
}
}
}
我无法让RTB显示PNG,但至少它确实显示了WMF。 – 2009-11-08 13:32:15
1“twip”= 1/20的一个点。 1点〜1.333像素(这取决于屏幕分辨率;今天大多数显示器的原始分辨率为每英寸96像素,所以这成立) – KeithS 2016-01-18 21:15:57