我的程序: 包含一个带有几个文本框和一个按钮的表单。在我的电脑上,“默认打印机”设置为 Adobe PDF。
我的目标: 当用户点击“打印”按钮时,想要对表单/用户控件进行屏幕截图。然后将截图保存在桌面上,以 .pdf 格式保存。
我的问题: 我的代码有以下两个问题:
- 屏幕截图尺寸: 屏幕截图的尺寸太大,无法适应页面大小 (默认页面大小) 在打印/转换为 .pdf 时。请参考下面的两张图片。我希望整个屏幕截图都能适应页面。
- 询问两次转换和保存位置: 当我点击“打印表单”按钮时,程序会两次询问我要在哪里打印/转换并保存文件。我希望程序只询问一次,在哪里打印并保存文件。
问题 1: 程序捕获的屏幕截图打印时不适合页面。
我希望屏幕截图可以像这样适合一个 .pdf 页面:
代码:
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);
}
}
提前感谢您的帮助。我是一个新手,正在学习C#编程语言,非常感谢您的帮助。 :)
printDocument1.PrintPage += ...
,请尝试将其删除。我猜这个事件已经在InitializeComponent()
中触发了一次,也就是说你显式地处理了两次事件。打开Form1.Designer.cs
文件查看是否还有其他重复的内容。(除了 Init 调用之外,构造函数中的其他全部可能都是多余的。) - Paul SasikprintDocument1_PrintPage
方法。要处理重复的“保存对话框”,请查看整个代码。(事件通常在相关的设计器类文件中管理窗体。) - Paul Sasik