Как реализовать масштабирование в CScrollView, нарисованном с помощью GDI - PullRequest
0 голосов
/ 08 января 2012

Я рисую некоторую графику и текст с помощью GDI в моем CScrollView. Мне нужно реализовать функцию масштабирования. Мне нужно только масштабирование out , не нужно увеличивать in больше, чем обычно.

Вот мои лучшие идеи:

  1. Использовать режим отображения MM_ANISOTROPIC с SetWindowExt / SetViewportExt ... Проблема этого подхода заключается в том, что он не масштабирует текст. Есть ли способ заставить MFC также масштабировать текст? Единственное, о чем я могу думать, это установить размер шрифта текста в соответствии с выбранным значением масштаба, но я не уверен, будет ли это хорошо выглядеть в конце концов ...

  2. Отрисовка в память DC и использование StretchBlt для перетаскивания в клиентскую область соответствующего размера (устанавливается с помощью SetScrollSizes ...). Это решит проблему с масштабированием текста.

Также желательно иметь сглаживающий эффект в процессе. Я думаю, что оба метода выше должны сделать это как таковые, но я не знаю, какой из них будет выглядеть лучше. Кроме того, позже мне потребуется реализовать функции печати / предварительного просмотра (используя стандартную реализацию MFC из архитектуры doc / view), поэтому мне нужен метод, совместимый с этим.

Нужен ваш совет, пожалуйста. Какой путь и почему. Может быть, есть и другие варианты? ..

Ответы [ 2 ]

1 голос
/ 08 января 2012

Вы действительно не хотите связываться с режимом отображения, когда используете MFC - сам MFC уже использует его для (по крайней мере) функции предварительного просмотра.

Я бы посмотрел, если SetWorldTransform будет работать для вас.По крайней мере с векторными / TrueType шрифтами, он будет масштабировать текст вместе со всем остальным.Обратите внимание, что прежде чем SetWorldTransform заработает, вам нужно позвонить SetGraphicsMode с GM_ADVANCED.

0 голосов
/ 08 февраля 2012

В итоге я воспользовался вторым методом, предложенным в этом вопросе, но использовал DIB вместо DDB (и StretchDIBits() вместо StretchBlt()), поскольку оказалось, что он вызывает меньше проблем, особенно при использовании больших растровых изображений и при печати.

...