TN030: Настройки друку та попереднього перегляду

Ця Примітка описано процес настроювання друку та попереднього перегляду і описує цілей зворотного виклику процедур, що використовуються в CView і зворотного виклику процедур і функцій-членів CPreviewView.

Проблема

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

Ефективне друку

Коли застосунок MFC друкує, використовуючи стандартні методи, Windows направляє всі графічний інтерфейс пристрою (GDI) виводу дзвінки в пам'яті-метафайл. Коли називається EndPage , Windows грає метафайл один раз для кожного фізичного групи, які принтер для друку однієї сторінки. Під час цього рендеринга, GDI часто запитів перервати процедури для визначення, якщо воно має бути продовжено. Зазвичай abort процедура дозволяє повідомлення для обробки, так що користувач може перервати завдання друку, використовуючи діалогове вікно друку.

На жаль, це може сповільнити процес друку. Якщо друк у вашому додатку необхідно бути швидше, ніж може бути досягнуто за допомогою стандартних техніки, ви повинні виконати вручну сегментації.

Друк сегментації

Для того, щоб вручну групи, потрібно повторно впровадити друку петлі така, що OnPrint викликається кілька разів на сторінці (один раз на групи). Друк петлі реалізована в функції OnFilePrint в viewprnt.cpp. У вашому CView-отриманих клас, перевантаження цю функцію, так що записі карти повідомлення для обробки команди друк» закликає друку функції. Копіювати OnFilePrint режим і змінити друку петлі для здійснення діапазонів. Ви, мабуть, хочете передати прямокутник виділення смугами друку функції, так що ви можете оптимізувати малювання на основі розділ сторінки, який друкується.

По-друге, часто необхідно викликати QueryAbort під час малювання групи. В іншому випадку процедура перервати не отримати називається і користувач зможе скасувати завдання друку.

Друк Preview:   Електронний папір з інтерфейсом користувача

Попередній перегляд, по суті, намагається перетворити відображення в емуляції принтера. За промовчанням клієнтської області головне вікно використовується для відображення одного або двох сторінок повністю в межах вікна. Користувач має можливість збільшити область сторінки, щоб побачити її в більш докладно. З додатковою підтримкою користувач може навіть бути дозволено редагувати документи у режимі попереднього перегляду.

Налаштування попереднього перегляду

Ця Примітка тільки угод з один аспект модифікації попереднього перегляду: додавання інтерфейсу користувача в режимі попереднього перегляду. Інші зміни, можливо, але такі зміни є некерованими обговорення.

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

  1. Отримати подання клас з CPreviewView.

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

  3. У разі додавання візуальних аспектів на дисплей, перевизначити OnDraw і виконувати малюнка після телефонної CPreviewView::OnDraw.

OnFilePrintPreview

Це команда обробник для попереднього перегляду. Її реалізація за замовчуванням:

недійсним CView::OnFilePrintPreview()
{
 nbsp;  / / У похідних класів, здійснювати спеціальні вікна обробку тут
    / / Переконайтеся, вікно кадр відчепити закрити, якщо на гачок.

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

Якщо (!.DoPrintPreview (AFX_IDD_PREVIEW_TOOLBAR, цей,
                RU&NTIME_CLASS(CPreviewView), pState))
    {
        / / У похідних класів, зворотний спеціальні вікна обробка
        / / тут для перегляду випадку невдача

TRACE0 ("Помилка: DoPrintPreview помилка");
        AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
        видалити pState;      / / попереднього перегляду не вдалося ініціалізувати, / / видалити держави зараз
    }
}

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-розмір аркушів. На E-розмір (або менше, масштабувати) плоттера, нумерація сторінок буде як простий випадок. Але на лазерному принтері, друк 16 A-розмір сторінок на одному аркуші, що попереднього перегляду "сторінка"?

Як говориться, вступні пунктом, попередній перегляд діє як принтер. Таким чином, користувач буде бачити, що прийде з певного принтера, який вибрано. Це до подання, щоб визначити, які друкуються на кожній сторінці.

Опис сторінки рядок у структурі CPrintInfo надає засоби відображення номера сторінки користувачеві, якщо його можуть бути представлені як один номер на сторінці (як і в "Сторінка 1" або "сторінки 1-2"). Цей параметр використовується за умовчанням реалізації CPreviewView::OnDisplayPageNumber. Якщо потрібно інший дисплей, один може пересилити цю віртуальний функцію для забезпечення, наприклад, «Аркуш1, розділи A, B».

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

Index