Как программно печатать без запроса имени файла в MF C и CView с помощью принтера Print-To-PDF? - PullRequest
2 голосов
/ 30 мая 2020

У меня есть большая графическая программа, использующая C ++, MF C и C ++ 6.0. Мне нужно, чтобы он печатал в PDF-файлы, не запрашивая у пользователя настройки принтера и имя файла.

Я использую CView::OnPrint() для печати с использованием Microsoft Print-to-PDF, и он отлично работает, за исключением запросов пользователя.

Я видел, как обойти эти запросы с помощью объекта PrintDocument в C#, но как я могу это сделать при использовании CView::OnPrint() в MF C? Конечно, должен быть способ?

Мой проект слишком велик, чтобы его можно было переписать в C#, и я попытался перейти к Visual Studio 2005/2010/2019 и c. безуспешно, так как изменения в упаковке структуры данных по умолчанию и преобразование существующих файлов данных чреваты проблемами, поэтому решение должно быть дополнением к существующему MF C C ++ 6.0, если это вообще возможно.

Кто-нибудь может помочь?

1 Ответ

3 голосов
/ 30 мая 2020

Я давно не использовал VC ++ 6, поэтому я исхожу из довольно далеких воспоминаний, но общая идея довольно проста.

Полный подход

Ваше мнение имеет функцию-член DoPreparePrinting. По умолчанию это создает объект CPrintDialog, затем вызывает CPrintDialog s DoModal для отображения диалогового окна настроек печати. В конце концов (но не в DoPreparePrinting, если память не изменяет) вызов CPrinterDialog s CreatePrinterDC (очевидно, достаточно) создает D C для принтера, используя настройки, введенные пользователем в диалоговом окне.

Чтобы обойти диалог, вы можете переопределить DoPreparePrinting. Это получает указатель на CPrintDialog. Поскольку вы не хотите показывать диалоговое окно печати, очевидно, что не будет вызывать его член DoModal. Вместо этого вы заполните его структуры DEVMODE и DEVNAMES для принтера и любых настроек, которые захотите. Затем, когда вызывается CreatePrinterDC, он будет использовать то, что вы заполнили, без отображения диалогового окна.

Мой личный совет - выполнить запуск, используя диалоговое окно под отладчиком, а затем после CPrintDialog ' s DoModal вернулся, просмотрите возвращенную структуру DEVNAMES. Возможно, она вам не понадобится, но я обнаружил, что структура DEVNAMES немного сбивает с толку, когда мне в первый раз пришлось настраивать ее самостоятельно. DEVMODE больше и, возможно, сложнее, но я обычно просто модифицировал несколько частей и оставил большую часть со значениями по умолчанию.

Упрощенный подход

Если вы просто Если вы хотите использовать системные настройки печати по умолчанию, есть более простой подход: вы можете переопределить OnPreparePrinting. Он получает параметр pInfo, который является указателем на CPrintInfo. У него есть член m_bDirect, который вы можете установить на true, чтобы выполнять «прямую» печать, при которой просто используются настройки по умолчанию без использования диалогового окна принтера. Я точно не помню, когда был добавлен m_bDirect. Если он отсутствует, есть «трюк» для получения того же эффекта: реализация по умолчанию DoPreparePrinting не отображает диалоговое окно печати для предварительного просмотра печати, поэтому вы переопределяете OnPreparePrinting, чтобы установить m_bPreview в значение true, вызывать DoPreparePrinting, затем установите m_bPreview обратно на false.

...