Comment imprimer un formulaire Windows sans l’afficher / l’afficher

J’essaie d’imprimer automatiquement une série de Windows-Forms. Je n’ai pas besoin de leur montrer. Les exemples de code que j’ai trouvés sur Internet ne fonctionnent que lorsque j’affiche le formulaire avec show() ! J’ai besoin d’initialiser le formulaire avec des données et de l’envoyer à l’imprimante. Voici le code que j’utilise:

 public partial class Form2_withoutShow : Form{ PrintDocument PrintDoc; Bitmap memImage; public Form2_withoutShow (Data data) { InitializeComponent(); /* Initialize Data (texboxes, charts ect.) here */ this.PrintDoc = new PrintDocument(); this.PrintDoc.PrintPage += PrintDoc_PrintPage; this.PrintDoc.DefaultPageSettings.Landscape = true; } public void Print() { this.PrintDoc.Print(); } void PrintDoc_PrintPage(object sender, PrintPageEventArgs e) { int x = SystemInformation.WorkingArea.X; int y = SystemInformation.WorkingArea.Y; int width = this.Width; int height = this.Height; Rectangle bounds = new Rectangle(x, y, width, height); Bitmap img = new Bitmap(width, height); this.DrawToBitmap(img, bounds); Point p = new Point(10, 10); e.Graphics.DrawImage(img, p); } private void Form2_withoutShow_Load(object sender, EventArgs e) { // remove TITLEBar this.ControlBox = false; this.Text = Ssortingng.Empty; } } 

J’appelle la méthode Print() depuis une autre classe dans for-loop et passe les données à initialiser via le constructeur.

L’ exemple MSDN capture la partie à l’écran où les formulaires doivent être affichés. Cela ne marche pas pour moi. L’approche que j’utilise maintenant ne donne que l’impression de la fenêtre vide si je n’appelle pas show() . Comment obtenir les données dans le formulaire sans avoir à appeler la méthode show() ? Des approches telles que mimer les fenêtres lors de l’affichage ne fonctionnent pas non plus, car c’est aussi le résultat de l’impression: une fenêtre réduite.

Avant d’afficher le formulaire, le formulaire et ses contrôles ne sont pas à l’état Created . Pour forcer la création du formulaire et de ses contrôles, il suffit d’appeler la CreateControl(bool fIgnoreVisible) interne CreateControl(bool fIgnoreVisible) de votre formulaire:

 var f = new Form1(); var createControl = f.GetType().GetMethod("CreateControl", BindingFlags.Instance | BindingFlags.NonPublic); createControl.Invoke(f, new object[] { true }); var bm = new Bitmap(f.Width, f.Height); f.DrawToBitmap(bm, new Rectangle(0, 0, bm.Width, bm.Height)); bm.Save(@"d:\bm.bmp"); 

Supprimez également les codes que vous avez dans votre gestionnaire de formulaire Load et mettez-les dans le constructeur de votre formulaire.

Remarque

Il existe également d’autres solutions de contournement pour le problème:

  • Par exemple, vous pouvez afficher le formulaire à un emplacement situé en dehors des limites de l’écran, puis le masquer à nouveau. Définissez l’ Location sur (-32000, -32000) et définissez StartPosition sur Manual puis sur Show et Hide le formulaire avant de dessiner en bitmap.
  • Ou bien, comme autre exemple, vous pouvez afficher le formulaire avec l’ Opacity défini sur 0 , puis Show et Hide le formulaire avant de dessiner au format bitmap.