Comment puis-je insérer une image dans une RichTextBox?
la plupart des exemples que je vois disent de le mettre sur le bloc-notes et d'utiliser la pâte, mais cela ne semble pas être très bon parce qu'il écrira sur le bloc-notes.
j'ai vu la méthode manuellement placer l'image dans le format RTF à l'aide d'un pinvoke pour convertir l'image wmf. Est-ce la meilleure façon de faire? Est-il plus simple chose que je peux faire?
9 réponses
la façon la plus simple serait de modifier le code RTF pour insérer l'image vous-même.
dans RTF, une image est définie comme ceci:
' {'\pict (brdr? & ombrage? & picttype & pictsize & metafileinfo?) données'}' Un point d'interrogation indique que le mot de contrôle est facultatif. "données" est tout simplement le contenu du fichier au format hex. Si vous voulez utiliser binaire, utilisez le mot de contrôle \bin.
par exemple:
{\pict\pngblip\picw10449\pich3280\picwgoal5924\pichgoal1860 hex data}
{\pict\pngblip\picw10449\pich3280\picwgoal5924\pichgoal1860\bin binary data}
\pict = commence un groupe d'images, \pngblip = png picture \picwX = largeur de l'image (X est la valeur du pixel)) \pichX = hauteur de l'image \ picwgoalX = largeur désirée de l'image dans twips
Donc, pour insérer une image, il vous suffit d'ouvrir votre image, convertir les données en hexadécimal, charger ces données dans une chaîne et d'ajouter les codes RTF autour d'elle pour définir une image RTF. Maintenant, vous avez une chaîne avec des données d'image qui vous pouvez insérer dans le code RTF du document. N'oubliez pas la fermeture "}"
ensuite, vous obtenez le code RTF de votre RichTextBox (rtbBox.Rtf), insérez l'image à l'endroit approprié, et mettez le code de rtbBox.Rtf
un problème que vous pouvez rencontrer est que .NET RTB n'a pas un très bon support de la norme RTF.
je viens de faire une petite application* qui vous permet de tester rapidement un peu de code RTF à l'intérieur D'un RTB et voir comment il gère il. Vous pouvez le télécharger ici: RTB tester ( http://your-translations.com/toys ).
vous pouvez coller du contenu RTF (de Word, par exemple) dans la boîte RTF gauche et cliquer sur" Afficher les codes RTF "pour afficher les codes RTF dans la boîte RTF droite, ou vous pouvez coller le code RTF dans la RTB droite et cliquer sur" Appliquer les codes RTF " pour voir les résultats du côté gauche.
vous pouvez bien sûr éditer le codes comme vous voulez, ce qui rend très pratique pour tester si oui ou non la RichTextBox supporte les commandes dont vous avez besoin, ou apprendre à utiliser les mots de contrôle RTF.
vous pouvez télécharger une spécification complète pour RTF en ligne.
NB C'est juste une petite chose que j'ai giflée ensemble en 5 minutes, donc je n'ai pas implémenté le fichier ouvrir ou enregistrer, glisser-déposer, ou d'autres trucs civilisés.
j'utilise le code suivant pour obtenir d'abord les données du presse-papiers, les enregistrer en mémoire, mettre l'image dans le presse-papiers, les coller dans la zone de texte riche et enfin restaurer les données dans le Presse-papiers.
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
La OpenFileDailog1, RichTextBox1 et Button1 sont Dialogue d'ouverture de Fichier, Riche Zone de Texte et un bouton de contrôle, respectivement.
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);
}
}
}
voici ce que je fais pour pirater le contrôle Rich text:
insérer l'image requise dans wordpad ou MS-WORD. Enregistrez le fichier sous 'rtf'. Ouvrez le fichier rtf dans notepad pour voir le code rtf brut. Copiez les tags & stuff nécessaires à la propriété' rtf ' de votre zone de texte riche (ajoutez au texte existant).
il y a des essais et des erreurs, mais ça marche.
avec C#, j'utilise des objets place holder StringBuilder avec le rtf nécessaire code. Puis j'ajoute juste le chemin d'image.
il s'agit d'une solution pour ne pas avoir à apprendre la syntaxe RTF.
ma propre version que j'ai posté dans un nouveau thread, apparemment j'aurais dû le chercher et le poster ici. De toute façon, utiliser le presse-papiers encore une fois, très facile.
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();
}
}
}
si vous étiez en C++, la façon de le faire est à trois. Plus précisément, si vous faites une recherche sur Google pour ImageDataObject, vous verrez comment insérer un code C++ dans le contrôle RTF. Un lien est ici .
maintenant, comment ça se traduit en code. Net, Je ne sais pas. J'ai actuellement n'ont pas le temps de travailler à travers les détails.
je cherchais aussi quelque chose pour cette même tâche et j'ai trouvé cela - >
http://sourceforge.net/projects/netrtfwriter /
vous pouvez générer n'importe quel type de texte RTF que vous voulez et puis l'utiliser comme vous le souhaitez. Exemple très bien structuré qui va auto-sentir le type d'image utilisé (jpg/jpeg/png etc) et travaillé pour les fichiers d'image que j'ai utilisé. Si vous êtes pressé alors c'est un grand RTF générateur de!
Tout ce que j'ai fait était de faire un petit contrôle pictureBox en c# et de m'assurer qu'il était caché derrière un autre objet assez grand pour le cacher. Puis j'ai fait un bouton pour insérer une image, et il a chargé la pictureBox avec l'image puis il la met dans la richTextBox puis il efface la commande pictureBox.
voici le 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();
}
}
}
surf de plusieurs heures pour solution pour insérer l'image sans perdre la qualité et fixe le fond gris avec l'image transparente / png
// assuming the image is in your Resources
var img = Resources.ImageWithTransparentBckgrnd;
var g = Graphics.FromImage(img);
using (var ms = new MemoryStream())
{
img.Save(ms, ImageFormat.Png);
IntPtr ipHdc = g.GetHdc();
Metafile mf = new Metafile(ms, ipHdc);
g = Graphics.FromImage(mf);
g.FillEllipse(Brushes.White, 0, 0, 16, 16); // size you want to fill in
g.Dispose();
mf.Save(ms, ImageFormat.Png);
IDataObject dataObject = new DataObject();
dataObject.SetData("PNG", false, ms);
Clipboard.SetDataObject(dataObject, false);
richTextBox1.Paste();
SendKeys.Send("{RIGHT}");
richTextBox1.Focus();
}