Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции-ТРПС.doc
Скачиваний:
13
Добавлен:
15.11.2018
Размер:
810.5 Кб
Скачать

11.3. Диалог отмены печати

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

Напомним, что для создания немодального диалога на родительском окне hWndParent следует воспользоваться функцией CreateDialog():

hDlgBreak = CreateDialog(g_hInst, pTemplate, hWndParent, DlgFunc);

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

BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: // инициализация элементов управления return TRUE; case WM_COMMAND: // только фиксируем нажатие, // но не разрушаем диалог! if (LOWORD(wParam) == IDCANCEL) { g_UserBreak = TRUE; return TRUE; } } return FALSE; }

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

BOOL CALLBACK AbortProc(HDC, short) { MSG Msg; while (PeekMessage(&Msg, 0, 0, 0, PM_REMOVE)) { if (!IsDialogMessage(&Msg)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } } return !g_UserBreak; }

Особенность этой функция состоит в том, что при возврате значения FALSE процесс печати прекращается.

Итак, после создания и отображения немодатьного диалога, приложение должно сделать неактивным родительское окно и подключить функцию прекращения печати к контексту принтера:

EnableWindow(hWndParent, FALSE);

SetAbortProc(PrnDC, (ABORTPROC)AbortProc);

11.4. Запуск процесса печати

Активизация процесса “спуллинга” печати не вызывает затруднений. Приложение должно заполнить поля структуры DOCINFO и обратиться к функции начала печати документа:

DOCINFO din; din.cbSize = sizeof(din); din.lpszDocName = "MyPrnDoc"; int Error = StartDoc(PrnDC, &din); // good if > 0

Этот фрагмент имеет лишь одну особенность, а именно, длина строки поля din.lpszDocName не должна превышать 32 символа.

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

11.5. Печать страницы документа

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

Изменить режим отображения для любого контекста устройства с дескриптором hdc можно с помощью вызова функции:

SetMapMode(hdc, nMapMode);

Переменная целого типа nMapMode указывает новый режим:

Режим отображения

Направление оси Y

Логическая единица

MM_TEXT

вниз

пиксель

MM_LOMETRIC

вверх

0.1 мм

MM_HIMETRIC

вверх

0.01 мм

MM_LOENGLISH

вверх

0.01 дюйма

MM_HIENGLISH

вверх

0.001 дюйма

MM_TWIPS

вверх

1/1440 дюйма

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

- сообщает Windows о начале печати страницы;

- отрисовывает каждую страницу, используя GDI функции;

- сообщает Windows об окончании печати страницы.

Примерный код этого этапа может выглядеть так:

do { StartPage(PrnDC); // отрисовка страницы Error = EndPage(PrnDC); // счетчик страниц } while (Error > 0 && !g_UserBreak);

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