Print Form / UserControl in C #

My program: Contains a form with several text fields and one button. The default printer is installed as Adobe PDF on my computer.

My goal: Want to take a screenshot of the form / usercontrol when the user clicks the Print button. Then the screenshot is saved on the desktop in .pdf format.

My problem: I have the following two problems with the code:

  • Screenshot size: The screenshot size is too large, and it does not match the page size (default page size) when printing / converting to .pdf. See Two Images Below. I want the whole screenshot to fit inside the page.
  • Twice asks where to convert and save:. When I click the "Print Form" button, the programs ask me for TWICE where to print / convert and save the file. I want the program to ask me only once, where to print and save the file.

Problem 1: The screenshot taken by the program does not match the page when printing. Problem 1: The screenshot captured by the program does not fit the page when printed.

I want the image in the screenshot to match this on one .pdf page: enter image description here

Code:

public partial class Form1 : Form { public Form1() { InitializeComponent(); button1.Text = "Print Form"; button1.Click += new EventHandler(button1_Click); printDocument1.PrintPage += new PrintPageEventHandler(printDocument1_PrintPage); this.Controls.Add(button1); } private void button1_Click(object sender, EventArgs e) { CaptureScreen(); printDocument1.Print(); } Bitmap memoryImage; private void CaptureScreen() { Graphics myGraphics = this.CreateGraphics(); Size s = this.Size; memoryImage = new Bitmap(s.Width, s.Height, myGraphics); Graphics memoryGraphics = Graphics.FromImage(memoryImage); memoryGraphics.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, s); } private void printDocument1_PrintPage(System.Object sender, System.Drawing.Printing.PrintPageEventArgs e) { e.Graphics.DrawImage(memoryImage, 0, 0); } } 

Thanks for your help in advance. I am new to learning the C # language and your help would be much appreciated. :)

+6
source share
1 answer

Ok, check this out and the modified printDocument1_PrintPage in particular:

  private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { // calculate width and height scalings taking page margins into account var wScale = e.MarginBounds.Width / (float)_memoryImage.Width; var hScale = e.MarginBounds.Height / (float)_memoryImage.Height; // choose the smaller of the two scales var scale = wScale < hScale ? wScale : hScale; // apply scaling to the image e.Graphics.ScaleTransform(scale, scale); // print to default printer page e.Graphics.DrawImage(_memoryImage, 0, 0); } 

I moved the entire event conductor to InitializeComponent, where it usually had to go, but it involved code more:

 using System; using System.Drawing; using System.Drawing.Printing; using System.Windows.Forms; namespace testScreenCapScale { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { CaptureScreen(); printDocument1.Print(); } private Bitmap _memoryImage; private void CaptureScreen() { // put into using construct because Graphics objects do not // get automatically disposed when leaving method scope using (var myGraphics = CreateGraphics()) { var s = Size; _memoryImage = new Bitmap(s.Width, s.Height, myGraphics); using (var memoryGraphics = Graphics.FromImage(_memoryImage)) { memoryGraphics.CopyFromScreen(Location.X, Location.Y, 0, 0, s); } } } private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { // calculate width and height scalings taking page margins into account var wScale = e.MarginBounds.Width / (float)_memoryImage.Width; var hScale = e.MarginBounds.Height / (float)_memoryImage.Height; // choose the smaller of the two scales var scale = wScale < hScale ? wScale : hScale; // apply scaling to the image e.Graphics.ScaleTransform(scale, scale); // print to default printer page e.Graphics.DrawImage(_memoryImage, 0, 0); } } } 

Form1.Designer.cs

 namespace testScreenCapScale { partial class Form1 { private System.ComponentModel.IContainer components = null; protected override void Dispose(bool disposing) { if (disposing && (components != null)) components.Dispose(); base.Dispose(disposing); } private void InitializeComponent() { this.printDocument1 = new System.Drawing.Printing.PrintDocument(); this.button1 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // printDocument1 // this.printDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.printDocument1_PrintPage); // // button1 // this.button1.Location = new System.Drawing.Point(64, 220); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 0; this.button1.Text = "button1"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(384, 377); this.Controls.Add(this.button1); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout(false); } private System.Drawing.Printing.PrintDocument printDocument1; private System.Windows.Forms.Button button1; } } 
+3
source

Source: https://habr.com/ru/post/955203/


All Articles