На этом шаге мы рассмотрим некоторые аспекты управления процессом печати.
Графическое воспроизведение данных приложения на печатную страницу не вызывает затруднений, поскольку для
вывода и на экран и на принтер используется одна и та же функция OnDraw(), которая вызывается как в
функции CView::OnPrint(), так и в CWnd::OnPaint().
При печати:
- на экран выводится диалоговое окно Print;
- для принтера создается объект контекста устройства;
- вызывается функция CDC::StartDoc(), извещающая принтер, что до тех пор, пока не вызвана функция
CDC::EndDoc(), все последующие страницы должны составлять в буфере печати одно задание, благодаря чему
документы, включающие несколько страниц не перемешаются с другими заданиями; - для каждой страницы вызываются функции CDC::StartPage() и CDC::EndPage(), сообщающие
принтеру о начале и завершении страницы соответственно; - в определенные моменты времени вызываются переопределяемые функиии для вида.
В число переопределяемых входят и те функции, в которых реализуется постраничная печать документа, выделяются
GDI-ресурсы для печати, перед выводом страницы на печать посылаются управляющие работой принтера
ESC-последовательности. Чтобы изменить стандартный процесс печати, Вы можете переопределить некоторые
функциии. Все они являются членами класса CView:
Таблица 1. Переопределяемые функции печати
Функция | Действия |
---|---|
OnPreparePrinting() | Позволяет, изменив элементы структуры CPRINTIINFO, ввести собственные значения в диалоговое окно Print. Обычно применяется для установки размера печатаемого документа. Передает структуру CPRINTIINFO методу CView::DoPreparePrinting(), который отображает упомянутое диалоговое окно и создает объект контекста устройства печати |
OnBeginPrinting() | Получает шрифты и другие GDI-ресурсы для вывода на печать |
OnPrepareDC() | Настраивает атрибуты контекста устройства для данной страницы. Если длина документа не задана, выполняет поиск конца документа |
OnPrint() | Предназначена для печати данной страницы и по умолчанию вызывает OnDraw(), которая воспроизводит выводимое изображение. Можно переопределить эту функцию, чтобы страница печати существенно отличалась от изображения на экране |
OnEndPrinting() | Позволяет освободить GDI-ресурсы |
На рисунке 1 показан весь цикл печати и порядок вызова функций печати.
Рис.1. Цикл печати в MFC-приложении
В настоящий момент в диалоговом окне Print приложения МуАрр можно задать любой диапазон
страниц для печати. Эту возможность следует заблокировать, чтобы печатать только одну страницу данных. Добавим
код в функцию СМуАррView::OnPreparePrinting(), который будет задавать максимальное число
печатаемых страниц, равное 1.
- Установка максимального числа страниц печати.
- Запустите приложение МуАрр. В меню File выберите команду
Print и убедитесь, что функция задания диапазона страниц доступна. - На вкладке ClassView раскройте узел CMyAppView.
- Дважды щелкните значок OnPreparePrinting(), чтобы отредактировать одноименный метод.
- В тело функции перед оператором return добавьте следующую строку:
pInfo->SetMaxPage(1);
Рис.2. Функция OnPreparePrinting() - Соберите и запустите приложение МуАрр. В меню File выберите команду Print и
убедитесь, что задание диапазона страниц заблокировано.
Текст измененного приложения можно взять здесь (60,2 Кб).
На следующем шаге мы рассмотрим предварительный просмотр.