http://tikitak.narod.ru ---- Главная страница сайта
Шаг 83 - Многостраничные распечатки
Прошлое приложение было простое всего на одну страницу. Но ваше приложение может создавать приложение монстра на страницу размером AO, а принтер может печатать только на A4. Вот для того, чтобы большое изображение распечатать на несколько страниц и существуют многостраничные распечатки.
Если в предыдущем проекте изменить функцию рисования OnDraw. Вот так.
void CPrintPreviewView::OnDraw(CDC* pDC)
{
CPrintPreviewDoc* 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));
}
}
То результат на предварительном просмотре будет вот такой. Ужас просто.
Вот с этим нам и надо бороться. Для пояснения MFC как надо распределять информацию надо использовать функцию SetMaxPage() в методе OnBeginPrint в классе вида. В нашем предыдущем проекте в функции OnBeginPrinting ничего нет.
void CPrintPreviewView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
Зато здесь есть два указателя на контекст устройства CDC и информацию о принтере CPrintInfo. Для распечатки нам надо знать длинну страницы в точках и количество точек на дюйм. Узнать длину страницы можно воспользовавшись функцией GetDeviceCaps, которая есть в CDC. У этой функции куча констант. Смотрите их в подробностях "Подробности GegDeviceCaps".
Нам надо получить вертикальную высоту используя GetDiviceCaps и VERTEX. А также установить логические единицы LOGPIXELSY. После всех этих процедур мы наконец можем узнать количество страниц. Рузультат вычислений необходимо передать SetMaxPage.
Ну это хорошо, но так же требуется дать понять MFC где находится начало страницы. На данный момент изображение выводится точно также, как и в OnDraw. Объяснить начало страницы можно в функции OnPrepareDC используя функцию CDC - SetViewportOrg. Эта функция вызывается как раз перед передачей данных на печать. Используя номер текущей страницы и изменяя истему координат мы можем добиться распределения информации на несколько страниц. Следует уточнить, что эта функция не создается по умолчанию. Для её создания необходимо использовать Class Wizard.
Если Вы чего-то непоняли, то думаю практика поможет.
Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|