TN030. Настройка печати и предварительного просмотра

Примечание.

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

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

Проблема

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

Эффективная печать

При печати приложения MFC с помощью стандартных методов Windows направляет все вызовы выходных вызовов интерфейса графического устройства (GDI) в метафайл в памяти. При EndPage вызове Windows воспроизводит метафайл один раз для каждого физического диапазона, который принтер должен распечатать одну страницу. Во время отрисовки GDI часто запрашивает процедуру прерывания, чтобы определить, следует ли продолжить. Обычно процедура прерывания позволяет обрабатывать сообщения таким образом, чтобы пользователь мог прервать задание печати с помощью диалогового окна печати.

К сожалению, это может замедлить процесс печати. Если печать в приложении должна быть быстрее, чем можно достичь с помощью стандартного метода, необходимо реализовать ручное чередование.

Чтобы вручную выполнить цикл печати, необходимо повторно реализовать цикл печати, который OnPrint вызывается несколько раз на страницу (один раз на каждую полосу). Цикл печати реализуется в OnFilePrint функции в viewprnt.cpp. CViewВ производном классе вы перегрузите эту функцию, чтобы запись карты сообщений для обработки команды печати вызывает функцию печати. Скопируйте подпрограмму и измените OnFilePrint цикл печати, чтобы реализовать перевязку. Возможно, вы также захотите передать прямоугольник с полосами в функции печати, чтобы оптимизировать рисование на основе раздела печатной страницы.

Во-вторых, при рисовании полосы необходимо часто вызывать QueryAbort . В противном случае процедура прерывания не вызовется, и пользователь не сможет отменить задание печати.

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

Настройка предварительной версии печати

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

Добавление пользовательского интерфейса в режим предварительной версии

  1. Производный класс представления от CPreviewView.

  2. Добавьте обработчики команд для нужных аспектов пользовательского интерфейса.

  3. Если вы добавляете визуальные аспекты в дисплей, переопределите OnDraw и выполните рисование после вызова CPreviewView::OnDraw.

OnFilePrintPreview

Это обработчик команд для предварительного просмотра печати. Его реализация по умолчанию:

void CView::OnFilePrintPreview()
{
    // In derived classes, implement special window handling here
    // Be sure to Unhook Frame Window close if hooked.

    // must not create this on the frame. Must outlive this function
    CPrintPreviewState* pState = new CPrintPreviewState;

    if (!DoPrintPreview(AFX_IDD_PREVIEW_TOOLBAR, this,
        RUNTIME_CLASS(CPreviewView), pState))
    {
        // In derived classes, reverse special window handling
        // here for Preview failure case

        TRACE0("Error: DoPrintPreview failed");
        AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
        delete pState;  // preview failed to initialize, delete State now
    }
}

DoPrintPreview скрыта основная область приложения. Панели управления, такие как строка состояния, можно сохранить, указав их в элементе pState-dwStates> (это битовая маска и биты для отдельных полос управления определяются AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR)). Окно pState-nIDMainPane> — это окно, которое будет автоматически скрыто и переопределено. DoPrintPreview затем создадит панель кнопок для стандартного пользовательского интерфейса предварительной версии. Если требуется специальная обработка окон, например скрытие или отображение других окон, это необходимо сделать перед DoPrintPreview вызовом.

По умолчанию, когда предварительный просмотр печати завершается, он возвращает панели управления в исходные состояния и основную панель, чтобы увидеть. Если требуется специальная обработка, она должна выполняться в переопределении EndPrintPreview. В случае DoPrintPreview сбоя также предоставьте специальную обработку.

DoPrintPreview вызывается с помощью:

  • Идентификатор ресурса шаблона диалогового окна для панели инструментов предварительного просмотра.

  • Указатель на представление, чтобы выполнить печать для предварительного просмотра печати.

  • Класс времени выполнения класса Preview View. Это будет динамически создано в DoPrintPreview.

  • Указатель CPrintPreviewState. Обратите внимание, что структура CPrintPreviewState (или производная структура, если приложению требуется более сохраненное состояние) не должна быть создана на кадре. DoPrintPreview является бессерверным, и эта структура должна выжить до вызова EndPrintPreview.

    Примечание.

    Если для поддержки печати требуется отдельный класс представления или представления, в качестве второго параметра необходимо передать указатель на этот объект.

EndPrintPreview

Это вызывается для завершения режима предварительного просмотра печати. Часто желательно перейти на страницу в документе, который последний раз отображался в предварительном просмотре печати. EndPrintPreview — это шанс приложения сделать это. Элемент pInfo-m_nCurPage> — это страница, которая была отображена в последний раз (слева, если отображались две страницы), а указатель — указание на то, где на странице был заинтересован пользователь. Так как структура представления приложения неизвестна для платформы, необходимо указать код, чтобы перейти к выбранной точке.

Перед вызовом CView::EndPrintPreviewнеобходимо выполнить большинство действий. Этот вызов изменяет эффекты DoPrintPreview и удаляет pView, pDC и pInfo.

// Any further cleanup should be done here.
CView::EndPrintPreview(pDC, pInfo, point, pView);

CWinApp::OnFilePrintSetup

Это необходимо сопоставить с элементом меню "Настройка печати". В большинстве случаев не требуется переопределить реализацию.

Nomenclature страницы

Другая проблема заключается в том, что нумеровка страниц и порядок. Для простых приложений типов word processor это простая проблема. Большинство систем предварительного просмотра печати предполагают, что каждая напечатанная страница соответствует одной странице в документе.

При попытке предоставить обобщенное решение можно рассмотреть несколько аспектов. Представьте систему CAD. У пользователя есть рисунок, охватывающий несколько листов размера E. На диаграмме размера E (или меньшего размера), нумерующая страница будет как в простом случае. Но на лазерном принтере печать 16 страниц размера A на лист, что делает предварительный просмотр печати, учитывая "страницу"

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

Строка описания страницы в CPrintInfo структуре предоставляет средства отображения номера страницы пользователю, если оно может быть представлено как одно число на страницу (как в разделе "Страница 1" или "Страницы 1-2"). Эта строка используется реализацией CPreviewView::OnDisplayPageNumberпо умолчанию. Если требуется другой дисплей, можно переопределить эту виртуальную функцию, например "Лист1, Разделы A, B".

См. также

Технические примечания по номеру
Технические примечания по категории