C# : Imprimer richTextBox avec visual Studio

Fermé
abdimen Messages postés 18 Date d'inscription mardi 29 septembre 2009 Statut Membre Dernière intervention 22 février 2011 - Modifié par abdimen le 15/08/2010 à 02:14
Nico# Messages postés 323 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 28 août 2013 - 16 août 2010 à 19:31
Bonjour,
je suis débutante en c# et je suis en train de faire un mini projet où j'ai besoin d' imprimer un le contenu d'un richTextBox, si vous pouvez m'aider pour écrire le code de ce bouton.
Et merci d'avance :)



1 réponse

Nico# Messages postés 323 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 28 août 2013 102
15 août 2010 à 10:50
Salut,


Pour imprimer ton contenu de ta richtextbox il faut que tu recréer un nouveau controle qui herite de ce dernier.

pour sa tu fais un nouveau projet de type Bibliotheque de classe .dll , tu supprimer tout le code que l'editeur a créer par defaut et tu copie celui la a la place.


using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Printing;
using System.Runtime.InteropServices;

namespace RichTextBoxPrintable
{
    public class RichTextBoxPrintable : RichTextBox
    {
        private const double Inch = 14.4;

        [StructLayout(LayoutKind.Sequential)]
        private struct MARG
        {
            public int iLeft, iRight, iTop, iBottom;
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct CARACTERE
        {
            public int iMin, iMax;
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct FORMAT
        {
            public IntPtr hdc,Target;
            public MARG Mg, MgPage;
            public CARACTERE Carac;
        }

        private const int Utilisateur = 0x0400;
        private const int FormatUtilisateur = Utilisateur + 57;

        [DllImport("USER32.DLL")]
        private static extern IntPtr EnvoieMessage(IntPtr HWind, int msg,IntPtr Wrp, IntPtr Lrp);

        public int Impression(int CaracDebut, int CaracFin, PrintPageEventArgs arg)
        {
            MARG ZoneImprimable = new MARG { iTop = (int)(arg.MarginBounds.Top * Inch), iBottom = (int)(arg.MarginBounds.Bottom * Inch), iLeft = (int)(arg.MarginBounds.Left * Inch), iRight = (int)(arg.MarginBounds.Right * Inch) };
            MARG TaillePage = new MARG { iTop = (int)(arg.PageBounds.Top * Inch), iBottom = (int)(arg.PageBounds.Bottom * Inch), iLeft = (int)(arg.PageBounds.Left * Inch), iRight = (int)(arg.PageBounds.Right * Inch) };
            IntPtr hdc = arg.Graphics.GetHdc();

            FORMAT ZFormat;
            ZFormat.Carac.iMin = CaracDebut;
            ZFormat.Carac.iMax = CaracFin;
            ZFormat.hdc = hdc;
            ZFormat.Target = hdc;
            ZFormat.Mg = ZoneImprimable;
            ZFormat.MgPage = TaillePage;

            IntPtr res = IntPtr.Zero;
            IntPtr wParam = IntPtr.Zero;
            wParam = new IntPtr(1);
            IntPtr lParam = IntPtr.Zero;
            lParam = Marshal.AllocCoTaskMem(Marshal.SizeOf(ZFormat));
            Marshal.StructureToPtr(ZFormat, lParam, false);

            res = EnvoieMessage(Handle, FormatUtilisateur, wParam, lParam);

            Marshal.FreeCoTaskMem(lParam);
            arg.Graphics.ReleaseHdc(hdc);

            return res.ToInt32();
        }
        
    }
}



Ensuite tu fais F6 et apres tu peut ajouter un nouveau controle dans la boite a outils qui s'appelera RichTextBoxPrintable Voila
0
abdimen Messages postés 18 Date d'inscription mardi 29 septembre 2009 Statut Membre Dernière intervention 22 février 2011
15 août 2010 à 12:43
Salut,
merci Nico c# pour votre réponse, mais j'ai encore des choses que j'ai pas compris,
j'ai fait la bibliothèque de classe et j'ai crée la classe "RichTextBoxPrintable" comme vous m'avez dites, puis dans mon projet j'ai fait une référence vers le fichier " RichTextBoxPrintable.dll" et aussi dans la boite à outils (outils/ choisir des éléments de boite à outils et j'ai parcouru " RichTextBoxPrintable.dll" ) et donc RichTextBoxPrintable s'ajoute et il est coché , maintenant je sais pas comment je définir "MonRichTextBox" de mon projet comme un richTextBoxPrintable car cet élément ne figure pas dansla boite à outils et comment mon bouton "imprimer" va appeler la méthode Impression?
0
Nico# Messages postés 323 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 28 août 2013 102
Modifié par Nico# le 15/08/2010 à 19:05
Alors en fait une fois que tu ajoute ton nouveau controle RichtextBox tu double-clique sur PrintDocument;

tu declare une variable de type int et tu l'instancie a 0;

puis dans la methode PrintPage du controle PrintDocument tu fais

TaVariableInt = TaRichTextBox.Impression(TaVariableInt, TaRichTextBox.TextLength, e);

et puis tu rajoute ce code pour verifier si sa depasse une page

if (TaVariableInt < TaRichTextBox.TextLength)
e.HasMorePages = true;
else
e.HasMorePages = false;
0
abdimen Messages postés 18 Date d'inscription mardi 29 septembre 2009 Statut Membre Dernière intervention 22 février 2011
15 août 2010 à 19:40
Bon, ça y est j'ai ajouté la méthode "printDocument1_PrintPage" et la variable de type int, maintenant il reste le code de mon bouton "imprimer" , je fait l'appel à la méthode
printDocument1_PrintPage mais il ne l'a pas accepté puisque les arguments sont fausses, j'ai essayer printDocument1.Print mais ça m'a généré un fichier d'extension .xsp mais qui est vide :((
Comment je vais faire l'appel de la nouvelle méthode?Est ce que vous pouvez m'aider à écrire le code de mon bouton imprimer s'il vous plait ?
0
Nico# Messages postés 323 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 28 août 2013 102
16 août 2010 à 19:31
dans ton bouton tu mets printDocument1.Print();

tu declare ta variable de type int en dehors de toute methode comme sa

Int MaVar;

ensuite dans L'evenment BeginPrint de ton PrintDocument tu fais

MarVar = 0;

et dans l'evenement PrintPage de PrintDocument tu met le code que je t'est donnée
0