[C#] Impression d'un formulaire

Résolu
Vapula
Messages postés
83
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
17 mai 2005
- 11 mai 2005 à 11:58
 nouganux - 19 août 2008 à 18:54
Bonjour,



Je débute en C#, je voudrais savoir comment peut on imprimer un Form



J'ai un Form qui contient divers Label, TextBox, GroupBox, Button, ...
et je voudrais imprimer ce formulaire sans les boutons et sans changer
la mise en page si possible

J'ai vu dans les sources l'impression d'un RichText mais pas d'un formulaire.



Merci d'avance, et bon code

Vapula

23 réponses

MorpionMx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
56
11 mai 2005 à 14:47
Il va te faire une "capture" du control dont tu passes le handle a cette ligne :

msg.HWnd = this.Handle;

Donc pas de toutes les fenetres visibles.

Si tu voulais juste imprimer le contenu d'un panel, tu pourrais mettre



msg.HWnd = monPanel.Handle;




Pour l'imprimer ensuite, tu instancies un objet PrintDocument, et dans l'evemenent PrintPage tu marque :



private void printDoc_PrintPage(object sender, PrintPageEventArgs e)

{

e.Graphics.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);

}



et hop, c'est imprimé




Mx
3
MorpionMx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
56
11 mai 2005 à 12:25
Déclaration des constantes :



private const int WM_PRINT = 0x0317;

private const int PRF_CHECKVISIBLE = 0x00000001;

private const int PRF_NONCLIENT = 0x00000002;

private const int PRF_CLIENT = 0x00000004;

private const int PRF_ERASEBKGND = 0x00000008;

private const int PRF_CHILDREN = 0x00000010;

private const int PRF_OWNED = 0x00000020;



...



Bitmap bmp = new Bitmap(this.Width, this.Height);

Graphics bmpGraphics = Graphics.FromImage(bmp);

IntPtr bmpHdc = bmpGraphics.GetHdc();



Message msg = new Message();

msg.Msg = WM_PRINT;

msg.HWnd = this.Handle;

msg.WParam = bmpHdc;

msg.LParam =
new IntPtr(PRF_NONCLIENT | PRF_CLIENT | PRF_ERASEBKGND | PRF_CHILDREN |
PRF_OWNED);

this.WndProc(ref msg);



bmpGraphics.ReleaseHdc(bmpHdc);

bmpGraphics.Dispose();



Et ensuite tu n'as plus qu'a imprimer le bitmap bmp

Mx
0
Vapula
Messages postés
83
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
17 mai 2005

11 mai 2005 à 14:39
Merci



Donc si je comprends bien ce code me genere une image de mon ou mes formulaires visible(s).



Mais par contre pour l'impression , je vois pas comment faire.



Vapula
0
Vapula
Messages postés
83
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
17 mai 2005

11 mai 2005 à 15:02
Merci je vais me débrouiller avec ca va marcher



Bon code

Vapula
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
swiniya
Messages postés
5
Date d'inscription
lundi 25 juillet 2005
Statut
Membre
Dernière intervention
3 août 2005

26 juil. 2005 à 13:52
Salut,

J'ai essaye ton code d'imprimer et j'ai reçu ces erreures :
"'System.Messaging.Message' ne contient pas de définition pour 'HWnd'

"System.Messaging.Message' ne contient pas de définition pour 'WParam'"
" 'System.Messaging.Message' ne contient pas de définition pour 'LParam'
" 'essai.email' ne contient pas de définition pour 'WndProc'
Aidez moi svp !!! c tres important pour moi (mon projet de fin d'etudes)!!
0
cs_coq
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Membre
Dernière intervention
2 août 2014
98
28 juil. 2005 à 22:50
Il s'agit ici de la structure System.Windows.Forms.Message, pas de System.Messaging.Message.

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
swiniya
Messages postés
5
Date d'inscription
lundi 25 juillet 2005
Statut
Membre
Dernière intervention
3 août 2005

29 juil. 2005 à 12:14
Salut ,

J'ai utilise System.Windows.forms pour resoudre le probleme de message mais je reçois ces erreurs encore !! voila le code que j'utilise !!!

private
void pd_PrintPage(
object sender, PrintPageEventArgs e)


{


Bitmap bmp =
new Bitmap(900, 900);


Graphics bmpGraphics = Graphics.FromImage(bmp);


IntPtr bmpHdc = bmpGraphics.GetHdc();


System.Windows.Forms.Message msg =
new Message();



msg.Msg = WM_PRINT;


msg.HWnd = this.Panel1.Handle;


msg.WParam = bmpHdc;


msg.LParam =
new IntPtr(PRF_NONCLIENT | PRF_CLIENT | PRF_ERASEBKGND | PRF_CHILDREN | PRF_OWNED);



this.WndProc(
ref msg);






bmpGraphics.ReleaseHdc(bmpHdc);


bmpGraphics.Dispose();






PrintDocument pd =
new PrintDocument();


e.Graphics.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);


}



private
void Button3_Click(
object sender, System.EventArgs e)


{



pd.Print();


}

Les erreurs:


...


'essai.email' ne contient pas de définition pour 'Handle'


'essai.email' ne contient pas de définition pour 'WndProc'
: 'System.Web.UI.WebControls.Panel' ne contient pas de définition pour 'Handle'


Le type ou le nom d'espace de noms 'pd' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?)


Merci bcp vous me sauvez la vie!!!!!!
0
cs_coq
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Membre
Dernière intervention
2 août 2014
98
29 juil. 2005 à 19:19
Normal donc :
'System.Web.UI.WebControls.Panel' ne contient pas de définition pour 'Handle'

=> Le sujet de ce post concerne les applications windows, pas web.

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
swiniya
Messages postés
5
Date d'inscription
lundi 25 juillet 2005
Statut
Membre
Dernière intervention
3 août 2005

29 juil. 2005 à 19:23
salut!!

comment pourais-je alors imprimer un panel dans une web application ???
0
cs_coq
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Membre
Dernière intervention
2 août 2014
98
29 juil. 2005 à 19:28
Bonne question, essaie de demander sur les forums de la branche de CodeS-SourceS dédiée à l'ASP/ASP.Net : ASPFr.com

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
cs_shoka
Messages postés
29
Date d'inscription
jeudi 5 janvier 2006
Statut
Membre
Dernière intervention
21 février 2006

1 févr. 2006 à 16:01
Bonjour à tous !

Je suis à peu près dans le meme cas. J'ai un formulaire, dans lequel il y a un bouton "Imprimer" permettant d'imprimer ce formulaire.

Ne sacahant absolument pas comment faire, j'ai copié le code donné par MorpionMX. Cependant, quand je clique sur Imprimer, rien ne se passe.

voici mon code (rien d'original, j'ai juste recopié) :



void BImprimerClick(object sender, System.EventArgs e)
{
PrintDocument printDoc = new PrintDocument();
}

private void printDoc_PrintPage(object sender, PrintPageEventArgs e)
{
Bitmap bmp = new Bitmap(this.Width, this.Height);
Graphics bmpGraphics = Graphics.FromImage(bmp);
IntPtr bmpHdc = bmpGraphics.GetHdc();
Message msg = new Message();
msg.Msg = WM_PRINT;
msg.HWnd = this.Handle;
msg.WParam = bmpHdc;
msg.LParam = new IntPtr(PRF_NONCLIENT | PRF_CLIENT | PRF_ERASEBKGND | PRF_CHILDREN | PRF_OWNED);
this.WndProc(ref msg);

bmpGraphics.ReleaseHdc(bmpHdc);
bmpGraphics.Dispose();

e.Graphics.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);
}
0
MorpionMx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
56
1 févr. 2006 à 16:13
Salut,
Tu as oublié d'appeler la méthode Print() on dirait.

void BImprimerClick(object sender, System.EventArgs e)
{
PrintDocument printDoc = new PrintDocument();
printDoc.Print();
}


Mx
MVP C#
0
cs_shoka
Messages postés
29
Date d'inscription
jeudi 5 janvier 2006
Statut
Membre
Dernière intervention
21 février 2006

1 févr. 2006 à 17:09
Ah ça va mieux mais.... il ne m'imprime rien..

J'ai la boite de dialogue qui s'affiche bien mais la feuille sort blanche de l'imprimante.
0
MorpionMx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
56
1 févr. 2006 à 17:18
Je t'avoues que c'est bizare.
Essaies d'enregistrer ton objet Bitmap pour voir s'il contient bien l'image que tu attends.



Mx
MVP C#
0
cs_shoka
Messages postés
29
Date d'inscription
jeudi 5 janvier 2006
Statut
Membre
Dernière intervention
21 février 2006

1 févr. 2006 à 17:40
je l'enregistre comment ?

avec IO.StreamWriter dans un .bmp ?
(je suis légèrement débutant :D)
0
MorpionMx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
56
1 févr. 2006 à 17:44
bmp.Save("image.bmp");



Mx
MVP C#
0
cs_shoka
Messages postés
29
Date d'inscription
jeudi 5 janvier 2006
Statut
Membre
Dernière intervention
21 février 2006

1 févr. 2006 à 19:13
je l'ai fait... rien du tout, pas de fichier..

J'ai mis une MessageBox, rien n'apparait.. en fait ma méthode semble être totalement ignorée.
0
MorpionMx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
56
1 févr. 2006 à 19:42
Ah mais oui, j'avais pas fais attention, mais tu ne t'es pas inscrit a l'evenement PrintPage

void BImprimerClick(object sender, System.EventArgs e)
{
PrintDocument printDoc = new PrintDocument();
printDoc.PrintPage += new PrintPageEventHandler(printDoc_PrintPage);
printDoc.Print();
}



Mx
MVP C#
0
cs_shoka
Messages postés
29
Date d'inscription
jeudi 5 janvier 2006
Statut
Membre
Dernière intervention
21 février 2006

2 févr. 2006 à 10:28
Merci Morpion ça tourne maintenant ! :)

Autre chose, comment imprimer en format paysage ?

J'essaie de bidouiller un objet PrinterSettings mais je rame un peu :(
0
cs_shoka
Messages postés
29
Date d'inscription
jeudi 5 janvier 2006
Statut
Membre
Dernière intervention
21 février 2006

2 févr. 2006 à 10:37
Dans la doc du framework, j'ai trouvé
bool PageSettings.Landscape
pour définir si l'impression se fait en paysage. J'ai donc créé un objet pset new PageSettings (et non PrinterSettings) et mis pset.Landscape true.

Cependant l'impression se fait toujours en portrait.
Dois-je lier pset avec le document en cours ? et comment ?

Merci beaucoup pour vos réponses :)
0