Существует ли упрощенный способ включения визуализированного содержимого GDI при печати с использованием WPF? - PullRequest
2 голосов
/ 30 октября 2011

В одном из проектов, над которыми я работаю, есть несколько уже существующих отчетов, которые печатаются с помощью поддержки печати MFC и более или менее выводятся непосредственно на DC принтера через GDI.Мы начали делать несколько новых (не связанных) отчетов через WPF / XAML, так как в любом случае мы переводим новый пользовательский интерфейс в WPF, и с ним гораздо удобнее работать для макета.

Другой ботинок, наконец, упал, иМне нужно добавить некоторые новые функциональные возможности в существующий печатный отчет, и новые функциональные возможности практически не требуются для реализации с WPF.Наши существующие отчеты WPF реализуются через страницы XAML, отправляемые в XpsDocument (в памяти, а не на диске) через XpsDocumentWriter.Я хотел бы иметь возможность продолжать использовать эту стратегию и использовать подход написания отчетов WPF / XAML, в которых некоторые страницы отображаются с помощью GDI.

Моя первая наивная попытка заключалась в том, чтобы встроить HwndHost вUIElement, который отображается в XpsDocumentWriter, но, похоже, не работает.Не удивительно, но попытка того стоила.

Следующим очевидным решением, IMO, будет рендеринг графики GDI в растровом изображении соответствующего размера и масштабирования и рендеринг этого растрового изображения на страницу в XpsDocument.Это бы сработало, но растровые изображения размером с страницу (особенно в памяти) выглядят как рецепт для высокого использования памяти и низкой производительности на медленных компьютерах.

В идеале я хотел бы преобразовать содержимое GDI в метафайлили какой-либо другой векторный формат, который затем может быть переведен в XPS.Но это должен быть автоматический процесс, который работает каждый раз, поскольку это просто функция печати документа.OTOH - это приложение для внутренних пользователей, поэтому мы можем смириться с некоторым снижением производительности

. Разработка WPF не является моей главной задачей, поэтому я бы назвал себя новичком без особых подробностей.знание основных деталей.Я просто хотел убедиться, что не пропустил что-то очевидное, прежде чем вернуться к использованию растрового изображения в качестве среды передачи, хотя я пока не нашел других достойных опций в своем поиске.

Все, что ядолжен смотреть в?

1 Ответ

0 голосов
/ 23 декабря 2011

Один из способов сделать это - создать WriteableBitmap в WPF и перетащить нарисованное изображение GDI непосредственно на него, чтобы оно могло быть отображено в вашем документе XPS. Первым шагом может быть прямой блайнд с вашего GDI DC (получить указатель на GDI DC, указатель на WriteableBitmap и использовать Platform Invoke для вызова memcpy). Дальнейшая работа может включать преобразование чертежа MFC GDI в vanilla WPF (с использованием библиотеки, такой как WriteableBitmapEx, которая имеет методы рисования, подобные gdi).

Хотя первый подход, описанный выше, будет включать два растровых изображения, это лучший способ, который я могу себе представить без огромного переписывания. Второй метод может или не может быть возможным из коробки, так как поддержка рисования WriteableBitmaps не так расширена, как GDI. Последний способ, о котором я только что подумал, - это использовать GDI через Platform Invoke и рисовать прямо на поверхности WriteableBitmap. Это позволит использовать порт без масштабной перезаписи и даст необходимую вам производительность при сохранении привычного кода.

...