2009-02-12 14 views
24

Die meisten der Beispiele, die ich sehe, sagen, um es in die Zwischenablage zu legen und einfügen, aber das scheint nicht sehr gut zu sein, weil es die Zwischenablage überschreibt.Wie kann ich ein Bild in eine RichTextBox einfügen?

Ich habe one method gesehen, die das Bild manuell in die RTF unter Verwendung eines pinvoke setzen, um das Bild in ein WMF umzuwandeln. Ist das der beste Weg? Gibt es etwas Einfacheres, was ich tun kann?

Antwort

47

Der einfachste Weg wäre, den RTF-Code zu ändern, um das Bild selbst einzufügen.

In RTF, ein Bild wie folgt definiert ist:

'{' \ PICT (??? Brdr & Schattierungs & picttype & pictsize & metafileinfo) data '}' Ein Fragezeichen gibt das Steuerwort ist, wahlweise. "Daten" ist einfach der Inhalt der Datei im Hex-Format. Wenn Sie eine Binärdatei verwenden möchten, verwenden Sie das Steuerwort \ bin.

Zum Beispiel:

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

\ pict = startet eine Bildgruppe, \ pngblip = PNG-Bild \ picwX = Breite des Bildes (X ist der Pixelwert) \ pichX = Höhe der Bild \ picwgoalX = gewünschte Breite des Bildes in Twips

Also, um ein Bild einzufügen, müssen Sie nur Ihr Bild öffnen, konvertieren Sie die Daten in hex, laden Sie diese Daten in eine Zeichenfolge und fügen Sie die RTF-Codes um um ein RTF-Bild zu definieren. Jetzt haben Sie eine eigenständige Zeichenfolge mit Bilddaten, die Sie in den RTF-Code eines Dokuments einfügen können. Sie nicht die Schließung vergessen „}“

Als nächst Sie den RTF-Code von Ihrem RichTextBox (rtbBox.Rtf) zu erhalten, setzen Sie das Bild an der richtigen Stelle, und stellen Sie den Code von rtbBox.Rtf

One Problem kann sein, dass .NET RTB den RTF-Standard nicht sehr gut unterstützt.

Ich habe gerade eine kleine Anwendung * gemacht, die Ihnen erlaubt, schnell einige RTF-Code in einem RTB zu testen und zu sehen, wie es damit umgeht. Sie können es hier herunterladen: RTB tester (http://your-translations.com/toys).

Sie können einige RTF-Inhalte (z. B. aus Word) in das linke RTF-Feld einfügen und auf "RTF-Codes anzeigen" klicken, um die RTF-Codes im rechten RTF-Feld anzuzeigen, oder RTF-Code in das RTF-Feld einfügen rechts RTB und klicken Sie auf "RTF-Codes anwenden", um die Ergebnisse auf der linken Seite zu sehen.

Sie können natürlich die Codes bearbeiten, wie Sie möchten, was es recht bequem macht, zu testen, ob die RichTextBox die von Ihnen benötigten Befehle unterstützt oder nicht, oder wie Sie die RTF-Steuerwörter verwenden.

Sie können eine vollständige Spezifikation für RTF online herunterladen.


NB Es ist nur eine kleine Sache, die ich zusammen in 5 Minuten geschlagen, so dass ich nicht Datei öffnen implementieren oder speichern, per Drag & Drop oder andere zivilisierte Sachen.

+1

Ich konnte RTB nicht zeigen, PNGs, aber zumindest zeigt es WMF. –

+0

1 "Twip" = 1/20 eines Punktes. 1 Punkt ~ 1.333 Pixel (das hängt von der Bildschirmauflösung ab; die meisten Monitore haben heute 96 Pixel pro Zoll in ihrer nativen Auflösung, so dass dies gilt) – KeithS

4

Hier ist, was ich tun, um die Rich-Text-Kontrolle zu hacken:

Fügen Sie das gewünschte Bild in Wordpad oder MS-Word. Speichern Sie die Datei als 'rtf'. Öffnen Sie die RTF-Datei im Editor, um den Raw-RTF-Code zu sehen. Kopieren Sie die erforderlichen Tags & stuff in die Eigenschaft 'rtf' Ihrer Rich Text Box (an vorhandenen Text anhängen).

Es gibt einige Versuch und Irrtum beteiligt, aber funktioniert.

Mit C# verwende ich Platzhalter StringBuilder Objekte mit dem erforderlichen RTF-Code. Dann füge ich einfach den Bildpfad an.

Dies ist eine Problemumgehung für das Nichtlernen der RTF-Syntax.

+3

Das ist die hässlichste Lösung, von der ich je gehört habe. –

+0

Ich suche seit dem Morgen, wie man ein Bild in Richtextbox einfügt, aber alles ist van. Nach dem Lesen dieser Antwort habe ich es in weniger als 180 Sekunden. +1 für dich. –

0

Wenn Sie in C++ waren, ist der Weg über OLE. Genauer gesagt, wenn Sie Google nach ImageDataObject suchen, wird C++ - Code angezeigt, wie ein HBITMAP in das RTF-Steuerelement eingefügt wird. Ein Link ist here.

Nun, wie dies in .NET-Code übersetzt, weiß ich nicht. Ich habe derzeit keine Zeit, um durch die Details zu arbeiten.

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' ist buchstäblich der nutzloseste Code, den ich jemals gesehen habe. – Nyerguds

11

Ich verwende den folgenden Code aus, um die Daten aus der Zwischenablage zu erhalten, sie im Speicher speichern, setzen Sie das Bild in der Zwischenablage, es in Rich-Text-Box einfügen und schließlich die Daten in der Zwischenablage wieder her.

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 

Die OpenFileDailog1, RichTextBox1 und Button1 sind Open File Dialog bzw. Rich-Text-Box und Button-Steuerelemente.

+1

Um ehrlich zu sein, war ich skeptisch gegenüber dieser Lösung.Ich meine, wenn Sie bereits ein Bild in der Zwischenablage haben (in meinem Fall), dann sollte es aus dem Klemmbrett genommen werden, und es gleich wieder anziehen sollte nichts tun. Aber genau dieser Trick funktionierte wie ein Traum. DANKE! – Jerry

+0

Ich kann nicht glauben, dass es funktioniert Sie sind ein Genie .... –

+0

Was passiert, wenn Richtextbox Read only Property gesetzt ist, um wahr zu sein? Diese Zwischenablage-Methode wird fehlschlagen. –

0

suchte ich auch etwas für die gleiche Aufgabe und fand diese ->

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

Sie jede Art von RTF-Text erzeugen können, die man sich nur wünschen und es Ihnen dann verwendet jedoch wünschen. Sehr gut strukturiertes Beispiel, das den verwendeten Bildtyp automatisch erkennt (jpg/jpeg/png usw.) und für die Bilddateien funktioniert, die ich benutzt habe. Wenn Sie in Eile sind, dann ist dies ein großartiger RTF-Generator!

0

Alles, was ich tat, war ein kleines PictureBox-Steuerelement in C# und stellte sicher, dass es hinter einem anderen Objekt versteckt war groß genug, um es zu verstecken. Dann habe ich eine Schaltfläche zum Einfügen eines Bildes gemacht, und es lud die PictureBox mit dem Bild, dann legte es in die RichTextBox, dann löscht es das PictureBox-Steuerelement.

Hier ist der Code.

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

Meine eigene Version, die ich in einem neuen Thread gepostet habe, anscheinend sollte ich es hier gesucht und gepostet haben. Wie auch immer, mit der Zwischenablage wieder, sehr einfach.

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

    } 
}