Порекомендуйте мне решение для создания предварительного просмотра и печати
ВВЕДЕНИЕ И СООТВЕТСТВУЮЩАЯ ИНФОРМАЦИЯ:
Я поддерживаю старое приложение, и мне нужно реализовать функцию, которая генерирует отчеты на основе данных, рассчитанных из базы данных. Пользователь также должен иметь дополнительную опцию печати файла (пользователь должен иметь возможность выбирать принтер и видеть предварительный просмотр).
Чтобы повысить мои шансы на получение удовлетворительного ответа, позвольте мне дополнительно уточнить вопросы с помощью небольшого "примера":
Пользователь нажимает кнопку -> приложение рассчитывает данные; // Готово
Приложение создает файл и заполняет его результатом; // Готово
Пользователь получает информацию о создании отчета; // Готово
Пользователь нажимает другую кнопку, которая взимается за печать; // Застрял здесь!
Появится окно предварительного просмотра и возможность запуска диалогового окна печати. // Застрял здесь
Пользователь запускает диалоговое окно печати, выбирает принтер и приложение печатает файл;
Приложение закодировано в C++
используя сырье WinAPI
(нет MFC
). Я работаю на Windows XP.
ПРОБЛЕМА:
Мне удалось успешно использовать OLE Automation для генерации / сохранения отчетов Word и Excel, но я не могу создать предварительный просмотр, который точно соответствует предварительному просмотру, который создаст Word.
Если я использую OLE Automation для отображения диалогового окна печати Excel / предварительного просмотра, может возникнуть следующая проблема:
Пользователь может просто нажать "Закрыть предварительный просмотр" или просто закрыть страницу свойств печати (см. Рисунок ниже) и вернуться к документу, который может поставить под угрозу данные документа.
Моим работодателям это не нравится (у них нет опыта разработки программного обеспечения / разработки, поэтому, что бы я ни говорил, это будет "эхом на ветру"...), и они хотят, чтобы мой предварительный просмотр соответствовал предварительному просмотру. Слово порождает.
Поэтому мне нужно решение для создания предварительного просмотра печати для пользователя таким образом, чтобы он точно соответствовал предварительному просмотру печати, который создаст Word. Кроме того, пользователь должен иметь возможность только видеть, как это выглядит, но не иметь возможности открывать файл из моего приложения. Пользователь должен иметь возможность выбрать принтер, который будет печатать файл.
Реализация, подобная той, что на картинке, будет в порядке.
ВОПРОС:
ВСТУПИТЕЛЬНЫЕ ЗАМЕЧАНИЯ:
Вопрос слишком широкий, чтобы на него можно было ответить в одном посте, поэтому я должен ограничиться только поиском совета / общей концепции / указанием в правильном направлении.
АКТУАЛЬНЫЕ ВОПРОСЫ:
Я сделал все, что мог, с файлами OLE Automation и Excel / Word, но, как вы можете видеть, есть проблемы с генерацией предварительного просмотра, поэтому возникли следующие вопросы:
Поскольку я впервые решаю эту задачу, можете ли вы порекомендовать мне правильный способ ее решения (конечно, общие понятия)?
Есть ли вероятность, что для решения проблемы печати есть обходной путь (например, отправка
WM_PRINTCLIENT
сообщение в Word / Excel или что-то подобное)?
ЗАМЕЧАНИЯ:
Опять же, я понимаю, что вопрос слишком широкий, поэтому просто дайте мне общие понятия / указатели, чтобы я мог публиковать отдельные вопросы, если я застряну где-нибудь на пути.
Мне не нужно использовать Word / Excel и OLE Automation, это был мой выбор на данный момент.
Если вы можете порекомендовать лучшее решение, я с удовольствием приму. Я не хочу использовать библиотеки.
Если потребуется дополнительная информация, спросите, и я отредактирую свой пост.
1 ответ
Вам нужно будет вызвать диалоговое окно, когда пользователь нажимает кнопку печати, диалоговое окно будет содержать элемент управления, который показывает предварительный просмотр для принтера по умолчанию и три кнопки для выбора другого принтера, печати и выхода.
Элемент предварительного просмотра может быть статическим элементом управления, где WM_PAINT
Обработчик будет рисовать предварительный просмотр (альтернативы: элемент управления веб-браузера, в который подается html-текст, или элемент управления RichText, который подается в виде текста RTF, но тогда вы ограничены функциональностью этих элементов управления).
Цитата: Предварительный просмотр печати не такой уж особенный Это просто означает, что вы должны визуализировать на экран (или растровое изображение) то, что в противном случае вы могли бы визуализировать на DC принтера. Это в первую очередь означает использование размера страницы и предоставление элемента управления UI для предыдущей / следующей страницы.
Этот SO-ответ подробно описывает работу, которую вам нужно сделать, чтобы нарисовать предварительный просмотр.
В этой статье CodeProject есть простой код для предварительного просмотра; это простой MFC, который не должен быть слишком сложным для перевода на простой C++/WinAPI.