Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Печать части окна программы.


Автор: ldk13 9.11.2008, 14:45
Помогите пожалуйста, нужно напечатать часть окна программы. Все окно размером 1010 на 570. А напечатать надо по координатам прямоугольника 10(Х начальное),10(У начальное),800(ширина),500(длина).

я так понимаю нужно использовать printdialog?

Как это сделать?

Автор: ldk13 9.11.2008, 17:47
Ну или вообще как напечатать окно формы? Хотя бы целиком все. Как вообще печатать?

Автор: mr.DUDA 9.11.2008, 20:11
Да проще простого!
Код
Rectangle rect = new Rectangle(10, 10, 800, 500);
Bitmap bmp = new Bitmap(rect.Width, rect.Height);
DrawToBitmap(bmp, rect);


Всё, в битмапе лежит твоя форма. Подразумевается что код выполняется для формы; если нужно скопировать содержимое произвольного контрола, юзаем myControl.DrawToBitmap и так далее.

Автор: ldk13 9.11.2008, 20:22
mr.DUDA, а как напечать вывести этот bmp? :(

printDialog1.ShowDialog(); c помощью вот этого.

Автор: mr.DUDA 9.11.2008, 20:26
Код
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Bitmap _bmp;

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            Rectangle rect = new Rectangle(10, 10, 800, 500);
            _bmp = new Bitmap(rect.Width, rect.Height);
            DrawToBitmap(_bmp, rect);

            PrintDialog dlg = new PrintDialog();
            dlg.Document = new System.Drawing.Printing.PrintDocument();

            if (dlg.ShowDialog(this) == DialogResult.OK)
            {
                dlg.Document.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(Document_PrintPage);
                dlg.Document.Print();
            }
        }

        void Document_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            e.Graphics.DrawImage(_bmp, new Point(e.MarginBounds.Left, e.MarginBounds.Top));
        }
    }
}

Автор: ldk13 9.11.2008, 20:55
Сделал так:

Код

private void button17_Click(object sender, EventArgs e)
        {
            Rectangle rect = new Rectangle(10, 10, 800, 500);
            _bmp = new Bitmap(rect.Width, rect.Height);
            DrawToBitmap(_bmp, rect);
            PrintDialog dlg = new PrintDialog();
            dlg.Document = new System.Drawing.Printing.PrintDocument();
            if (dlg.ShowDialog(this) == DialogResult.OK)
            {
                dlg.Document.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(Document_PrintPage);
                dlg.Document.Print();
            }
        }

        void Document_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            e.Graphics.DrawImage(_bmp, new Point(e.MarginBounds.Left, e.MarginBounds.Top));
        }

Часть окна напечатать получилось, спасибо! Но она печатается пустое... А надо что было с тем, что на нем нарисовано...

Как на картинке.

Квадрат не захватывает почему то рисунок.

+ 
еще по теме, когда окно сворачивается или разворачивается нарисованное теряется.. Пробовал исправить обработчиком Activated. Но это помогает частично, все равно когда сворачиваешь и разворачиваешь рисунок пропадает, надо перисовать кнопкой...

Автор: mr.DUDA 9.11.2008, 21:18
В DrawToBitmap как-то по кривому обрабатывается переданный прямоугольник. Можно отрисовать полнотстью всё окно в один битмап, затем создать Graphics из нового битмапа по требуемым размерам и сделать туда DrawImage первого битмапа.

Насчёт сворачивать-разворачивать, скорее всего нужно обработать первое событие Paint после Activated и уже там делать DrawToBitmap, там размеры окна будут актуальны.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)