C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: HDC принтера  (Прочитано 1480 раз)
AndrewSem
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 15


HDC принтера
« : 16 Февраль 2012, 16:09:30 »

Всем добрый день. Подскажите, как зная контекст устройства (HDC принтера), получить настройки принтера (структуру DevMode или PRINTER_INFO_2) ? Заранее благодарен.
Записан
AndrewSem
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 15


Re: HDC принтера
« Ответ #1 : 17 Февраль 2012, 11:26:37 »

Переформулирую вопрос. Настраиваю параметры печати и вывожу данные на принтер (через создание контекста).
Код:
HPrinterDC = CreateDC(DriverName, DeviceName, NULL, pdm);
где pdm - структура PDEVMODE, содержащая настройки печати.
У меня проблема с двусторонней печатью. Принтер поддерживает режим "дуплекса" только для бумаги А4. Если я печатаю на другом формате бумаги - дуплекс не срабатывает. Вот как определить, принял ли принтер все настройки? Или как определить какие форматы бумаги в режиме дуплекса поддерживает принтер? При этом не меняя настроек по умолчанию. Будут какие-нибудь мысли?
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: HDC принтера
« Ответ #2 : 22 Февраль 2012, 10:55:29 »

Используй OpenPrinter для получения дескриптора принтера типа LPHANDLE (HANDLE*). Далее юзай GetPrinter с параметром Level = 2 для получения структуры PRINTER_INFO_2, например
Код
DWORD needed(0);
DWORD sz = sizeof(PRINTER_INFO_2);
BYTE* pBuf = new BYTE[sz];
bool bres = GetPrinter(pHandle, 2, pBuf, sz, &needed);
if (!bres && sz needed) bres = GetPrinter(pHandle, 2, pBuf, (sz=needed), &needed);
if(bres) {
  PRINTER_INFO_2* pPrinterInfo = reinterpret_castPRINTER_INFO_2*> (pBuf);
  // ... см. DEVMODE в PRINTER_INFO_2
}
delete[] pBuf;
 

Проверить, какие возможности поддерживает принтер, можно при помощи функции DeviceCapabilities. Например, поддерживает ли дуплекс:
Код
DWORD size = DeviceCapabilities("MyPrinterName", "LPT1", DC_DUPLEX, NULL, pPrinterInfo->pDevMode);
char* buf = new char[size];
DWORD is_duplex = DeviceCapabilities("MyPrinterName", "LPT1", DC_DUPLEX, buf, pPrinterInfo->pDevMode); // pPrinterInfo->pDevMode из предыд. кода
if(is_duplex==1) ShowMessage("Принтер поддерживает дуплекс!");
else ShowMessage("Принтер не поддерживает дуплекс!");
delete[] buf;
 
« Последнее редактирование: 22 Февраль 2012, 11:05:35 от S0mbre » Записан
AndrewSem
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 15


Re: HDC принтера
« Ответ #3 : 27 Февраль 2012, 13:01:30 »

Читать надо внимательнее проблему!
У меня нет проблемы узнать поддерживает ли принтер режим дуплекса через DeviceCapabilities. Проблема в том, что принтер печатает в дуплексе только на А4. На других форматах печатает в обычном режиме. А DeviceCapabilities дает сведения только о том, что принтер поддерживает эту опцию, но не сообщает об ограничениях этой опции.
Ну вот мой случай. Есть МФУ с режимом дуплекса. В инструкции к устройству написано, что дуплекс работает только при формате А4 и Letter. (Вру, в инструкции этого не написано, узнал от службы поддержки).  А я пытаюсь напечатать дуплексом на формате А5, например. Через DeviceCapabilities я определяю, что МФУ поддерживает режим дуплекса, соответственно настраиваю принтер как мне надо - формат бумаги, режим дуплекса и т.д. Но в результате получаю, что все настройки (кроме дуплекса) принялись. Т.е. печать идет со всеми нужными параметрами, кроме дуплекса. Вот собственно и проблема, как узнать какие форматы бумаги поддерживает дуплекс или по контексту устройства получить переданные на принтер настройки.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.114 секунд. Запросов: 20.