При выводе на принтер отличий немного, но они есть. Связаны они, прежде всего, с тем, что при печати графический вывод осуществляется постранично. Дело в том, что при вызове функций рисования для контекста принтера эти команды 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:
BOOL WINAPI DeleteDC(HDC hdc);
Параметр 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: