0

主にラベルとテキストボックスの複数のページを持つ Windows フォームを取得しました。既に 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);
    }
4

1 に答える 1

0

問題は、後続のページで、印刷時にコントロールのトップ位置から「ページオフセット」を差し引いていないことだと私には思えます。コントロールを印刷ページに配置するときに、基本的にコントロールの画面座標を使用しようとしていますが、これは明らかに最初のページでのみ正しく機能します。後続のページでは、「total-printed-surface-so-far」に相当する量を差し引いて、画面座標をマッピングする必要があります..

たとえば、次の行を変更する必要があります。

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);
于 2013-03-07T16:57:49.017 に答える