Вывод графической информации на принтер




 

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

typedef struct tagPD{ DWORD lStructSize; HWND hwndOwner; HGLOBAL hDevMode; HGLOBAL hDevNames; HDC hDC; DWORD Flags; UINT nFromPage; UINT nToPage; UINT nMinPage; UINT nMaxPage; UINT nCopies; HINSTANCE hInstance; LPARAM lCustData; UINT (CALLBACK* lpfnPrintHook)(HWND, UINT,WPARAM,LPARAM); UINT (CALLBACK* lpfnSetupHook)(HWND, UINT,WPARAM,LPARAM); LPCSTR lpPrintTemplateName; LPCSTR lpSetupTemplateName; HGLOBAL hPrintTemplate; HGLOBAL hSetupTemplate;} PRINTDLG;typedef PRINTDLG FAR* LPPRINTDLG;

Рассмотрим назначение некоторых полей этой структуры.

LStructSize – размер структуры PRINTDLG в байтах. Это поле НЕОБХОДИМО заполнить перед вызовом функции PrintDlg(), иначе окно даже не появится.

HwndOwner – идентификатор родительского окна. Если в поле Flags не указано значение PD_SHOWHELP, в поле hwndOwner можно указать NULL.

HDevNames – идентификатор глобального блока памяти, содержащего структуру типа DEVNAMES, содержащей три текстовые строки. Первая строка определяет имя драйвера принтера, вторая – имя принтера, и третья – имя порта вывода, к которому подключен принтер.

Если содержимое этого поля указать как NULL, после возвращения из функции PrintDlg поле будет содержать идентификатор глобального блока памяти, заказанного функцией для структуры DEVNAMES. В структуре будут находиться строки, соответствующие выбранному принтеру.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-13 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: