При выводе на принтер отличий немного, но они есть. Связаны они, прежде всего, с тем, что при печати графический вывод осуществляется постранично. Дело в том, что при вызове функций рисования для контекста принтера эти команды GDI выполняются не сразу, а
накапливаются в специальном метафайле. И только после того, как приложение завершит рисование одной страницы документа, созданный метафайл «проигрывается» в контексте принтера. Печать происходит именно в этот момент. Следовательно, требуется сообщить
о начале и завершении процесса печати листа. Функции для работы с принтером немного:
1. StartDoc — формирует задание на печать нового документа;
2. StartPage — подготавливает контекст устройства вывода для печати новой страницы — готовит метафайл, необходимо вызвать эту функцию перед выводом в контекст устройства;
3. EndPage — завершает программный процесс печати одной страницы — формирование метафайла, после чего он выводится непосредственно на принтер;
4. EndDoc — завершает процесс печати документа;
5. AbortDoc — служит для принудительного завершения процесса печати;
6. SetAbortProc — используется для обеспечения возможности фоновой печати и принудительного завершения процесса печати;
7. ResetDC — позволяет настроить индивидуальные параметры печати отдельных листов документа.
На первый взгляд, контекст отображения для принтера получить нетрудно – достаточно вызвать функцию CreateDC, указав имя драйвера, имя устройства и имя порта вывода, к которому подключен принтер:
HDC WINAPI CreateDC(LPCSTR lpszDriver, // имя драйвера LPCSTR lpszDevice, // имя устройства LPCSTR lpszOutput, // имя файла или порта вывода const void FAR* lpvInitData); // данные для инициализацииСозданный при помощи функции CreateDC контекст устройства следует удалить после использования, вызвав функцию DeleteDC:
|
Параметр lpszDriver является указателем на строку символов, содержащую имя драйвера, обслуживающего физическое устройство. Имя драйвера совпадает с именем файла *.drv, содержащего драйвер. Этот драйвер находится в системном каталоге Windows.
Имя устройства lpszDevice – это название устройства.
Параметр lpszOutput указывает на структуру данных типа DEVMODE, используемую при инициализации устройства вывода. Если при работе с устройством нужно использовать параметры, установленные при помощи приложения Control Panel, параметр lpszOutput следует указать как NULL.
Данные о текущем принтере и всех установленных можно считать из системных ini файлов (windows/win.ini) функцией GetProfileString().
Другим способом получения контекста принтера является использование стандартного диалогового окна печати.
С помощью функции PrintDlg() приложение может вывести на экран диалоговое окно, представленное на рисунке 2.2.1, с помощью которого пользователь может напечатать документ, выбрать нужный принтер или изменить его параметры.
Прототип функции, описанный в файле commdlg.h (обычно включается в файле windows.h), следующий:
BOOL PrintDlg(PRINTDLG FAR* lppd);
При успешном завершении функция возвращает значение TRUE. В случае ошибки, отмены печати или отмены выбора принтера (если функция PrintDlg используется только для выбора принтера) функция возвращает значение FALSE.
В качестве параметра функции PrintDlg необходимо передать адрес предварительно подготовленной структуры типа PRINTDLG, описанной в файле commdlg.h:
|
Рассмотрим назначение некоторых полей этой структуры.
LStructSize – размер структуры PRINTDLG в байтах. Это поле НЕОБХОДИМО заполнить перед вызовом функции PrintDlg(), иначе окно даже не появится.
HwndOwner – идентификатор родительского окна. Если в поле Flags не указано значение PD_SHOWHELP, в поле hwndOwner можно указать NULL.
HDevNames – идентификатор глобального блока памяти, содержащего структуру типа DEVNAMES, содержащей три текстовые строки. Первая строка определяет имя драйвера принтера, вторая – имя принтера, и третья – имя порта вывода, к которому подключен принтер.
Если содержимое этого поля указать как NULL, после возвращения из функции PrintDlg поле будет содержать идентификатор глобального блока памяти, заказанного функцией для структуры DEVNAMES. В структуре будут находиться строки, соответствующие выбранному принтеру.