Поделиться через


Многостраничные документы

В этом разделе описываются Windows ввод протокола и объясняет, как печатать документы, содержащие более одной страницы. Раздел охватывает следующее:

  • Протокол печати

  • Переопределение функции класса представления.

  • Разбиение на страницы

  • Страниц принтера и страниц документа

  • Разбиение на страницы PRINT-Time

Протокол печати

Для печати документа multipage платформа и представление взаимодействуют следующим образом. Сначала платформа отображает диалоговое окно Печать, создает контекст устройства для принтера и вызывает функцию-член StartDoc объекта CDC. Затем для каждой страницы документа, платформа вызывает функцию-член StartPage объекта CDC, указывает объект представления для печати страницы и вызывает функцию-член EndPage. Если нужно изменить режим принтера перед началом указанную страницу, представление вызывает функцию ResetDC, которая обновляет структура DEVMODE, содержащий новые сведения о режиме принтера. Когда весь документ был напечатан, платформа вызывает функцию-член EndDoc.

Переопределение функции класса представления.

Класс CView определяет несколько функций-членов, вызываются средой во время печати. Можно переопределить эти функции по в представлении класса необходимо сначала проводилась логику печати логических связей между платформы ввод и класса представления. В следующей таблице перечислены этих функций-членов.

Функции переопределяемого метода CView для печати

Name

Причина переопределения

OnPreparePrinting

Вставка значений в диалоговое окно печати, особенно длина документа

OnBeginPrinting

Выбор шрифты или других ресурсов GDI

OnPrepareDC

Настроить атрибуты контекста устройства для данной страницы или разбиение на страницы PRINT- время задачи

OnPrint

Печать заданного страницу

OnEndPrinting

Отменить ресурсов GDI

Это можно сделать печать- связанный обработки в других функциях, но эти функции один, управляющих процессом печати.

На следующем рисунке показаны действия, которые участвуют в процесс печати и показано, где каждое из CView ввод функции-члены называется. В оставшейся части этой статьи в большинство этих шагов более подробно. Дополнительные части процесса печати описаны в статье Выделение ресурсов GDI.

Цикл печати

Процесс цикла печати

Разбиение на страницы

Платформа сохраняет многие сведения о задании печати в структуре CPrintInfo. Несколько значений в CPrintInfo относятся к разбиению на страницы; эти значения доступны, как показано в следующей таблице.

Данные номера страниц, хранящиеся в CPrintInfo

Переменную-член или

имена функций

Указанный номер страницы

GetMinPage/SetMinPage

Первая страница документа

GetMaxPage/SetMaxPage

Последняя страница документа

GetFromPage

Первая страница, который нужно напечатать

GetToPage

Последняя страница, который нужно напечатать

m_nCurPage

В настоящее время, печатанной страницы

Номера страниц от 1, то есть первая страница пронумерована 1, а не 0. Дополнительные сведения о это и другие члены из ссылку MFC см. в разделе CPrintInfo.

В начале процесса печати, платформа вызывает функцию-член OnPreparePrinting представления, передав указатель на структуру CPrintInfo. Мастер приложений предоставляет реализацию OnPreparePrinting, которая вызывает функцию-член DoPreparePrinting, другой CView. DoPreparePrinting функция, которая выводит диалоговое окно печати и создает контекст устройства принтера.

На этом этапе приложение не знает количество страниц в документе. Он использует значения по умолчанию 1 и 0xFFFF чисел для первой и последней страницы документа. Если известно, количество страниц в документ содержит, переопределите OnPreparePrinting и вызов SetMaxPage для структуры CPrintInfo перед отправить его в DoPreparePrinting. Это позволяет определить длину документа.

DoPreparePrinting затем отображается диалоговое окно печати. Если возвращается, структура CPrintInfo содержит значения определенных пользователем. Если желания пользователя для печати только выделенный диапазон страниц, его или ее могут указывать начальный и конечный номер страницы диалогового окна печати. Платформа получает эти значения с помощью функции GetFromPage и GetToPageCPrintInfo. Если пользователь не задает диапазон страниц, платформа вызывает GetMinPage и GetMaxPage и использует значения, возвращаемые для печати весь документ.

Для каждой страницы документа, который должен быть напечатан, платформа вызывает функцию-член по 2 в представлении классом, OnPrepareDC и OnPrint, и передает каждой функции 2 параметра: указатель на объект CDC и указатель на структуру CPrintInfo. Каждый раз, когда платформа вызывает OnPrepareDC и OnPrint, она передает изменения значения в элементе m_nCurPage структуры CPrintInfo. Таким образом, платформа это представление, страница должна быть напечатана.

Функцию-член OnPrepareDC используется также для экранного отображения. Это делает коррекции к контексту устройства до рисования происходит. OnPrepareDC служит как роль в печати, но некоторые отличия. во-первых, объект CDC представляет контекст устройства принтера вместо контекста устройства экрана, а во-вторых, объект CPrintInfo передается в качестве второго параметра. (Этот параметр NULL при OnPrepareDC вызывается для экранного отображения). Переопределите OnPrepareDC для внесения исправлений к контексту устройства основанному на страницу печатается. Например, можно переместить координата просмотра и областью обрезки обеспечить соответствующую часть документа получает напечатанной.

Функцию-член OnPrint выполняет фактическую печать страницы. На статью Как принтер по умолчанию выполняется показано, как платформа вызывает функцию OnDraw с контекстом устройства принтера, чтобы запустить печать. Точнее, платформа вызывает OnPrint со структурой CPrintInfo и контекстом устройства, OnPrint передает контекст на устройства OnDraw. Переопределите OnPrint для выполнения любой отрисовку, которая должна быть создана только во время печати, а не для экранного отображения. Например, чтобы напечатать заголовок или нижние колонтитулы (см. статью Заголовки и нижние колонтитулы дополнительные сведения). Затем вызовите OnDraw из переопределения задачи OnPrint отрисовкой общими, как в экранному дисплею, так и для печати.

Тот факт, что OnDraw выполняет отрисовку как для экранного отображения, так и для печати означает, что приложение режим представления WYSIWYG: «, Который представлен, чтобы получить». Однако предположим, вы не записывает режим представления WYSIWYG приложение. Например, рассмотрим текстовый редактор, который использует полужирный шрифт для кодов элемента управления печати и отображения для отображения полужирный шрифт на экране. В таком случае используется OnDraw строго для экранного отображения. При переопределении OnPrint замените вызов OnDraw с вызовом отдельную функцию рисования. Эта функция рисуется документ отображается на способ его бумагу, используя атрибуты, которые не отображаются на экране.

Страниц принтера и страниц документа

При ссылке на числа страниц, иногда необходимо различать понятием принтера страницы и понятием документа страницы. Со стороны зрения принтера, страница один лист бумаги. Однако один лист бумаги не обязательно соответствует одной страницы документа. Например, если ввести информационный бюллетень, где таблицы должны быть сложенным, один лист бумаги могут содержать обе первой и последней страницы документа, не параллельно. Аналогично, если ввести электронную таблицу, документ не состоит из страниц вообще. Вместо этого один лист бумаги может содержать строки с 1 по 20, столбцы от 6 до 10.

Все числа страниц в структуре CPrintInfo относятся к страницам принтера. Платформа вызывает OnPrepareDC и OnPrint один раз для каждого листа бумаги, который должна пройти через принтера. При переопределении функции OnPreparePrinting для определения длины документ, необходимо использовать страниц принтера. Если однозначное соответствие (то есть одна страница принтера соответствует одной страницы документа), это легко. Если, с другой стороны, страницы документа и страниц принтера непосредственно не совпадают, необходимо перевести между ними. Например, рассмотрим печать электронную таблицу. При переопределении OnPreparePrinting необходимо вычислить, необходимые напечатали всю электронную таблицу и затем используется число листов бумаги это значение при вызове функции-члена SetMaxPageCPrintInfo. Аналогично, при переопределении OnPrepareDC необходимо перевести m_nCurPage в диапазон строк и столбцов, которые отображаются на эту определенную таблицу и затем отрегулируются координату просмотра соответственно.

Разбиение на страницы PRINT-Time

В некоторых случаях класс представления не может заранее знать, как долго документ, пока он фактически не будет напечатан. Например, предположим, что приложение не режим представления WYSIWYG, поэтому длина документа на экране не соответствует его длину напечатан.

В этом случае проблемы при переопределении OnPreparePrinting для класса представления: невозможно передать значение функции SetMaxPage структуры CPrintInfo, так как неизвестно длину документа. Если пользователь не задает число страниц для остановки на использовании диалогового окна печати, платформа не знает при остановки цикла печати. Единственный способ определить время остановки цикла печати напечатать документ и просмотреть время его выполнения. Класс представления должен проверять конца документа во время его печатается, а затем сообщить платформе, когда будет достигнут конец.

Платформа основан на функции OnPrepareDC класса представления, чтобы указать, когда ее остановки. После каждого вызова в OnPrepareDC платформа проверяет член структуры с именем CPrintInfom_bContinuePrinting. Значение по умолчанию TRUE. Если он остается таким образом, платформа цикл продолжает печати. Если оно задано значение ЛОЖЬ, то платформа останавливается. Выполнить разбиение на страницы PRINT- Time, переопределение OnPrepareDC для проверки факта достижения конца документа и набор m_bContinuePrinting значение ЛОЖЬ, если он имеется.

Реализация по умолчанию OnPrepareDC задает m_bContinuePrinting значение ЛОЖЬ, если текущая страница больше 1. Это означает, что если не задана длина документа, платформа принимает документ одной страницы текста. Следствием этого является то, что следует проявлять осторожность при вызове версию базового класса OnPrepareDC. Не высказывать m_bContinuePrinting будет TRUE после вызова версию базового класса.

Дополнительные сведения

См. также

Ссылки

Печать

Класс CView

Класс CDC