Проверить, печатает ли текущий принтер в цветеDelphi , ОС и Железо , Принтеры и ПечатьПроверить, печатает ли текущий принтер в цвете
Автор: Slava Vitebski
Недавно мне нужно было найти надёжный способ определить печатает ли принтер цветом или нет. Пример который приведен выше не подходит так как он использует API - DocumentProperties а эта функция возвращает положительный результат для чёрно-белых принтеров способных печатать оттенки серого цвета (пример такого принтера - HP LasetJet 1200). Быстры поиск привёл меня к функции - DeviceCapabilities (в Delphi она определена в WinSpool). Функция имеет следующий формат: DWORD DeviceCapabilities( LPCTSTR pDevice, // printer name LPCTSTR pPort, // port name WORD fwCapability, // device capability LPTSTR pOutput, // output buffer CONST DEVMODE *pDevMode // device data buffer ); параметр fwCapability получает константу которая говорит о том что мы хотим узнать о принтере. В данном случае нас интересует DC_COLORDEVICE. MSDN пишет следующее о б этом параметре: Windows 2000/XP: If the printer supports color printing, the return value is 1; otherwise, the return value is zero. The pOutput parameter is not used. Не всё так просто. значение константы DC_COLORDEVICE определенно не верно!!! Заглянем в Windows.pas файл (это часть определений): DC_COLLATE = 22; {$EXTERNALSYM DC_MANUFACTURER} DC_MANUFACTURER = 23; {$EXTERNALSYM DC_MODEL} DC_MODEL = 24; {$EXTERNALSYM DC_COLORDEVICE} DC_COLORDEVICE = 23; {$EXTERNALSYM DC_NUP} DC_NUP = 24; {$EXTERNALSYM DC_PERSONALITY} DC_PERSONALITY = 25; Обратите внимание на выделенные строчки, у них одинаковые значения. Похожая ситуация наблюдается во всех версиях Delphi и в Visual C++ 6. Только в Visual C++ 7 (Visual Studio .NET) Microsoft решили исправить ситуацию и дали нам правильные кода. Ну а вот собственно и сама функция: uses Printers, WinSpool; const {Those constants definition is WRONG !!! in Delphi and "VC 6". Only in "VC 7" those definitions are corrected.} DC_PERSONALITY = 25; DC_PRINTRATE = 26; DC_PRINTRATEUNIT = 27; DC_PRINTERMEM = 28; DC_MEDIAREADY = 29; DC_STAPLE = 30; DC_PRINTRATEPPM = 31; DC_COLORDEVICE = 32; DC_NUP = 33; DC_MEDIATYPENAMES = 34; DC_MEDIATYPES = 35; function IsPrinterSupportColor(APtinterName: string): boolean; var fRes: Integer; pPrinterInfo: ^PRINTER_INFO_2; Needed: cardinal; phPrinter: cardinal; begin OpenPrinter(PChar(APtinterName), phPrinter, nil); GetPrinter(phPrinter, 2, nil, 0, @Needed); GetMem(pPrinterInfo, Needed); try GetPrinter(phPrinter, 2, pPrinterInfo, Needed, @Needed); fRes := WinSpool.DeviceCapabilities(pPrinterInfo^.pPrinterName, pPrinterInfo^.pPortName, DC_COLORDEVICE, nil, nil); if fRes = -1 then raise Exception.Create(SysErrorMessage(GetLastError)); Result := fRes = 1; finally FreeMem(pPrinterInfo, Needed); end; end; Статья Проверить, печатает ли текущий принтер в цвете раздела ОС и Железо Принтеры и Печать может быть полезна для разработчиков на Delphi и FreePascal. Комментарии и вопросыМатериалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Принтеры и Печать ::
|
|||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |