1

自从我上一个问题以来,我在 C# 中打印表单方面做了更多的工作,现在我得到了这段代码:

    public void printToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Rectangle bounds = this.Bounds;
        Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height);

        Graphics g = Graphics.FromImage(bitmap);            
        g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);             


        PrintDocument doc = new PrintDocument();
        doc.PrintPage += this.Doc_PrintPage;

        PrintDialog dlgSettings = new PrintDialog();
        dlgSettings.Document = doc;

        if (dlgSettings.ShowDialog() == DialogResult.OK)
        {
            doc.Print();
        }
    }

    private void Doc_PrintPage(object sender, PrintPageEventArgs e)
    {

        float x = e.MarginBounds.Left;
        float y = e.MarginBounds.Top;

        e.Graphics.DrawImage(bitmap);
    }

其中 printToolStripMenuItem_Click 是打印按钮。我知道我已经很接近了,因为我在编辑代码以满足我的需要之前看到了打印对话框。现在,我收到一个错误,在“e.Graphics.DrawImage(bitmap);”中显示“位图” 在上下文中不存在。

我可以改变什么来使这个打印图像?在尝试创建打印文档之前,我正在尝试打印屏幕图像,因为这看起来更容易,并且可以正常工作。我有时很懒 :P

注意:这是我的 form2.cs 文件中的所有代码,我需要打印的表单。

谢谢 :)

4

2 回答 2

1

您应该使用匿名方法在函数创建事件处理程序。
这样,它仍然可以通过闭包的魔力读取您的局部变量。

doc.PrintPage += (s, e) => {
    float x = e.MarginBounds.Left;
    float y = e.MarginBounds.Top;

    e.Graphics.DrawImage(bitmap);
};
于 2013-10-10T21:18:29.583 回答
1

您正在声明位图,printToolStripMenuItem_Click但在Doc_PrintPage. 你需要以某种方式通过它。最简单的方法是使它成为一个实例变量(即在类中而不是在方法中声明它,然后在 中分配它printToolStripMenuItem_Click)。

public class SomeForm
{
  private Bitmap bitmap;
  public void printToolStripMenuItem_Click(object sender, EventArgs e)
  {
    //...
    bitmap = new Bitmap(bounds.Width, bounds.Height);
    //...
  }
}

您还缺少e.Graphics.DrawImage调用中的参数。您需要指定在哪里绘制图像。例如,如果您希望它位于左上角,请执行以下操作:

e.Graphics.DrawImage(bitmap, new Point(0,0));
于 2013-10-10T21:12:05.007 回答