使用PrintDocument在winform c#中打印所有控件

时间:2013-03-07 16:50:40

标签: c# printing printdocument

我有一个窗体,其中有多个主要标签和文本框的页面,我正在尝试保留我在winform中的字体,到目前为止我能够打印第一页,但是当我尝试添加其余的控件,它做各种奇怪的东西这是我的代码的一部分,我把所有东西都打印,但不是在打印预览中显示的面板中的所有控件。所以我发现面板中的控件不正常,我需要做的是首先创建打印页数然后将控件放在那些打印页面中。有关尝试创建打印页面以向其添加控件的任何帮助。它总是4个打印页面。

    int mainCount = 0;
    public void printStuff(System.Drawing.Printing.PrintPageEventArgs e)
    {            
        Font printFont = new Font("Arial", 9);
        int dgX = dataGridView1.Left;
        int dgY = dataGridView1.Top += 22;
        double linesPerPage = 0;
        float yPos = 0;
        int count = 0;

        float leftMargin = e.MarginBounds.Left;
        float topMargin = e.MarginBounds.Top;
        float bottomMargin = e.MarginBounds.Bottom;
        StringFormat str = new StringFormat();

        linesPerPage = e.MarginBounds.Height / printFont.GetHeight(e.Graphics);
        Control ctrl;

        while ((count < linesPerPage) && (panel1.Controls.Count != mainCount))           
        {
            ctrl = panel1.Controls[mainCount];
            yPos = topMargin + (count * printFont.GetHeight(e.Graphics));
            mainCount++;
            count++;
            if (ctrl is Label)
            {
                e.Graphics.DrawString(ctrl.Text, printFont, Brushes.Black, ctrl.Left + 5, ctrl.Top + 40);
            }
            else if (ctrl is TextBox)
            {
                e.Graphics.DrawString(ctrl.Text, printFont, Brushes.Black, ctrl.Left + 5, ctrl.Top + 40);
                e.Graphics.DrawRectangle(Pens.Black, ctrl.Left, ctrl.Top + 40, ctrl.Width, ctrl.Height);
            }
        }
        if (count > linesPerPage)
        {
            e.HasMorePages = true;
        }
        else
        {
            e.HasMorePages = false;
        }            
    }

    //Print
    private void exportFileToolStripMenuItem_Click(object sender, EventArgs e)
    {            
        printPreviewDialog1.Document = printDocument1;
        printPreviewDialog1.ShowDialog();
    }

    private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
        printStuff(e);
    }

1 个答案:

答案 0 :(得分:0)

在我看来,问题是在后续页面中,您不会在打印时从控件顶部位置减去“页面偏移”。当你将它们放在打印页面上时,你实际上是在尝试使用控件的屏幕坐标,这显然只适用于第一页。在后续页面中,您需要通过减去相当于“总印刷表面到目前为止”的数量来映射屏幕坐标。

您需要修改此行,例如:

e.Graphics.DrawString(ctrl.Text, printFont, Brushes.Black, ctrl.Left + 5, ctrl.Top + 40);

这样的事情:

e.Graphics.DrawString(ctrl.Text, printFont, Brushes.Black, ctrl.Left + 5, ctrl.Top + 40 - pageOffset);

其中pageOffset是应根据可打印区域的高度计算每个页面的变量:pageOffset = currentPageNumber * heightOfPrintableArea所以您还需要为打印的页数维护一个变量,类似于mainCount

当然,同样适用于if语句的另一个分支:

e.Graphics.DrawString(ctrl.Text, printFont, Brushes.Black, ctrl.Left + 5, ctrl.Top + 40 - pageOffset);
e.Graphics.DrawRectangle(Pens.Black, ctrl.Left, ctrl.Top + 40 - pageOffset, ctrl.Width, ctrl.Height);