Search code examples
c#winformsprintingpanel

Resize Panel To Print Full Page


I have a panel on a tabcontrolpanel that takes up roughly 35% of the screen. I am printing the panel, and it prints the exact size it is on the screen. Is it possible in C# and winforms to scale the image to print on a 8.5x11 peice of paper (even if I have to print it landscape)?

This is my current code --

private void btnPrint_Click(object sender, EventArgs e)
{
    PrintDocument doc = new PrintDocument();
    doc.PrintPage += new SPrintPageEventHandler(doc_PrintPage);
    doc.Print();
}

private void doc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    Bitmap image = new Bitmap(panelToPrint.Width, panelToPrint.Height, panelToPrint.CreateGraphics());
    panelToPrint.DrawToBitmap(image, new Rectangle(0, 0, panelToPrint.Width, panelToPrint.Height));
    RectangleF bounds = e.PageSettings.PrintableArea;
    float factor = ((float)image.Height / (float)image.Width);
    e.Graphics.DrawImage(image, bounds.Left, bounds.Top, bounds.Width, factor * bounds.Width);
}

Edit
I tried to modify my syntax to by default print in landscape mode, but I am still getting the same output as before, just the image printing roughly on the top 15% of the page

private void btnPrint_Click(object sender, EventArgs e)
    {
        System.Drawing.Printing.PrintDocument doc = new System.Drawing.Printing.PrintDocument();
        doc.DefaultPageSettings.Landscape = true;
        PrintDialog pdi = new PrintDialog();
        pdi.Document = doc;
        if (pdi.ShowDialog() == DialogResult.OK)
        {
            doc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(doc_PrintPage);
            doc.Print();
        }
        else
        {
            MessageBox.Show("User cancelled the print job");
        }
    }

    private void doc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
        Bitmap image = new Bitmap(panelToPrint.Width, panelToPrint.Height, panelToPrint.CreateGraphics());
        panelToPrint.DrawToBitmap(image, new Rectangle(0, 0, panelToPrint.Width, panelToPrint.Height));
        RectangleF bounds = e.PageSettings.PrintableArea;
        float factor = ((float)image.Height / (float)image.Width);
        e.Graphics.DrawImage(image, bounds.Left, bounds.Top, bounds.Width, factor * bounds.Width);
    }

Solution

  • control.DrawToBitmap does exactly that. It prints the control (as you see it on the screen) to a bitmap. If you want to print it in a different size you have to resize the panel before printing.

    A better approach is to draw your data that is contained into the panel directly to the page using graphics methods like DrawString etc.