2009-02-12 72 views

Respuesta

47

La manera más directa sería modificar el código RTF para insertar la imagen usted mismo.

En RTF, una imagen se define así:

'{' \ PICT (??? Brdr & sombreado & picttype & pictsize & metafileinfo) de datos '}' Un signo de interrogación indica la palabra de control es Opcional. "datos" es simplemente el contenido del archivo en formato hexadecimal. Si desea usar binario, use la palabra de control \ bin.

Por ejemplo:

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

\ PICT = inicia un grupo de imágenes, \ pngblip = imagen png \ picwX = ancho de la imagen (X es el valor de píxel) \ pichX = altura de la picture \ picwgoalX = ancho deseado de la imagen en twips

Por lo tanto, para insertar una imagen, solo tiene que abrir la imagen, convertir los datos a hexadecimal, cargar estos datos en una cadena y agregar los códigos RTF a su alrededor para definir una imagen RTF. Ahora, tiene una cadena independiente con datos de imagen que puede insertar en el código RTF de un documento. No se olvide el cierre "}"

A continuación, se obtiene el código RTF desde su RichTextBox (rtbBox.Rtf), insertar la imagen en el lugar adecuado y de establecer el código de rtbBox.Rtf

Uno El problema con el que se puede encontrar es que .NET RTB no tiene un soporte muy bueno del estándar RTF.

Acabo de hacer una pequeña aplicación * que le permite probar rápidamente algún código RTF dentro de un RTB y ver cómo lo maneja. Puede descargarlo aquí: RTB tester (http://your-translations.com/toys).

Puede pegar un poco de contenido RTF (desde Word, por ejemplo) en el cuadro RTF izquierdo y hacer clic en "Mostrar códigos RTF" para mostrar los códigos RTF en el cuadro RTF derecho, o puede pegar el código RTF en derecha RTB y haga clic en "Aplicar códigos RTF" para ver los resultados en el lado izquierdo.

Puede, por supuesto, editar los códigos como desee, lo que lo hace bastante conveniente para probar si RichTextBox admite o no los comandos que necesita, o aprender a usar las palabras de control RTF.

Puede descargar la especificación completa de RTF en línea.


NB Es sólo una pequeña cosa que una palmada juntos en 5 minutos, por lo que no puso en práctica abrir el archivo o guardarlo, arrastrar y soltar, o la otra materia civilizada.

+1

No pude conseguir que RTB muestre pngs, pero al menos muestra wmf. –

+0

1 "twip" = 1/20 de punto. 1 punto ~ 1.333 píxeles (esto depende de la resolución de la pantalla; la mayoría de los monitores actuales tienen 96 píxeles por pulgada en su resolución original) – KeithS

4

Aquí es lo que hago para cortar los ricos control de texto:

Insertar la imagen requerida en WordPad o MS-WORD. Guarde el archivo como 'rtf'. Abra el archivo rtf en el bloc de notas para ver el código rtf sin formato. Copie las etiquetas requeridas & a la propiedad 'rtf' de su cuadro de texto enriquecido (anexe al texto existente).

Hay un poco de prueba y error pero funciona.

Con C#, utilizo los objetos StringBuilder del marcador de posición con el código rtf necesario. Luego añado la ruta de la imagen.

Esto es una solución para no tener que aprender la sintaxis de RTF.

+3

Esa es la solución más fea que he escuchado. –

+0

Estoy buscando "Cómo insertar una imagen en Richtextbox" desde la mañana, pero todo es van. Después de leer esta respuesta, la puse en menos de 180 segundos. +1 para ti. –

0

Si estuvo en C++, la forma de hacerlo es a través de OLE. Más específicamente, si busca en Google ImageDataObject, mostrará el código C++ cómo insertar un HBITMAP en el control RTF. Un enlace es here.

Ahora, cómo esto se traduce en el código .NET, no sé. Actualmente no tengo tiempo para trabajar a través de los detalles.

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' es literalmente el código más inútil que he visto. – Nyerguds

11

uso el siguiente código para conseguir primero los datos desde el portapapeles, guardarlo en la memoria, ajustar la imagen en el portapapeles, pegarla en el recuadro de texto enriquecido y finalmente restaurar los datos en el portapapeles.

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 

El OpenFileDailog1, RichTextBox1 y Button1 son de diálogo Abrir archivo, cuadro de texto enriquecido y los botones de control, respectivamente.

+1

Para ser sincero, era escéptico de esta solución.Quiero decir, si ya tiene una imagen en el portapapeles (en mi caso), sacarla del portapapeles y volver a ponerla en su lugar no debería hacer nada. Pero de alguna manera este truco exacto funcionó como un sueño. ¡GRACIAS! – Jerry

+0

No puedo creer que funcionó, eres un genio .... –

+0

¿Qué ocurre si Richtextbox Solo lectura se establece como verdadero? Este método de portapapeles será fallido. –

0

Yo también estaba buscando algo para esta misma tarea y encontré esto ->

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

Se puede generar cualquier tipo de texto RTF que usted quiere y luego usarlo como desee. Ejemplo muy bien estructurado que detectará automáticamente el tipo de imagen que se usa (jpg/jpeg/png, etc.) y funcionó para los archivos de imagen que he estado usando. Si tienes prisa, ¡este es un gran generador de RTF!

0

Todo lo que hice fue hacer un pequeño control pictureBox en C# y me aseguré de que estuviera escondido detrás de otro objeto lo suficientemente grande como para ocultarlo. Luego hice un botón para insertar una imagen, y cargó el pictureBox con la imagen, luego lo coloca en richTextBox y luego borra el control PictureBox.

Aquí está el código.

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

Mi propia versión que publiqué en un nuevo hilo, aparentemente debería haberla buscado y publicado aquí. De todos modos, usando el portapapeles de nuevo, es muy fácil.

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

    } 
} 
Cuestiones relacionadas