C# 在C中打印表单/用户控件#

C# 在C中打印表单/用户控件#,c#,winforms,visual-studio-2010,pdf,printing,C#,Winforms,Visual Studio 2010,Pdf,Printing,我的程序:包含一个带有几个文本框和一个按钮的表单“默认打印机”在我的计算机上设置为Adobe PDF 我的目标:希望在用户单击“打印”按钮时拍摄表单/用户控件的屏幕截图。然后屏幕截图以.pdf格式保存在桌面上 我的问题:我的代码有以下两个问题: 屏幕截图的大小:屏幕截图的大小太大,打印/转换为.pdf时与页面大小(默认页面大小)不匹配。请参考下面的两张图片。我想把整个截图放在页面内 两次询问转换和保存位置:当我点击“打印表单”按钮时,程序两次询问我打印/转换和保存文件的位置。我希望程序只问我一次

我的程序:包含一个带有几个文本框和一个按钮的表单“默认打印机”在我的计算机上设置为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\u PrintPage

            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's page
                e.Graphics.DrawImage(_memoryImage, 0, 0);
            }
    

    看看这个Q/a的C#图像缩放示例:对于第二期(双对话框),这只是一个猜测,但请尝试从构造函数中删除这一行
    printDocument1.PrintPage+=…
    。我猜这已经发生在
    InitializeComponent()
    内部,这意味着您将显式处理事件两次。打开Form1.Designer.cs文件,查看是否有其他内容需要复制。(除了Init调用之外,构造函数中的所有其他内容都可能是多余的。)@PaulSasik:Nope。对于问题2,删除该行会给我一个白色PDF,无法保存。看看下面我的答案。对于初学者,只需从类中复制/粘贴
    printDocument1\u PrintPage
    方法。要处理双重保存对话框,请查看全部代码。(事件通常在窗体的关联设计器类文件中进行管理。)非常感谢!我感谢你的帮助。我会试试看。再次感谢。:)@史密斯:正如我所说,对于初学者(快速测试),只需复制并粘贴
    printDocument1\u PrintPage
    方法的内容。缩放是自包含的,不需要更改任何其他内容。您可以单独处理更复杂的事件处理。
    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's page
                e.Graphics.DrawImage(_memoryImage, 0, 0);
            }
        }
    }
    
    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;
        }
    }