Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ch-15.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
676.86 Кб
Скачать

Прерывание печати с помощью процедуры Abort

Что может случиться при непреднамеренном вводе в программу PRINT1 ошибки, ведущей к тому, что вместо одной страницы печатается целая кипа? Что делать, если принтер начал непрерывно прогонять бумагу? Конечно, всегда можно отсоединить разъем. Можно также прервать печать из папки Printers. Для этого надо выбрать опцию Settings из меню Start, выбрать Printers, дважды щелкнуть на значке своего принтера и для прерывания печати выбрать из меню Printers опцию Purge Print Jobs (удалить задания на печать). (К этому времени уже будет испорчено много страниц.)

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

Для отмены задания на печать непосредственно из программы требуется какая-нибудь процедура прерывания. Процедура прерывания — это небольшая экспортируемая функция вашей программы. Адрес этой функции передается в Windows с помощью функции SetAbortProc; затем GDI периодически во время печати вызывает эту процедуру, спрашивая: "Можно ли продолжать печать?".

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

BOOL CALLBACK AbortProc (HDC hdcPrn, int iCode)

{

[другие строки программы]

}

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

SetAbortProc (hdcPrn, AbortProc) ;

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

При обработке вызова функции EndPage (т. е. при проигрывании расширенного метафайла в драйвере устройства и создании временных файлов с выходными данными для принтера) GDI часто вызывает процедуру прерывания. Параметр hdcPrn — это описатель контекста принтера. Параметр iCode устанавливается в 0, если все идет нормально, или в SP_OUTOFDISK, если модуль GDI сталкивается с нехваткой свободного дискового пространства при создании временных файлов с выходными данными для принтера.

Возвращаемым значением процедуры AbortProc должно быть TRUE (ненулевое значение), если задание на печать следует продолжать или FALSE (0), если задание на печать следует прервать. Процедура прерывания может быть достаточно простой:

BOOL CALLBACK AbortProc (HDC hdcPrn, int iCode)

{

MSG msg ;

while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))

{

TranslateMessage (&msg) ;

DispatchMessage (&msg) ;

}

return TRUE ;

}

Эта функция может показаться несколько необычной. То есть, она подозрительно похожа на цикл обработки сообщений. Однако обратите внимание, что в этом цикле обработки сообщений вместо функции GetMessage вызывается функция PeekMessage. О функции PeekMessage было рассказано в главе 4 при рассмотрении программы RANDRECT. Вспомните, что функция PeekMessage возвращает управление программе не только при получении сообщения из очереди сообщений программы (точно также, как и функция GetMessage), но и в том случае, если в очереди сообщений программы нет сообщений.

Цикл обработки сообщений в функции AbortProc вызывает функцию PeekMessage до тех пор, пока возвращаемым значением функции PeekMessage остается TRUE. Величина TRUE означает, что функция PeekMessage извлекла из очереди сообщение, которое может быть передано одной из оконных процедур программы, используя функции TranslateMessage и DispatchMessage. При отсутствии сообщений в очереди сообщений программы, возвращаемым значением функции PeekMessage становится FALSE, поэтому функция AbortProc возвращает управление Windows.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]