Принтеры
Содержание:
1. Контекст отображения для принтера
На первый взгляд, контекст отображения для
принтера получить нетрудно — достаточно вызвать
функцию CreateDC , указав имя драйвера, имя
устройства и имя порта вывода, к которому
подключен принтер:
Созданный при помощи функции CreateDC контекст
устройства следует удалить после использования,
вызвав функцию DeleteDC :
Как мы уже говорили, параметр lpszDriver является
указателем на строку символов, содержащую имя
драйвера, обслуживающего физическое устройство.
Имя драйвера совпадает с именем файла *.drv,
содержащего драйвер. Этот драйвер находится в
системном каталоге Windows.
Имя устройства lpszDevice — это название устройства.
Параметр lpszOutput указывает на структуру данных
типа DEVMODE, используемую при инициализации
устройства вывода. Если при работе с устройством
нужно использовать параметры, установленные при
помощи приложения Control Panel, параметр lpszOutput
следует указать как NULL.
Однако как определить эти параметры?
Текущий принтер описан в файле win.ini в разделе
:
Вы можете получить контекст отображения для
текущего принтера, указав эти параметры функции
CreateDC:
Однако к компьютеру может быть подключено
несколько принтеров. Например, к порту LPT1: может
быть подключен лазерный принтер, а к порту LPT2: —
матричный или струйный принтер.
Список подключенных принтеров, имена драйверов
и портов ввода/вывода можно найти в разделе
файла win.ini:
Ваше приложение может получить параметры
принтера, используемого по умолчанию, а также
параметры всех установленных принтеров
непосредственно из файла win.ini. Это можно легко
сделать при помощи функции GetProfileString:
Параметр lpszSection должен указывать на имя
раздела, в нашем случае на строку «windows».
Через параметр lpszEntry передается адрес текстовой
строки, содержащий имя элемента раздела, в нашем
случае это адрес строки «device».
Если указанного элемента или раздела нет в
файле win.ini, используется строка по умолчанию,
адрес которой передается через параметр lpszDefault.
Найденная строка (или строка по умолчанию)
будет записана в буфер, адрес которого
передается через параметр lpszReturnBuffer. Размер
буфера должен быть указан в параметре cbReturnBuffer.
Для получения контекста отображения текущего
принтера обычно используется такая функция:
Приведенная выше функция способна работать с
двухбайтовыми кодами символов, так как для
сканирования строки используется функция AnsiNext.
Ситуация, однако, усложняется при
необходимости сделать выбор между одним из
установленных принтеров. Хорошо
спроектированное приложение должно позволять
пользователю выбирать любой из установленных
принтеров, а не только тот, который используется
по умолчанию.
В этом случае вам надо создать диалоговую
панель (или меню), с помощью которой пользователь
мог бы выбрать нужный принтер.
Для получения списка установленных принтеров
вы можете воспользоваться все той же функцией
GetProfileString , указав в качестве первого параметра
адрес строки «devices», а в качестве второго —
значение NULL:
В этом случае в буфер будут переписаны все
строки из раздела , каждая строка будет
закрыта двоичным нулем, последняя строка будет
закрыта двумя двоичными нулями.
Однако есть еще одна задача, которую должно
уметь решать ваше приложение.
Как правило, для каждого принтера возможна
настройка таких параметров, как размер и
расположение бумаги, выбор устройства подачи
бумаги, интенсивность печати и разрешающая
способность и так далее. Для выполнения такой
настройки ваше приложение должно вызвать
функцию DeviceMode или более новую ExtDeviceMode ,
расположенную в драйвере нужного принтера.
Заметим, что эти функции экспортируются
драйвером как обычной DLL-библиотекой (драйвер
принтера и есть DLL-библиотека). Для вызова одной
из этих функций вы должны загрузить драйвер
явным образом, вызвав функцию LoadLibrary , а затем
получить адрес точки входа при помощи функции
GetProcAddress . DLL-библиотеки и перечисленные выше
функции мы описали в 13 томе «Библиотеки
системного программиста».
Все это выглядит достаточно сложно и громоздко,
однако стандартное приложение Windows должно
обеспечивать возможность выбора принтера для
печати и возможность установки параметров для
выбранного принтера.
К счастью, DLL-библиотека commdlg.dll содержит функцию
PrintDlg, способную решить все перечисленные выше
задачи и вдобавок получить для выбранного
принтера контекст отображения, который можно
использовать для рисования на принтере (или
печати, если вам так больше нравится).
Работа с принтером
6.1.
6.2.
6.3.
6.4.
Приложения Windows работают с принтером совсем не
так, как программы MS-DOS. Последние используют для
печати BIOS (прерывание INT 17h ) или функцию 05h
прерывания MS-DOS INT 21h . Некоторые программы даже
используют порты ввода/вывода параллельного или
последовательного интерфейса, к которому
подключен принтер. Мы описали все эти средства в
первой части второго тома «Библиотеки
системного программиста» (стр. 156).
Заметим, что создание программы MS-DOS, способной
работать с любым принтером в символьном и
графическом режимах, — далеко не простая задача. В
мире созданы десятки различных моделей
принтеров, каждая из которых имеет свою систему
команд и другие особенности. Практически
приложение должно иметь собственный набор
драйверов для обеспечения возможности работы с
любыми моделями принтеров. Текстовый процессор
Microsoft Word for DOS версий 4.0 — 6.0 может работать со
многими типами принтеров благодаря богатому
набору принтерных драйверов, поставляющихся
вместе с ним. Тем не менее этого набора иногда
оказывается недостаточно.
Ситуация с принтерами в MS-DOS напоминает
ситуацию с видеоконтроллерами — так как MS-DOS не
имеет в своем составе драйверы
видеоконтроллеров, каждая программа MS-DOS должна
иметь собственные драйверы.
Разработчики приложений Windows находятся в
лучшем положении, так как в этой операционной
системе есть сильная поддержка принтеров. Набор
драйверов, поставляемых вместе с Windows,
обеспечивает возможность работы практически с
любой моделью принтера для всех приложений.
Разработчики приложений не должны учитывать
аппаратные особенности моделей принтеров, так
как эта работа выполняется принтерными
драйверами.
Однако поддержка принтеров не ограничивается
учетом аппаратных особенностей и набора команд.
Приложения могут использовать для вывода на
принтер почти все функции GDI, рассмотренные нами
в этом томе. Для этого им достаточно получить
контекст отображения, связанный с принтером.
Передавая идентификатор контекста отображения в
качестве первого параметра функциям GDI,
приложения могут рисовать на бумаге текст,
вызывая функцию TextOut, или любые геометрические
фигуры, вызывая такие функции, как Ellipse, Rectangle и т.
п.
Специальное приложение Print Manager позволяет
организовать очередь печати. Разные приложения
могут помещать в эту очередь свои данные (задания
на печать), которые будут выводиться на принтер в
фоновом режиме в порядке поступления в очередь
(пользователь может изменять расположение
заданий на печать в очереди). Это приложение
описано в документации пользователя
операционной системы Windows. Вы также можете найти
его описание во втором томе нашей серии книг
«Персональный компьютер. Шаг за шагом»,
посвященный Windows.
Вывод на принтер в операционной системе Windows
всегда буферизован, причем под буферизацией
понимается не просто использование буфера
временного хранения данных, предназначенных для
вывода на принтер. Когда приложение вызывает
функции рисования GDI, указывая идентификатор
контекста принтера, соответствующие команды GDI
не выполняются сразу, а накапливаются в
специально созданном метафайле. После того как
приложение завершит рисование одной страницы
документа, созданный метафайл проигрывается в
контексте принтера. Именно в этот момент и
происходит печать.
Далеко не все принтеры способны рисовать сразу
на всем листе бумаги, как на экране
видеомонитора. На это способны только лазерные
принтеры, которые готовят в своей памяти образ
целой страницы и затем печатают эту страницу.
Матричные и струйные принтеры могут печатать
только в построчном режиме, поэтому проигрывание
метафайла на таких принтерах выполняется
несколько раз для каждой строки. Всякий раз при
проигрывании метафайла в контексте принтера
задается область ограничения, соответствующая
одной строке.
Механизм построчной печати скрыт от
приложений. Поэтому они могут рисовать
изображения и писать текст на листе бумаги
аналогично тому, как они делают это в окнах
приложения. Единственное что требуется, это
сообщить GDI о начале печати на новом листе бумаги
и о завершении печати листа бумаги (или рисования
листа бумаги, если угодно), вызвав
соответствующие функции GDI. В дальнейшем мы
рассмотрим этот процесс более подробно.
Основные характеристики лазерных принтеров
· Скорость печатания. Определяется скоростью механического протягивания листа и скоростью обработки данных, поступающих с компьютера. Средняя скорость печати 4-16 страниц за минуту.
· Разрешающая способность. В современных лазерных принтерах достигает 2400 dpi. Стандартным считается значение в 300 dpi.
· Память. Работа лазерного принтера связана с огромными вычислениями. Например, при разрешающей способности 300 dpi, на странице формата А4 будет почти 9 млн. точек, и нужно рассчитать координаты каждой из них. Скорость обработки информации зависит от тактовой частоты процессора и объема оперативной памяти принтера. Объем оперативной памяти черно-белого лазерного принтера составляет не меньше 1 Мбайт, в цветных лазерных принтерах значительно больше.
· Бумага. Используется качественная бумага формата А4. Существуют модели для формата А3. В некоторых лазерных принтерах есть возможность использования рулонной бумаги.
Срок и качество работы лазерного принтера зависит от барабана. Ресурс барабана дешевых моделей — 40-60 тысяч страниц.