Шаг 83 - Многостраничные распечатки

Создание проекта

Будем использовать проект из прошлого шага.

Создаем код

Изменим функцию рисования OnDraw().

void CPr4View::OnDraw(CDC* pDC)
{
	CPr4Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDC->SetMapMode(MM_LOENGLISH);	// режим
	for (int x=0;x<10;x++)
	{
		pDC->Rectangle(20,-(20+x*200),220,-(200+x*200));	// рисуем подряд много прямоугольников
	}
}

Результат на предварительном просмотре будет вот такой. Ужас просто. Нажатие на кнопку "следующая" или "две страницы" ничего не даст. Как есть, так и будет. Одна страница.

83_1.gif (5954 b)

Описание

Общая схема вызова функций на печать выглядит так:

83_2.gif (2492 b)

Функция OnPreparePrinting() вызывается перед началом печати или предварительного просмотра.

Функция OnPrepareDC() вызывается перед перед функцией OnPrint(). Мы можем ее переопределять если необходимо:

Функция OnPrint() вызывается при печати каждой страницы документа. Ее переопределяют для:

Функция OnBeginPrinting() вызывается перед печать документа. Обычно здесь резервируются ресурсы - шрифты, перья и так далее.

Функция OnEndPrinting() - здесь ресурсы надо освободить.

Итак, первое, для распечатки нам надо знать длину страницы в точках и количество точек на дюйм. Узнать длину страницы можно воспользовавшись функцией GetDeviceCaps(), которая есть в CDC. У этой функции куча констант. Смотрите их в подробностях "Подробности - GegDeviceCaps". Нам надо получить вертикальную высоту используя GetDiviceCaps() и VERTEX. А также установить логические единицы LOGPIXELSY. После всех этих процедур мы, наконец, можем узнать количество страниц. Результат вычислений необходимо передать SetMaxPage().

Ну это хорошо, но так же требуется дать понять MFC где находится начало страницы. На данный момент изображение выводится точно также, как и в OnDraw(). Объяснить начало страницы можно в функции OnPrepareDC() используя функцию CDC - SetViewportOrg(). Эта функция вызывается как раз перед передачей данных на печать. Используя номер текущей страницы и изменяя систему координат мы можем добиться распределения информации на несколько страниц. Следует уточнить, что эта функция не создается по умолчанию. Для её создания необходимо использовать Class Wizard.

83_3.gif (4273 b)

Шпаргалка

Вы должны переопределять функции печати класса C...View для настройки печати.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.