Xonfused Ответов: 2

Как напечатать больше страниц в C# (printdocument)


Итак, вот в чем дело. Я хочу напечатать текст на большем количестве страниц, текст, который будет вставлен Пользователем в текстовое поле (шутка, чтобы иметь изображение).. Я приведу вам простой пример того, что я пытаюсь сделать:

одним нажатием кнопки я хочу вызвать диалоговое окно предварительного просмотра печати (вот как):

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


После этого в printdocument я делаю вот что: (не настоящий код, шутка небольшой пример)

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
       Font myFont = new Font("m_svoboda", 14, FontStyle.Underline, GraphicsUnit.Point);
       int y = e.MarginBounds.Top;
       for (int i=0; i<70; i++)
       {
              e.Graphics.DrawString("TEST", myFont, Brushes.Black, new PointF(e.MarginBounds.Left, y));
              y += 35;
       }
}



Так вот, вот так он не напишет все 70 строк, поэтому ему нужно открыть новую страницу.. Но как это сделать?. У меня есть попытка С "Е".HasMorePages", но безрезультатно. Поэтому, пожалуйста, если кто-то знает, как решить эту проблему, дайте мне знать..
(решение этого простого примера очень и очень помогло бы мне!)..

РЕДАКТИРОВАТЬ:

Спасибо за ответ. Но я все еще не могу решить эту проблему.. Я уже видел это, но для меня это немного сложно (не упомянул, что я новичок)
Например, в этом проекте я не знаю, что такое/do "StreamReader streamToPrint", поэтому он меня в шутку смущает..
Вот что я попробовал (то, что я думал, что это будет правильно):
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
        {
            Font myFont = new Font("m_svoboda", 14, FontStyle.Underline, GraphicsUnit.Point);            
            int y = e.MarginBounds.Top;
            for (int i = 0; i &lt; 70; i++)
            {                
                if (y &gt;= e.MarginBounds.Bottom)
                {
                    e.HasMorePages = true;
                    y = e.MarginBounds.Top;
                }
                else
                {
                    e.HasMorePages = false;
                    e.Graphics.DrawString("TEST", myFont, Brushes.Black, new PointF(e.MarginBounds.Left, y));
                    y += 25;
                }
            }
        }

Но это не работает..
Теперь, если бы вы (кто-нибудь) могли написать мне код, в котором 70 строк теста слова были бы написаны, одна под другой, на нескольких страницах по мере необходимости ... или любое количество слов, мне бы очень хотелось, чтобы компилятор знал, сколько новых страниц должно открыться, и написал нужный текст на нужной странице..
Я надеюсь, что вы могли понять меня, что я хочу знать, и что вы будете мне помочь..
Спасибо Вам вперед..

Последнее редактирование: теперь это здорово. Спасибо, Ник..

2 Ответов

Рейтинг:
12

Nicholas Butler

Я думаю, что вы упускаете из виду то, что PrintPage поднимается один раз для каждой страницы. Если вы установите e.HasMorePages = true; когда вы закончите и выйдете из обработчика, он будет вызван снова для печати следующей страницы. Это будет продолжаться до тех пор, пока вы не установите e.HasMorePages = false; это означает, что вы закончили все свои страницы.

Это даст вам идею:

== МОДИФИЦИРОВАННЫЙ ==

private int _Line = 0;

private void button2_Click(object sender, EventArgs e)
{
    printPreviewDialog1.Document = printDocument1;

    _Line = 0; // initialize printing
    printPreviewDialog1.ShowDialog();
}

void printDocument1_PrintPage( object sender, PrintPageEventArgs e )
{
    Font myFont = new Font( "m_svoboda", 14, FontStyle.Underline, GraphicsUnit.Point );

    float lineHeight = myFont.GetHeight( e.Graphics ) + 4;

    float yLineTop = e.MarginBounds.Top;

    for ( ; _Line < 70 ; _Line++ )
    {
        if ( yLineTop + lineHeight > e.MarginBounds.Bottom )
        {
            e.HasMorePages = true;
            return;
        }

        e.Graphics.DrawString( "TEST: " + _Line, myFont, Brushes.Black,
            new PointF( e.MarginBounds.Left, yLineTop ) );

        yLineTop += lineHeight;
    }

    e.HasMorePages = false;
}



Извините за предыдущую (сломанную) версию. Я действительно управлял этим!



== МОДИФИЦИРОВАННЫЙ ==

Это только один пример. Есть много способов реализовать это.

Ник


Member 13080248

- Спасибо, Ник. Вы джентльмен и ученый.

Торби

Рейтинг:
11

Nicholas Butler

Если вы еще не закончили и вам нужна еще одна страница, то установите:

PrintPageEventArgs.HasMorePages = true;

В вашем PrintPage обработчик. Затем ваш обработчик будет вызван снова с новым PrintPageEventArgs.MarginBounds. Используйте это, чтобы вычислить, какую страницу печатать.

Есть (нехарактерно ) хороший пример на MSDN[^].

Ник