Как распечатать групповое поле с помощью предварительного просмотра? - PullRequest
0 голосов
/ 11 января 2020

enter image description here

Приведенный ниже код показывает мне половину группы в окне предварительного просмотра:

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) {
  //  Bitmap bmp = new Bitmap(groupBox1.ClientRectangle.Width, groupBox1.ClientRectangle.Height);
  //  groupBox1.DrawToBitmap(bmp, groupBox1.ClientRectangle);
  //  e.Graphics.DrawImage(bmp, 0, 0);

  Bitmap bmp = new Bitmap(groupBox1.Width, groupBox1.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
  groupBox1.DrawToBitmap(bmp, new Rectangle(0, 0, groupBox1.Width, groupBox1.Height));
  e.Graphics.DrawImage((Image) bmp, 0, 0);
}

private void button1_Click(object sender, EventArgs e) {
  PrintPreviewDialog ppd = new PrintPreviewDialog();
  PrintDocument Pd = new PrintDocument();

  Pd.PrintPage += this.printDocument1_PrintPage;
  ppd.Document = Pd;
  ppd.ShowDialog();
}

1 Ответ

1 голос
/ 11 января 2020

Вам необходимо рисовать в границах страницы.

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    var g = e.Graphics;
    var srcRect = new Rectangle(0, 0, groupBox1.Width, groupBox1.Height);
    var desRect = new Rectangle(e.PageBounds.X, e.PageBounds.Y, e.PageBounds.Width, srcRect.Height);
    //Or to draw within the margin
    //var desRect = new Rectangle(e.MarginBounds.X, e.MarginBounds.Y, e.MarginBounds.Width, srcRect.Height);

    using (var bmp = new Bitmap(srcRect.Width, srcRect.Height))
    {
        groupBox1.DrawToBitmap(bmp, srcRect);
        g.DrawImage(bmp, desRect, srcRect, GraphicsUnit.Pixel);
    }
}

Кроме того, создайте объект PrintDocument и зарегистрируйте его событие PrintPage в конструкторе формы или событие Load, чтобы избежать повторения это снова и снова в событии button1_Click. И не забудьте утилизировать одноразовые предметы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...