试图用C#打印面板

时间:2015-02-04 17:58:41

标签: c# visual-studio-2013

我正在尝试打印一个包含图片框,标签和文本框的面板。我想在A4纸上打印,所以面板有595x842。 我试过了:

private void print_Click(object sender, EventArgs e)
{
    PrintPanel(panel1);   
}

private void PrintPanel(Panel pnl)
{
    PrintDialog myPrintDialog = new PrintDialog();
    System.Drawing.Bitmap memoryImage = new System.Drawing.Bitmap(pnl.Width, pnl.Height);
    pnl.DrawToBitmap(memoryImage, pnl.ClientRectangle);
    if (myPrintDialog.ShowDialog() == DialogResult.OK)
    {
        System.Drawing.Printing.PrinterSettings values;
        values = myPrintDialog.PrinterSettings;
        myPrintDialog.Document = printDocument1;
        printDocument1.PrintController = new StandardPrintController();
        printDocument1.Print();
    }
    printDocument1.Dispose();
}

当我尝试打印时,我会转到One Note,而我得到的只是一个白页。什么似乎是问题?


我修改了一下代码。现在我得到一些输出,但它仍然不好...... 这是我使用的代码:

private void print_Click(object sender, EventArgs e)
{
   System.Drawing.Printing.PrintDocument doc = new System.Drawing.Printing.PrintDocument();
   doc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(doc_PrintPage);
   doc.Print();
}
    private void doc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
   Panel grd = new Panel();
   Bitmap bmp = new Bitmap(grd.Width, grd.Height, grd.CreateGraphics());
   grd.DrawToBitmap(bmp, new Rectangle(0, 0, grd.Width, grd.Height));
   RectangleF bounds = e.PageSettings.PrintableArea;
   float factor = ((float)bmp.Height / (float)bmp.Width);
   e.Graphics.DrawImage(bmp, bounds.Left, bounds.Top, bounds.Width, factor * bounds.Width);
}    

我明白了:

http://i.stack.imgur.com/HB1EH.png

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

您正在打印错误的面板。您的代码正在创建一个新的空面板并尝试打印它(它成功完成)。您需要引用要打印的现有面板:

void doc_PrintPage(object sender, PrintPageEventArgs e) {
  using (Bitmap bmp = new Bitmap(panel1.ClientSize.Width, panel1.ClientSize.Height)) {
    panel1.DrawToBitmap(bmp, panel1.ClientRectangle);
    RectangleF bounds = e.PageSettings.PrintableArea;
    float factor = ((float)bmp.Height / (float)bmp.Width);
    e.Graphics.DrawImage(bmp, bounds.Left, bounds.Top,
                              bounds.Width, factor * bounds.Width);
  }
}