Реализация элементов управления масштабированием в MFC

Я работаю над средством «предварительного просмотра перед печатью», чтобы показать обзор слайда с прямоугольными массивами образцовых точек на нем.

Предметные стекла обычно имеют размеры 25 x 75 мм, а точечные образцы обычно имеют диаметр 0,1 мм. Обычно по периметру слайда имеется зазор в 2 мм, где не пропечатываются пятна.

Расстояние между пятнами (шагами) с точностью до 0,01 мм. Шаги 0,20 и 0,29 мм, например, необходимо различать в пикселях. Представляя сами пятна, 100% точность, вероятно, не имеет решающего значения на данном этапе, пока пятна видны и не перекрываются.

Я был бы признателен за совет о том, какие методы использовать для создания растрового представления слайда/пятен и для просмотра макета слайда с использованием произвольных уровней увеличения.

Это не должно быть сложным — представление 1:1 плюс увеличение меньшего и большего размера для начала. Я, вероятно, не могу слишком сильно уменьшить масштаб, так как пятна станут слишком маленькими, чтобы их можно было представить.

Для больших увеличений мне, вероятно, потребуется знать о реализации элементов управления горизонтальной/вертикальной прокруткой, но я займусь этим позже.

Я хотел бы узнать о любых методах программирования и масштабирования, о которых мне следует знать, чтобы правильно реализовать средство масштабирования. Недавно я играл с функцией StretchBlt для изменения размеров изображения, и все в порядке, однако любая другая соответствующая информация была бы полезна.

Ваше здоровье.


person AndyUK    schedule 23.04.2009    source источник


Ответы (1)


Начнем с самого начала:

  • почему вы не используете ::AFXPrintPreview() и остальные средства предварительного просмотра печати MFC?

  • Я думаю, что «слайды» и «ролики» специфичны для вашей отрасли — они имеют отношение к вопросу или просто для иллюстрации?

  • StretchBlt() не принесет вам много пользы, потому что он позволит вам выполнять «масштабирование» только на уровне пикселей, вам нужно нарисовать определенную часть вашего элемента управления с более высоким уровнем точности. Даже если вы не собираетесь использовать материал предварительного просмотра печати MFC, взгляните на него, чтобы увидеть, как это можно сделать.

  • Элементы управления Windows обладают всеми функциями, необходимыми для прокрутки и масштабирования. Они находятся в контексте устройства: SetWindowExt(), SetViewportExt(), SetViewportOrg() и т. д. Посмотрите в разделе «Функции координации» на странице «Члены CDC» в MSDN. При этом я однажды реализовал масштабирование и прокрутку «вручную», отслеживая положение полосы прокрутки, команды масштабирования моего элемента управления и т. д. Это была боль в заднице, и, оглядываясь назад, я должен был использовать средства Windows. Однако их тоже нелегко использовать, поэтому я думал, что смогу сделать это лучше сам - оказывается, я ошибался :)

  • Наконец, хотя я не могу точно сказать из вашего вопроса, действительно ли вы в этой лодке, не думайте о физических расстояниях (миллиметры и т. д.). Первое, что нужно сделать правильно, — это нарисовать фигуру на экране с правильными пропорциями между элементами. Затем вы хотите увеличить/уменьшить масштаб. Наконец, только когда вы доберетесь до печатной части, в игру вступят физические параметры. Единственное, что вам нужно выяснить там (немного упрощая здесь), это «какой правильный коэффициент масштабирования мне нужен, чтобы получить требуемый результат». Это немного сложно, но имеет очень мало общего с тем, что кажется первой частью вашего вопроса (как нарисовать ваш компонент на экране).

Если у вас возникли проблемы, не стесняйтесь задавать более конкретные вопросы. У меня есть предварительный просмотр печати и код печати здесь в качестве примера «общих» частей процесса печати, хотя особенности, очевидно, различаются для каждого приложения.

person Roel    schedule 23.04.2009