private void btn3_Click(object sender, EventArgs e)
{
Graphics panelGraphics = panel1.CreateGraphics();
PrintDocument doc = new PrintDocument();
doc.PrintPage += (sndr, args) => {
using (Bitmap image = new Bitmap(panel1.Width, panel1.Height, panelGraphics))
{
panel1.DrawToBitmap(image, panel1.ClientRectangle);
args.Graphics.DrawImage(image, 0, 0);
}
};
using (PrintDialog dlg = new PrintDialog())
{
dlg.Document = doc;
if (dlg.ShowDialog() == DialogResult.OK)
doc.PrintPage += new PrintPageEventHandler(doc_PrintPage);
doc.Print();
}
}
private void doc_PrintPage(object sender, PrintPageEventArgs ev)
{
}
Panel увеличивается за счёт AutoScroll.Динамически добавляю элементы и надо сделать так, чтобы добавлялась страница, если элементы не влезают на предыдущую страницу и был конец операции, если элементов нет, помогите пожалуйста, если можете
Другие языки программирования и технологии
C# Печать нескольких страниц за счёт разделения элемента panel на отдельные участки, помогите, пожалуйста.
Во-первых, если используется AutoScroll, то DrawToBitmap не подходит, т. к. этот метод рисует только видимую часть панели (как она отображается на экране). Тебе придётся самому перебирать и рисовать все контролы на панели. Например так:
Bitmap GetImage(Panel panel) {
Bitmap bmp = null;
using (Graphics g = panel.CreateGraphics()) {
bmp = new Bitmap(panel.DisplayRectangle.Width, panel.DisplayRectangle.Height, g);
}
using (Graphics g = Graphics.FromImage(bmp)) {
g.Clear(panel.BackColor);
foreach (Control c in panel.Controls) {
Rectangle rect = c.Bounds;
rect.Offset(-panel.DisplayRectangle.Left, -panel.DisplayRectangle.Top);
c.DrawToBitmap(bmp, rect);
}
}
return bmp;
}
(предполагается что фон панели - простая заливка каким-либо цветом, а границу панели рисовать не нужно). А теперь печать:
PrintDocument doc = new PrintDocument();
Bitmap image = GetImage(panel1);
int top = 0; // здесь будем запоминать сколько уже напечатано
doc.PrintPage += (sndr, args) => {
// по соотношению сторон страницы вычисляем какая часть изображения на неё влезет:
double r = (double)(args.MarginBounds.Height) / args.MarginBounds.Width;
int height = Math.Min(image.Height, (int)(r * image.Width));
// печатаем эту часть:
Rectangle src = new Rectangle(0, top, image.Width, height);
Rectangle dst = args.MarginBounds;
dst.Height = (int)((double)height / image.Width * args.MarginBounds.Width);
args.Graphics.DrawImage(image, dst, src, GraphicsUnit.Pixel);
// запоминаем где закончилась последняя напечатанная часть:
top += height;
// проверяем, осталось ли ещё что печатать:
if (top < image.Height) args.HasMorePages = true; //если есть - продолжаем печать
else image.Dispose(); // или освобождаем изображение
};
using (PrintDialog dlg = new PrintDialog()) {
dlg.Document = doc;
if (dlg.ShowDialog() == DialogResult.OK) doc.Print();
}
все вычисления рассчитаны на то, что содержимое панели "растёт" по вертикали, а печать выполняется с полями (отступами от краёв листа). Если поля не нужны - замени "args.MarginBounds" на "args.PageBounds".
Bitmap GetImage(Panel panel) {
Bitmap bmp = null;
using (Graphics g = panel.CreateGraphics()) {
bmp = new Bitmap(panel.DisplayRectangle.Width, panel.DisplayRectangle.Height, g);
}
using (Graphics g = Graphics.FromImage(bmp)) {
g.Clear(panel.BackColor);
foreach (Control c in panel.Controls) {
Rectangle rect = c.Bounds;
rect.Offset(-panel.DisplayRectangle.Left, -panel.DisplayRectangle.Top);
c.DrawToBitmap(bmp, rect);
}
}
return bmp;
}
(предполагается что фон панели - простая заливка каким-либо цветом, а границу панели рисовать не нужно). А теперь печать:
PrintDocument doc = new PrintDocument();
Bitmap image = GetImage(panel1);
int top = 0; // здесь будем запоминать сколько уже напечатано
doc.PrintPage += (sndr, args) => {
// по соотношению сторон страницы вычисляем какая часть изображения на неё влезет:
double r = (double)(args.MarginBounds.Height) / args.MarginBounds.Width;
int height = Math.Min(image.Height, (int)(r * image.Width));
// печатаем эту часть:
Rectangle src = new Rectangle(0, top, image.Width, height);
Rectangle dst = args.MarginBounds;
dst.Height = (int)((double)height / image.Width * args.MarginBounds.Width);
args.Graphics.DrawImage(image, dst, src, GraphicsUnit.Pixel);
// запоминаем где закончилась последняя напечатанная часть:
top += height;
// проверяем, осталось ли ещё что печатать:
if (top < image.Height) args.HasMorePages = true; //если есть - продолжаем печать
else image.Dispose(); // или освобождаем изображение
};
using (PrintDialog dlg = new PrintDialog()) {
dlg.Document = doc;
if (dlg.ShowDialog() == DialogResult.OK) doc.Print();
}
все вычисления рассчитаны на то, что содержимое панели "растёт" по вертикали, а печать выполняется с полями (отступами от краёв листа). Если поля не нужны - замени "args.MarginBounds" на "args.PageBounds".
Похожие вопросы
- Дан двумерный массив C(m,n). Найти произведение элементов, больших среднего значения. Помогите пожалуйста!!!
- Дан двумерный массив C(m,n). Найти произведение элементов, больших среднего значения. Помогите пожалуйста!!! На паскале
- Помогите пожалуйста написать программу на c++. Циклически сдвинуть массив на k элементов влево.
- Помогите пожалуйста написать программу на c++. Упорядочить элементы одномерного массива по убыванию.
- Помогите пожалуйста разобрать задачу по програмированию на C++.
- дана матрица а размерности n на m. Найти максимальный элемент в каждом столбце. Помогите пожалуйста решить. На языке C++
- Помогите пожалуйста!Какое различие от ОЗУ и диска C или D ?
- здравствуйте, помогите пожалуйста, что не так вот c C++ кодом:
- Помогите пожалуйста решить на языке C++
- Перевести C++ => C# Помогите пожалуйста!