Есть ли простой способ распечатать мою форму Windows? - PullRequest
3 голосов
/ 11 марта 2009

Я только что создал приложение базы данных для запроса деталей.

Он имеет несколько форм: одну для запрашивающей стороны, одну для одобрения супервизора, одну для одобрения покупки и одну для клерка, которую можно использовать, чтобы узнать, что заказать.

Теперь я большой поклонник безбумажной бумаги, но моему работодателю очень нравится их бумага. Есть ли простой способ WYSIWYG дублировать мои формы Windows на бумаге?

Я должен также добавить, что я ограничен использованием 2.0 .Net Framework

Спасибо

Ответы [ 2 ]

4 голосов
/ 11 марта 2009

Вот быстрый способ сделать это. Вы можете очистить код, чтобы он соответствовал вашим потребностям:

    public static class FormExtensions
    {
        public static void PrintForm(this Form f)
        {
            PrintDocument doc = new PrintDocument();
            doc.PrintPage += (o, e) =>
            {
                Bitmap image = new Bitmap(f.ClientRectangle.Width, f.ClientRectangle.Height);
                f.DrawToBitmap(image, f.ClientRectangle);

                e.Graphics.DrawImage(image, e.PageBounds);
            };

            doc.Print();
        }
    }

Это растянет форму до размера страницы. Вы можете настроить второй параметр вызова метода DrawImage, чтобы нарисовать его в других местах, если хотите.

2 голосов
/ 11 марта 2009

Вот пример кода из MSDN , который будет делать то, что вы хотите:

[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern long BitBlt (IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);
private Bitmap memoryImage;
private void CaptureScreen()
{
   Graphics mygraphics = this.CreateGraphics();
   Size s = this.Size;
   memoryImage = new Bitmap(s.Width, s.Height, mygraphics);
   Graphics memoryGraphics = Graphics.FromImage(memoryImage);
   IntPtr dc1 = mygraphics.GetHdc();
   IntPtr dc2 = memoryGraphics.GetHdc();
   BitBlt(dc2, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height, dc1, 0, 0, 13369376);
   mygraphics.ReleaseHdc(dc1);
   memoryGraphics.ReleaseHdc(dc2);
}
private void printDocument1_PrintPage(System.Object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
   e.Graphics.DrawImage(memoryImage, 0, 0);
}
private void printButton_Click(System.Object sender, System.EventArgs e)
{
   CaptureScreen();
   printDocument1.Print();
}

Есть несколько предостережений - здесь нет проверки исключений, плюс вам нужно работать с полным доверием, чтобы использовать неуправляемый API-интерфейс BitBlt, но это, вероятно, самый простой способ распечатать форму Windows Forms, если как это отображается на экране.

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