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


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

ПримечаниеПримечание

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

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

Проблема

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

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

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

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

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

Вручную полоса, необходимо реализовать re цикл печати те, что OnPrint вызывается несколько раз на странице (один раз на полосу).Цикл печати реализован в функции OnFilePrint в viewprnt.cpp.В CView- производный класс, перегружаете эта функция, что запись сопоставления сообщений для обработки команду print вызывает функция печати.Скопируйте процедура цикла печати и измените 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 скрывает " главная панель " приложения.Панель элементов управления, как строка состояния, могут быть сохранены, указав их в элементе dwStates pState-> (это битовая маска и биты для отдельных панелей элементов управления определены AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR)).pState->nIDMainPane окна окно, которое будет автоматически скрыть, и reshown.DoPrintPreview затем создает черта кнопки стандартного пользовательского интерфейса предварительного просмотра.Если особенно обработка окна, например скрыть или отобразить другие окна, что быть сделаны до DoPrintPreview вызывается.

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

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

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

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

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

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

    ПримечаниеПримечание

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

EndPrintPreview

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

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

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

CWinApp::OnFilePrintSetup

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

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

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

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

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

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

См. также

Другие ресурсы

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

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