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

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

Проблема

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

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

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

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

Печать диапазонов

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

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

Печатать предварительный просмотр:   Электронная бумага с пользовательским интерфейсом

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

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

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

Короче говоря является процесс добавления пользовательского Интерфейса в режиме предварительного просмотра:

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

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

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

OnFilePrintPreview

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

void CView::OnFilePrintPreview()
{
 nbsp;  / / В производных классах, осуществить специальные окна обработки здесь
    / / Не забудьте отцепить окно закрыть если зацепили.

/ / не должны создавать это на раме. Необходимо пережить эту функцию
    CPrintPreviewState * pState = новый CPrintPreviewState;

Если (!.DoPrintPreview (AFX_IDD_PREVIEW_TOOLBAR, это,
                RU&NTIME_CLASS(CPreviewView), pState))
    {
        / / В производных классах, отменить специальное окно обработки
        / / здесь для предварительного просмотра отсутствие дело

TRACE0 ("ошибка: не удалось DoPrintPreview");
        AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
        удалить pState;      / / предварительного просмотра не удалось инициализировать, / / delete государства сейчас
    }
}

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

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

DoPrintPreview вызывается с:

EndPrintPreview

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

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

/ / Любой дальнейшей очистки должно быть сделано здесь.
CView::EndPrintPreview (pDC, pInfo, точка, pView)

CWinApp::OnFilePrintSetup

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

Номенклатура страницы

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

В попытке обеспечить общее решение, есть несколько вещей для рассмотрения. Представьте себе CAD-системы. Пользователь имеет рисунок, который охватывает несколько Е-размер листов. На E-размер (или меньше, масштабирование) плоттер, нумерация страниц будет как в самом простом случае. Но на лазерном принтере, печать 16 A-размер страниц на одном листе, то, что предварительного просмотра полагает «страницы»?

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

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

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

Index