Мне нужен хороший способ программно установить параметр «Страниц на листе» при печати.
Я знаю, что пользователь может выбрать эту опцию через диалоговое окно настроек принтера, и я мог бы сделать такой диалог, если яхотеть.Но в контексте программы, над которой я работаю, мне нужно, чтобы это выбиралось самим программным обеспечением, не требуя, чтобы пользователь копался в настройках принтера.
В то время, как оно появляется, я могу спросить Windows, если принтерподдерживает это с помощью элемента dmNup
структуры DEVMODE
, и, похоже, нет никакого официального способа фактически установить его для текущего задания на печать.
Очевидно, что одним из решений было бы изменитьАлгоритм печати в моем программном обеспечении, чтобы он правильно размещал страницы в контексте устройства, чтобы получить несколько страниц на листе в результате.Однако я не видел ни одного простого способа сделать это, не требующего значительных изменений во всем коде, который рисует в контексте устройства принтера.По разным причинам я бы предпочел избежать массовых изменений кода.
Другое решение - установить несколько копий принтера в Windows, одновременно направляя их все на один и тот же порт принтера.Для каждой копии принтера заданы разные страницы по умолчанию на листе.Затем программное обеспечение может выбрать соответствующий принтер, и конечный результат будет таким, как если бы он программно выбрал необходимые страницы для каждого листа.Тем не менее, я столкнулся с различными проблемами с этой схемой, и поэтому я ищу альтернативу, которая была бы меньше бремени поддержки.
Эта статья предлагает другое возможное решение: манипулирование соответствующимбайт в данных частного драйвера, который следует официальной структуре DEVMODE.Проблема в том, что нет никакой гарантии, что какой-либо конкретный драйвер принтера фактически использует один и тот же байт, и мне нужно поддерживать практически любой принтер, который может быть разумно использован в офисной среде.Казалось бы, моему программному обеспечению понадобилась бы конфигурация, в которой я мог бы указать различные смещения байтов для драйверов, которые не используют значение по умолчанию.Это может быть редким явлением или частой головной болью, в зависимости от того, сколько драйверов принтеров решили использовать разные байты для этой настройки.
Итак, вот мои вопросы:
- Есть ли у кого-нибудь какие-либореальный опыт использования последней техники манипуляции с данными частного драйвера?Насколько хорошо он работает при работе с различными принтерами разных производителей?
- Есть ли какие-то другие методы, которые я упустил из виду?
- Если ничего другого, то есть какие-то простые способы получения кодакоторый рисует текст, линии, графику и т. д. в контексте устройства принтера и каким-то образом заставляет его масштабировать, перемещать и, возможно, вращать (по 2 страницы на листе) вывод в нужное место в контексте устройства без записи всего кода (и без потери линий шириной в 1 пиксель)?
Примечание. Для чего стоит программа, над которой я работаю, использует C ++ и MFC.Однако все это должно в равной степени применяться к любой программе, которая имеет дело с контекстами устройства и остальной частью самого Windows API.