Print the entire area of the control with C#

徘徊边缘 提交于 2021-02-08 05:48:17

问题


This is not a duplicat question- the diffenece beetween my question an the others one is my Controler contail a scroller, so they are more informations can't be printed.

I have a C# application that contains a main form name MainForms. This MainForms has a control mainDisplay. I want to print the entire information what we found on the mainDisplay to the printer.

The problem is the information on the the control is too big, and I have to scroll to see all information.

Someone have any function that allow me to print this control MainDisplay with entire information in it?

This the printscreen of the area of my MainDisplay at the right you see the scrollbar:

enter image description here

I use this Function (Source : Printing a control)

private static void PrintControl(Control control)
{
    var bitmap = new Bitmap(control.Width, control.Height);

    control.DrawToBitmap(bitmap, new Rectangle(0, 0, control.Width, control.Height));

    var pd = new PrintDocument();

    pd.PrintPage += (s, e) => e.Graphics.DrawImage(bitmap, 100, 100);
    pd.Print();
}

But my problem still can't print all the informations contain in my control, it's just print a small erea, still need print more informations which are not printed.


回答1:


I find the solution. This is the steps i do :

1 - We have a mainForm, and this main form contain a control mainDisplay with a specific dimension and area, let's say this dimensions is smaller and we get scroll.

2- What i do is i make this mainDisplay Empty.

3- i create an other Control myControlToDisplay. I draw and i put all fields i want without scroll, so this one myControlToDisplay will have a big dimension.

4- on the star-up of my application, i tell to the mainDisplay to load myControlToDisplay. This time all the content of myControlToDisplay will be display on mainDisplay with a scroll. Because mainDisplay have a small area.

5- I write this functions :

Bitmap MemoryImage;
PrintDocument printDoc = new PrintDocument();
PrintDialog printDialog = new PrintDialog();
PrintPreviewDialog printDialogPreview = new PrintPreviewDialog();
Control panel = null;

public void Print(Control pnl)
{
    DateTime saveNow = DateTime.Now;
    string datePatt = @"yyyy-M-d_hh-mm-ss tt";

    panel = pnl;
    GetPrintArea(pnl);
    printDialog.AllowSomePages = true;
    printDoc.PrintPage += new PrintPageEventHandler(Print_Details);
    printDialog.Document = printDoc;
    printDialog.Document.DocumentName = "Document Name";

    //printDialog.ShowDialog();
    if (printDialog.ShowDialog() == DialogResult.OK)
    {
        printDoc.Print();
    }
}

public void PrintPreview(Control pnl)
{
    DateTime saveNow = DateTime.Now;
    string datePatt = @"yyyy-M-d_hh-mm-ss tt";

    panel = pnl;
    GetPrintArea(pnl);           
    printDoc.PrintPage += new PrintPageEventHandler(Print_Details);
    printDialogPreview.Document = printDoc;
    printDialogPreview.Document.DocumentName = "Document Name";

    //printDialog.ShowDialog();
    if (printDialogPreview.ShowDialog() == DialogResult.OK)
    {
        printDoc.Print();
    }
}

private void Print_Details(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    RectangleF marginBounds = e.MarginBounds;

    DateTime saveNow = DateTime.Now;
    string datePatt = @"M/d/yyyy hh:mm:ss tt";
    //String dtString = saveNow.ToString(datePatt);

    // create header and footer
    string header = "Put all information you need to display on the Header";
    string footer = "Print date : " + saveNow.ToString(datePatt);

    Font font = new Font("times new roman", 10, System.Drawing.FontStyle.Regular);
    Brush brush = new SolidBrush(Color.Black);

    // measure them
    SizeF headerSize = e.Graphics.MeasureString(header, font);
    SizeF footerSize = e.Graphics.MeasureString(footer, font);

    // draw header
    RectangleF headerBounds = new RectangleF(marginBounds.Left-80, marginBounds.Top-80, marginBounds.Width, headerSize.Height);
    e.Graphics.DrawString(header, font, brush, headerBounds);

    // draw footer
    RectangleF footerBounds = new RectangleF(marginBounds.Left-80, marginBounds.Bottom - footerSize.Height+80, marginBounds.Width, footerSize.Height);
    e.Graphics.DrawString(footer, font, brush, footerBounds);

    // dispose objects
    font.Dispose();
    brush.Dispose();
}

public void GetPrintArea(Control pnl)
{
    MemoryImage = new Bitmap(pnl.Width, pnl.Height);
    Rectangle rect = new Rectangle(0, 0, pnl.Width, pnl.Height);
    pnl.DrawToBitmap(MemoryImage, new Rectangle(0, 0, pnl.Width, pnl.Height));
}

protected override void OnPaint(PaintEventArgs e)
{
    if (MemoryImage != null)
    {
        e.Graphics.DrawImage(MemoryImage, 0, 0);
        base.OnPaint(e);
    }
}
void PrintDoc_PrintPage(object sender, PrintPageEventArgs e)
{
    Rectangle pageArea = e.PageBounds;
    Rectangle m = e.MarginBounds;

    if ((double)MemoryImage.Width / (double)MemoryImage.Height > (double)m.Width / (double)m.Height) // image is wider
    {
        m.Height = (int)((double)MemoryImage.Height / (double)MemoryImage.Width * (double)m.Width);
    }
    else
    {
        m.Width = (int)((double)MemoryImage.Width / (double)MemoryImage.Height * (double)m.Height);
    }

    e.Graphics.DrawImage(MemoryImage, m);

}

6 -And finally we suppose that we have two buttons, one to Print and the other one to print preview. You just have to call this function :

private void PrintButton_Click(object sender, EventArgs e)
{
    try
    {
        Print(mainDisplay.getCurentPanel());
    }
    catch (Exception exp)
    {
        MessageBox.Show("Error: \n" + exp.Message);
    }
}

private void PrintPreviewButton_Click(object sender, EventArgs e)
{
    try
    {
        PrintPreview(mainDisplay.getCurentPanel());
    }
    catch (Exception exp)
    {
        MessageBox.Show("Error: \n" + exp.Message);
    }
}

Hope it will help someone :)

good luck



来源:https://stackoverflow.com/questions/24717247/print-the-entire-area-of-the-control-with-c-sharp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!