none
Как напечатать дочернюю форму? RRS feed

  • Вопрос

  • Я создаю проект, в котором есть Mdi форма и несколько дочерних форм, нужно сделать так чтобы при нажатии на кнопку Печать в главной форме печаталось активное дочернее окно. Нужно ли мне для каждой дочерней формы создавать отдельные PrintDocument и PrintPreviewDilog или можно все оформить в одном PrintDocument-е. А также как мне отправить данные из ComboBox-а, DataGrid-а и других Control-ов в PrintDocument.  Mdi форма и дочернее окно выглядит следующим образом:


    Помогите пожалуйста, очень очень нужно...


    • Изменено MuzaIslomova 15 июня 2012 г. 7:36
    • Изменен тип MuzaIslomova 15 июня 2012 г. 8:41
    • Изменен тип MuzaIslomova 15 июня 2012 г. 9:08
    • Изменен тип Abolmasov Dmitry 5 июля 2012 г. 7:38
    • Перемещено Abolmasov Dmitry 5 июля 2012 г. 7:38 (От:Работа в среде Visual Studio)
    15 июня 2012 г. 7:35

Ответы

  • [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;

            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
            }

            private void button3_Click(object sender, EventArgs e)
            {
                memoryImage = new Bitmap(groupBox1.Width, groupBox1.Height);
                groupBox1.DrawToBitmap(memoryImage, new Rectangle(0, 0, groupBox1.Width, groupBox1.Height));
                ShowPrintDialog();

                // Метод DrawToBitmap не поддерживается для элементов ActiveX. Можно переопределить событие OnPrint и предоставить пользовательскую логику печати, если это требуется.
                // Использование метода DrawToBitmap имеет следующие ограничения:
                // * Исключение ArgumentException может выдаваться для больших точечных рисунков. Максимально допустимый размер определяется особенностями компьютера.
                // * Метод DrawToBitmap не поддерживает элементы управления Ink для операционных систем Windows XP Tablet PC Edition 2005.
                // * Метод DrawToBitmap не прорисовывает дочерний объект TextBox, если для свойства Visible объекта TextBox задано значение false.
                // * Элементы управления внутри контейнеров прорисовываются в обратном порядке.
                // * Метод DrawToBitmap обладает ограниченной функциональностью по отношению к объекту RichTextBox; с его помощью прорисовывается только граница точечного рисунка. 
                //
                // http://msdn.microsoft.com/ru-ru/library/system.windows.forms.control.drawtobitmap.aspx

            }

            private void button7_Click(object sender, EventArgs e)
            {
                Graphics mygraphics = this.groupBox1.CreateGraphics();
                Size s = this.groupBox1.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, groupBox1.ClientRectangle.Width, groupBox1.ClientRectangle.Height, dc1, 0, 0, 13369376);
                mygraphics.ReleaseHdc(dc1);
                memoryGraphics.ReleaseHdc(dc2);

                ShowPrintDialog();

                // Прример печати копии формы или отдельного контейнера
                // Исключение может возникнуть при следующих условиях.
                // * Нет разрешения на доступ к принтеру.
                // * Нет разрешения на использование неуправляемого кода.
                // * Принтер не установлен.
                //
                // http://msdn.microsoft.com/ru-ru/library/85s6fdty.aspx
            }

            private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
            {
                Rectangle destRect = new System.Drawing.Rectangle(100, 100, groupBox1.Width, groupBox1.Height);
                e.Graphics.DrawImage(memoryImage, destRect, 0, 0, memoryImage.Width, memoryImage.Height, System.Drawing.GraphicsUnit.Pixel);
            
                // Указатели для наглядности
                using (Pen pen = new Pen(Color.Red, 5))
                {
                    e.Graphics.DrawEllipse(pen, 420, 160, 200, 80);
                    e.Graphics.DrawRectangle(pen, 130, 240, 265, 120);
                }
            }

            private void ShowPrintDialog()
            {
                PrintDocument printDocument = new PrintDocument();
                printDocument.PrintPage += new PrintPageEventHandler(printDocument_PrintPage);
                PrintPreviewDialog dlg = new PrintPreviewDialog();
                dlg.Document = printDocument;
                dlg.ShowDialog();
            }
        }

    4 февраля 2013 г. 14:54

Все ответы

  • Уважаемый пользователь!

    В вашей теме отсутствует активность в течение последних 5 дней. При отсутствии каких-либо действий в течение 2 последующих дней, тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме


    Для связи [mail]

  • [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;

            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
            }

            private void button3_Click(object sender, EventArgs e)
            {
                memoryImage = new Bitmap(groupBox1.Width, groupBox1.Height);
                groupBox1.DrawToBitmap(memoryImage, new Rectangle(0, 0, groupBox1.Width, groupBox1.Height));
                ShowPrintDialog();

                // Метод DrawToBitmap не поддерживается для элементов ActiveX. Можно переопределить событие OnPrint и предоставить пользовательскую логику печати, если это требуется.
                // Использование метода DrawToBitmap имеет следующие ограничения:
                // * Исключение ArgumentException может выдаваться для больших точечных рисунков. Максимально допустимый размер определяется особенностями компьютера.
                // * Метод DrawToBitmap не поддерживает элементы управления Ink для операционных систем Windows XP Tablet PC Edition 2005.
                // * Метод DrawToBitmap не прорисовывает дочерний объект TextBox, если для свойства Visible объекта TextBox задано значение false.
                // * Элементы управления внутри контейнеров прорисовываются в обратном порядке.
                // * Метод DrawToBitmap обладает ограниченной функциональностью по отношению к объекту RichTextBox; с его помощью прорисовывается только граница точечного рисунка. 
                //
                // http://msdn.microsoft.com/ru-ru/library/system.windows.forms.control.drawtobitmap.aspx

            }

            private void button7_Click(object sender, EventArgs e)
            {
                Graphics mygraphics = this.groupBox1.CreateGraphics();
                Size s = this.groupBox1.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, groupBox1.ClientRectangle.Width, groupBox1.ClientRectangle.Height, dc1, 0, 0, 13369376);
                mygraphics.ReleaseHdc(dc1);
                memoryGraphics.ReleaseHdc(dc2);

                ShowPrintDialog();

                // Прример печати копии формы или отдельного контейнера
                // Исключение может возникнуть при следующих условиях.
                // * Нет разрешения на доступ к принтеру.
                // * Нет разрешения на использование неуправляемого кода.
                // * Принтер не установлен.
                //
                // http://msdn.microsoft.com/ru-ru/library/85s6fdty.aspx
            }

            private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
            {
                Rectangle destRect = new System.Drawing.Rectangle(100, 100, groupBox1.Width, groupBox1.Height);
                e.Graphics.DrawImage(memoryImage, destRect, 0, 0, memoryImage.Width, memoryImage.Height, System.Drawing.GraphicsUnit.Pixel);
            
                // Указатели для наглядности
                using (Pen pen = new Pen(Color.Red, 5))
                {
                    e.Graphics.DrawEllipse(pen, 420, 160, 200, 80);
                    e.Graphics.DrawRectangle(pen, 130, 240, 265, 120);
                }
            }

            private void ShowPrintDialog()
            {
                PrintDocument printDocument = new PrintDocument();
                printDocument.PrintPage += new PrintPageEventHandler(printDocument_PrintPage);
                PrintPreviewDialog dlg = new PrintPreviewDialog();
                dlg.Document = printDocument;
                dlg.ShowDialog();
            }
        }

    4 февраля 2013 г. 14:54