2009-02-12 4 views
24

Большинство примеров, которые я вижу, говорят, чтобы положить их в буфер обмена и использовать вставку, но это не кажется очень хорошим, потому что оно перезаписывает буфер обмена.Как вставить изображение в RichTextBox?

Я видел one method, который вручную помещал изображение в RTF с помощью pinvoke для преобразования изображения в wmf. Это лучший способ? Есть ли что-то более прямое, что я могу сделать?

ответ

47

Самый простой способ - изменить RTF-код, чтобы вставить изображение самостоятельно.

В формате RTF, картина определяется следующим образом:

'{' \ пикт (?? Brdr & затенение & picttype & pictsize & metafileinfo) данных '}' знак вопроса указывает на то, управляющее слово необязательный. «данные» - это просто содержимое файла в шестнадцатеричном формате. Если вы хотите использовать двоичный файл, используйте управляющее слово \ bin.

Например:

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

\ пикт = запускает группу картинок, \ pngblip = PNG изображение \ picwX = ширина изображения (Х представляет собой значение пикселя) \ pichX = высота расположения picture \ picwgoalX = желаемая ширина изображения в twips

Итак, чтобы вставить картинку, вам просто нужно открыть свое изображение, преобразовать данные в шестнадцатеричный, загрузить эти данные в строку и добавить туда коды RTF для определения изображения RTF. Теперь у вас есть личная строка с данными изображения, которые вы можете вставить в RTF-код документа. Не забывайте о закрытии «}»

Далее, вы получите код RTF из вашего RichTextBox (rtbBox.Rtf), вставить картинку в нужном месте и установить код rtbBox.Rtf

One вы можете столкнуться с тем, что .NET RTB не имеет очень хорошей поддержки стандарта RTF.

Я только что сделал небольшое приложение *, которое позволяет вам быстро протестировать некоторый RTF-код внутри RTB и посмотреть, как он его обрабатывает. Вы можете скачать его здесь: RTB tester (http://your-translations.com/toys).

Вы можете вставить некоторый RTF-контент (например, Word) в левое поле RTF и нажать «Показать RTF-коды», чтобы отобразить RTF-коды в правом поле RTF, или вы можете вставить RTF-код в правой RTB и нажмите «Применить RTF-коды», чтобы увидеть результаты с левой стороны.

Вы можете, конечно, редактировать коды по своему усмотрению, что делает его весьма удобным для проверки того, поддерживает ли RichTextBox требуемые команды или узнает, как использовать управляющие слова RTF.

Вы можете скачать полную спецификацию для RTF онлайн.


NB Это просто немного, что я ударил вместе в течение 5 минут, так что я не выполнил файл открыть или сохранить, перетаскивание, или другой цивилизованный материал.

+1

Я не мог заставить RTB показывать png, но по крайней мере он показывает wmf. –

+0

1 "twip" = 1/20 точки. 1 точка ~ 1,333 пикселя (это зависит от разрешения экрана, большинство мониторов сегодня выполняют 96 пикселей на дюйм в собственном разрешении, так что это так) – KeithS

4

Вот что мне делать, чтобы взломать форматированный текст управление:

Вставьте требуемое изображение в WordPad или MS-WORD. Сохраните файл как 'rtf'. Откройте файл rtf в блокноте, чтобы увидеть необработанный код rtf. Скопируйте необходимые теги & в свойство 'rtf' вашего Rich Text Box (добавьте существующий текст).

Существует несколько проб и ошибок, но работает.

С помощью C# я использую объекты для размещения объектов StringBuilder с необходимым кодом rtf. Затем я просто добавляю путь к изображению.

Это обходной путь для того, чтобы не изучать синтаксис RTF.

+3

Это уродливое решение, о котором я когда-либо слышал. – 2010-08-08 14:45:39

+0

Я ищу «Как вставить изображение в Richtextbox» с утра, Но все это фургон. После прочтения этого ответа я надел его менее чем за 180 секунд. +1 для вас. –

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); 
      } 
     } 
    } 
+5

'== true' - буквально самый бесполезный код, который я когда-либо видел. – Nyerguds

11

Я использую следующий код, чтобы сначала получить данные из буфера обмена, сохранить его в памяти, установить изображение в буфер обмена, вставьте его в 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 являются Open File Dialog, Rich Text Box и кнопки управления соответственно.

+1

Честно говоря, я скептически относился к этому решению.Я имею в виду, если у вас уже есть изображение в буфере обмена (в моем случае), а затем снятие его с буфера обмена и его повторное включение не должно ничего делать. Но ПОТОМУ ЧТО этот точный трюк работал как сон. СПАСИБО! – Jerry

+0

Не могу поверить, что это сработало, вы гений .... –

+0

Что произойдет, если Richtextbox Read only Свойство установлено как true? Этот метод буфера обмена будет терпеть неудачу. –

0

Я также искал что-то для этой же задачи и нашел, что это ->

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

Вы можете создать любой тип RTF текст, который вы хотите, и затем использовать его по своему усмотрению. Очень хорошо структурированный пример, который автоматически распознает используемый тип изображения (jpg/jpeg/png и т. Д.) И будет работать с файлами изображений, которые я использовал. Если вы спешите, это отличный генератор RTF!

0

Все, что я сделал, это сделать небольшой элемент управления изображением в C# и убедиться, что он скрыт за другим объектом, достаточно большим, чтобы скрыть его. Затем я сделал кнопку, чтобы вставить изображение, и он загрузил pictureBox с изображением, затем он помещает его в 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(); 
     } 

    } 
} 
Смежные вопросы