我看到的大多數示例都會將它放在剪貼板上並使用粘貼,但這看起來不太好,因爲它會覆蓋剪貼板。如何將圖像插入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