Imprimer tout le contenu de ma fenetre [Résolu]

Signaler
Messages postés
58
Date d'inscription
mercredi 25 janvier 2006
Statut
Membre
Dernière intervention
13 avril 2007
-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
-
Salut à tous,

j'aimerais imprier le contenu entier de ma fenetre, donc en faire une "photo" et l'imprimer. Je ne trouve pas d'exemple avec un printdialog pour imprimer toute ma fenetre. Quelqu'un à une idée ?? Merci

16 réponses

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
Salut

Voici une fonction qui va capturer une image de ta fenetre
Tu n'as plus qu'a recuperer l'image et la dessiner dans le Graphics d'un PrintDocument



<HR>




private
const
int WM_PRINT = 0x0317;

private
const
int PRF_CLIENT = 0x00000004;

private
const
int PRF_CHILDREN = 0x00000010;

public
Bitmap PrintWindowEx()
{

Bitmap bmp =
null;

Graphics gr =
null;

IntPtr hdc =
IntPtr.Zero;

try
{
bmp =
new
Bitmap(
this.ClientRectangle.Width,
this.ClientRectangle.Height,
this.CreateGraphics());
gr =
Graphics.FromImage(bmp);
hdc = gr.GetHdc();

IntPtr wParam = hdc;

IntPtr lParam =
new
IntPtr(PRF_CLIENT | PRF_CHILDREN);

Message msg =
Message.Create(
this.Handle, WM_PRINT, wParam, lParam);

this.WndProc(
ref msg);
}

catch { }

finally
{

if (gr !=
null)
{

if (hdc !=
IntPtr.Zero)
gr.ReleaseHdc(hdc);
gr.Dispose();
}
}

return bmp;
}

<HR>





Mx
MVP C#
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Comme le dis Mx, tu dois déclarer un printDocument :
System.Drawing.Printing.
PrintDocument printDocument =
new System.Drawing.Printing.
PrintDocument();


Ensuite, tu t'abonnes à l'event PrintPage :
printDocument.PrintPage +=
new System.Drawing.Printing.
PrintPageEventHandler(printDocument_PrintPage);

Dans le handler, tu mets la ligne qu'il t'a donné :



private
void printDocument_PrintPage(
object sender, System.Drawing.Printing.
PrintPageEventArgs e)
{
e.Graphics.DrawImage(PrintWindowEx(), 0, 0);
}

Quand au PrintDocument.Print(); il va par exemple sur un bouton qui s'appelle Imprimer pour lancer l'impression...


<HR>

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever /infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319 /auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
30
Salut

Pour la capture de la fenêtre, j'ai déposer hier un snippet (http://codyx.org/snippet_capture-image-form-tous-controles_147.aspx) un peu plus simple que le code que t'as donné Mx.

Kenji
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
non, pas MainForm.Print(), ni MainForm.PrintPage, mais tonPrintDocument.Print(); ...


<HR>


public
class
MainForm :
Form
{

private
const
int WM_PRINT = 0x0317;

private
const
int PRF_CLIENT = 0x00000004;

private
const
int PRF_CHILDREN = 0x00000010;
System.Drawing.Printing.
PrintDocument printDocument =
new System.Drawing.Printing.
PrintDocument();



public MainForm()
{
InitializeComponent();

this.printDocument.PrintPage +=
new System.Drawing.Printing.
PrintPageEventHandler(printDocument_PrintPage);
}

private void printDocument_PrintPage(
object sender, System.Drawing.Printing.
PrintPageEventArgs e)
{
e.Graphics.DrawImage(PrintWindowEx(), 0, 0);
}



private
void imprimerToolStripMenuItem_Click(
object sender,
EventArgs e)
{

this.printDocument.Print();
}

...
}


<HR>



Mx
MVP C#
Messages postés
58
Date d'inscription
mercredi 25 janvier 2006
Statut
Membre
Dernière intervention
13 avril 2007

ok super merci.

Quand tu dis "Tu n'as plus qu'a recuperer l'image et la dessiner dans le Graphics d'un PrintDocument" tu pourrais être plus precis ? Je n'ai jamais essayé d'imprimer autre chose que des strings, et je ne vois pas comment invoquer un print document.Ca se fait par le print dialog ???

Merci d'avance pour le coup de main
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
Instancie un PrintDocument, et inscris toi a son evenement PrintPage;
dans l'evenement printpage, met :


e.Graphics.DrawImage(PrintWindowEx(), 0, 0);

Pour imprimer, tu n'as qu'a appeler tonPrintDocument.Print();



Mx
MVP C#
Messages postés
58
Date d'inscription
mercredi 25 janvier 2006
Statut
Membre
Dernière intervention
13 avril 2007

ok je me lance je te tient au courant merci :)
Messages postés
58
Date d'inscription
mercredi 25 janvier 2006
Statut
Membre
Dernière intervention
13 avril 2007

Bon je suis perdu

Je comprend bien l'evenement, mais je ne sais pas ou le mettre. Je debute en csharp : instancier et inscrire un evenement , ben je c pas trop comment on fait

PrintDocument.Print(); est pour mon bouton imprimer je suppose?

Encore merci pour ton aide précieuse
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
En effet, il est bien plus simple.
Par contre tu l'avais mis dans les langages C# 1 et 2, mais il n'est valide qu'en C# 2, ce que j'ai donc modifié ;)


Mx
MVP C#
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
30
Merci bcp. Je pensais que ca marchais aussi en C#1.
(J'ai que vs2005 pour les tests)

Kenji
Messages postés
58
Date d'inscription
mercredi 25 janvier 2006
Statut
Membre
Dernière intervention
13 avril 2007

Salut à tous, merci pour tout !

Il ne veut pas prendre ma ligne dans mon bouton : .print => PrintDocument.Print() alors quej'ai bien tout ajouté comme dit dans le post de Bidou.
Je ne vous nul part l'utilisation du printdialog, on ne l'utilise pas ?

Encore merciiiiiiii
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
PrintDocument.Print() ?

Attention, c'est plutot tonInstanceDePrintDocument.Print();
si ton PrintDocument s'appele printDocument, alors tu fais printDocument.Print();



Mx
MVP C#
Messages postés
58
Date d'inscription
mercredi 25 janvier 2006
Statut
Membre
Dernière intervention
13 avril 2007

Bon je recapitule avant de me jetter du haut de mon rez de chaussez

<hr size="2" width="100%"> private const int WM_PRINT = 0x0317;
private const int PRF_CLIENT = 0x00000004;
private const int PRF_CHILDREN = 0x00000010;

public MainForm()
{
InitializeComponent();
MainForm.Printpage += new System.Drawing.Printing.PrintPageEventHandler(MainForm_PrintPage);
}
private void MainForm_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
e.Graphics.DrawImage(PrintWindowEx(), 0, 0);
}

public Bitmap PrintWindowEx()
{
Bitmap bmp = null;
Graphics gr = null;
IntPtr hdc = IntPtr.Zero;
try
{
bmp = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height, this.CreateGraphics());
gr = Graphics.FromImage(bmp);
hdc = gr.GetHdc();
IntPtr wParam = hdc;
IntPtr lParam = new IntPtr(PRF_CLIENT | PRF_CHILDREN);
Message msg = Message.Create(this.Handle, WM_PRINT, wParam, lParam);
this.WndProc(ref msg);
}
catch { }
finally
{
if (gr != null)
{
if (hdc != IntPtr.Zero)
gr.ReleaseHdc(hdc);
gr.Dispose();
}
}
return bmp;
}

..... Mon prog .....

private void imprimerToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Drawing.Printing.PrintDocument printDocument = new System.Drawing.Printing.PrintDocument();
MainForm.Print();
}

Souligné en rouge = erreurs :'(

Merci encore
Messages postés
58
Date d'inscription
mercredi 25 janvier 2006
Statut
Membre
Dernière intervention
13 avril 2007

Ok super, plus d'erreur MERCIIIII

Il va me l'imprimer sur l'imprimante par defaut je suppose ?