12 Работа с графикой (Лекции по курсу ПОУК-1)

2017-12-28СтудИзба

Описание файла

Файл "12 Работа с графикой" внутри архива находится в папке "Лекции по курсу ПОУК-1". Документ из архива "Лекции по курсу ПОУК-1", который расположен в категории "". Всё это находится в предмете "программное обеспечение управляющих комплексов (поук)" из 6 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лекции и семинары", в предмете "программное обеспечение управляющих комплексов (поук)" в общих файлах.

Онлайн просмотр документа "12 Работа с графикой"

Текст из документа "12 Работа с графикой"

10 стр. Лекция 12. Работа с графикой

Работа с графикой

Если в окне приложения должно выводиться изображение, связанное с существом задачи, необходимо использовать облики, построенные на основе класса CView.

Замечание о классе CView

Объекты класса CView имеют окно, представляющее собой обычную прямоугольную область экрана, без рамки, меню и других элементов. Вывод в такое окно (в том числе и текста) производится в графическом виде. При работе с этим классом очень важны моменты, рассматриваемые ниже.

Сообщение и метод OnDraw

Предположим, в окне отображен какой-либо рисунок, который затем перекрыт другим окном, а через некоторое время верхнее окно сдвигается с рисунка. Если перекрывающее окно небольшое, например, окно меню, то при его закрытии перекрытая часть восстанавливается системой Windows. В большинстве же случаев Windows обращается за помощью к владеющему окном приложению и посылает ему сообщение о необходимости восстановить окно. Дело разработчика приложения, реагировать на это сообщение или нет. Если обработка сообщения не предусмотрена, то велика вероятность исчезновения части рисунка из окна.

Итак, для обеспечения корректного отображения информации в окне нужна функция, которая будет перерисовывать содержимое окна всякий раз, когда оно потребуется. Для этого служит метод OnDraw. В качестве параметра этому методу передается указатель на контекст устройства, используя который, можно перерисовать окно.

Графическое устройство и его контекст

Работа с графическими устройствами, такими, как принтер, плоттер, дисплей в системе Windows вообще и в Visual C++ в частности является аппаратно-независимой. Это значит, что при программировании под Windows средств прямого доступа к аппаратуре нет. Все взаимодействие с ней производится через функции API (Application Program Interface). При этом для вывода на графические устройства используется один и тот же набор функций.

Для того, чтобы определить, на какое устройство осуществляется вывод, в Windows и в Visual C++ используется понятие контекста устройства (device context). Далее везде будет рассматриваться контекст устройства, реализованный в Visual C++. Контекст устройства - это объект класса CDC, содержащий все методы для построения изображения в окне. Кроме того, он содержит данные о графическом устройстве вывода. Для осуществления вывода создается контекст устройства и тем самым определяется конкретное устройство для вывода. А далее к созданному объекту можно применять все имеющиеся методы класса CDC.

При выводе многие параметры долгое время остаются неизменными, например, цвет линии и другие. Указывать все такие параметры при каждом обращении к методам вывода неудобно. Контекст устройства содержит целый ряд таких параметров, обычно их называют атрибутами контекста устройства. Методы имеют лишь те параметры, что определяют существо их действия, а остальные атрибуты для рисования берутся из контекста устройства. При создании контекста устройства его атрибуты устанавливаются по умолчанию. Затем их можно изменять методами класса CDC.

Поврежденная область и поврежденный прямоугольник

При работе с окнами обычно "повреждается" только часть окна, так что перерисовывать все окно неэкономно. Поэтому система Windows фиксирует не только необходимость перерисовки, но и информацию о поврежденной области (invalid region). Но более важным является понятие поврежденный прямоугольник (invalid rectangle) - минимальный прямоугольник, покрывающий поврежденную область. Windows и Visual C++ обеспечивают следующие возможности при работе с поврежденным прямоугольником:

Методы GetUpdateRect и GetUpdateRgn класса CWnd позволяют получить описание поврежденного прямоугольника и поврежденной области.

Если производить перерисовку стандартным путем (например, внутри метода обработки сообщения OnDraw), то рисование в окне результативно только в области поврежденного прямоугольника. В этом случае говорят, что поврежденный прямоугольник задает область усечения, вне которой содержимое окна не изменяется.

Если в момент возникновения поврежденной области сформированное ранее системой Windows сообщение WM_PAINT о необходимости перерисовки окна не было обработано приложением и стоит в очереди приложения, новое сообщение WM_PAINT в очередь не добавляется. В качестве поврежденной области берется минимальный прямоугольник, покрывающий одновременно старый и новый прямоугольники.

Методы Invalidate, InvalidateRect и InvalidateRgn класса CWnd позволяют объявить соответственно клиентскую область, некоторые прямоугольник и область окна поврежденными и послать сообщение WM_PAINT в очередь приложения.

Методы ValidateRect и ValidateRgn класса CWnd позволяют отменить объявление некоторого прямоугольника или области поврежденными. Это ведет к корректировке текущего поврежденного прямоугольника.

При создании окна поврежденный прямоугольник устанавливается равным клиентской части окна. Обработчик сообщения Update класса CView также устанавливает поврежденный прямоугольник равным клиентской части окна.

Атрибуты контекста устройства

Атрибуты контекста устройства задают общие для всех методов класса CDC параметры графического вывода. При создании контекста устройства они получают значения по умолчанию.

Атрибут контекста устройства

Значение по умолчанию

Тип логической системы координат (mapping mode)

MM_TEXT

Выделенная точка окна (window origin)

(0,0)

Выделенная точка области отображения (viewport origin)

(0,0)

Меры протяженности оконной системы координат (window extents)

(1,1)

Меры протяженности области отображения (viewport extents)

(1,1)

Перо (pen)

BLACK_PEN

Кисть (brush)

WHITE_BRUSH

Шрифт (font)

SYSTEM_FONT

Растровое изображение (bitmap)

 

Текущая позиция пера (current pen position)

(0,0)

Режим фона (background mode)

OPAQUE

Цвет фона (background color)

белый

Цвет текста (text color)

черный

Режим отображения (drawing mode)

R2_COPYPEN

Режим растяжения (stretching mode)

BLACKONWHITE

Режим заполнения многоугольника (polygon filling mode)

ALTERNATE

Число пробелов между символами (intercharacter spacing)

0

Выделенная точка кисти (brush origin)

(0,0) в экран. координатах

Область усечения (clipping region)

 

Системы координат

Вывод на графическое устройство привязан к некоторой системе координат. Практически все методы, обеспечивающие вывод на графическое устройство, привязаны к логической (или оконной) системе координат. В этой системе координаты называют логическими.

Свойства этой системы можно менять. Описание логической системы координат задается контекстом устройства. Чтобы логические координаты могли интерпретироваться физическим устройством, используется следующий механизм. Графическое устройство имеет свою собственную фиксированную физическую систему координат. Контекст устройства содержит атрибуты, задающие соответствие между логическими и физическими координатами точки, что позволяет при выводе на графическое устройство произвести преобразование логических координат в физические. Графическое устройство осуществляет вывод в прямоугольную область отображения (viewport). Начало системы координат находится в левом верхнем углу области, первая координатная ось (Х) направлена горизонтально слева направо, вторая - Y вертикально сверху вниз. Единицей измерения является пиксел.

При выводе на дисплей в системе Windows существует как бы три графических устройства, зависящих от типа экранной области, в которую осуществляется вывод. Вывод может производиться:

  • на экран, и тогда область отображения - весь экран;

  • в Windows-окно, и тогда область отображения - все Windows-окно;

  • в клиентскую часть Windows-окна, и тогда область отображения - клиентская часть Windows-окно.

Для каждого из этих графических устройств можно создать свой тип контекста устройства.

Тип логической системы координат (mapping mode) является атрибутом контекста устройства. Соответствие между системой координат области отображения и логической системой координат окна задается атрибутами:

  • выделенная точка окна (window origin);

  • выделенная точка области отображения (viewport origin);

  • меры протяженности логической (оконной) системы (window extent);

  • меры протяженности области отображения (viewport extent).

Используя эти атрибуты, Windows преобразует логические координаты в физические и выводит на графическое устройство.

Логическая система координат

Под типом логической системы координат понимается то, как направлены координатные оси и каковы единицы измерения по каждой из координатных осей. В Windows существует несколько типов логических систем координат.

Тип системы координат

Единица измерения

Направление оси X

Направление оси Y

MM_TEXT

Пиксел

Координата увеличивается слева направо

Координата увеличивается сверху вниз

MM_LOMETRIC

0.1 мм

Координата увеличивается слева направо

Координата увеличивается снизу вверх

MM_HIMETRIC

0.01 мм

Координата увеличивается слева направо

Координата увеличивается снизу вверх

MM_LOENGLISH

0.01 дюйма

Координата увеличивается слева направо

Координата увеличивается снизу вверх

MM_HIENGLISH

0.001 дюйма

Координата увеличивается слева направо

Координата увеличивается снизу вверх

MM_TWIPS

1/1440 дюйма

Координата увеличивается слева направо

Координата увеличивается снизу вверх

MM_ISOTROPIC

Усл.единицы (по X и У совпадают)

устанавливается

Устанавливается

MM_ANISOTROPIC

Усл.единицы (по X и Y задаются независимо)

устанавливается

Устанавливается

Для установки типа системы координат используется метод контекста устройства SetMapMode, а для получения типа системы координат - метод GetMapMode.

Очень интересны режимы отображения MM_ISOTROPIC и MM_ANISOTROPIC. Оба этих режима отображения используются в основном, когда программисту требуется построить максимально большое изображение внутри окна, которое будет часто изменять свои размеры.

Ниже очень кратко показана разница между режимами MM_ANISOTROPIC и MM_ISOTROPIC и стандартными режимами отображения:

  • Если необходимо, чтобы рисунок сохранял свои пропорции, нужно использовать режим MM_ISOTROPIC.

  • Если необходимо растянуть рисунок так, чтобы он занимал все доступное пространство, нужно использовать режим MM_ANISOTROPIC.

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

Соответствие между логической и физической системами координат

Соответствие между логической и физической системами координат устанавливается двумя понятиями: выделенная точка (origin) и мера протяженности (точнее, меры протяженности, так как их две: по оси X и по оси Y). Каждая из систем координат имеет свою выделенную точку. Выделенная точка логической системы координат определяется атрибутом window origin (выделенная точка окна), а выделенная точка физической системы координат - атрибутом viewport origin (выделенная точка области отображения). Соответствие устанавливается наложением двух систем так, чтобы выделенные точки совпадали. Выделенные точки задают, каким образом системы координат размещены одна относительно другой.

Работа с выделенными точками обеспечивается методами класса CPoint:

  • выделенная точка логической системы координат устанавливается методом SetWindowOrg, а получается методом GetWindowOrg;

  • выделенная точка физической системы координат устанавливается методом SetViewportOrg, а получается методом GetViewportOrg.

Для систем координат типа MM_TEXT, MM_LOMETRIC, MM_HIMETRIC, MM_LOENGLISH, MM_HIENGLISH, MM_TWIPS выделенные точки полностью задают соответствие. Значение двух других атрибутов соответствия для этих типов систем координат фиксированы и не могут меняться программистом.

Соответствие между логическими и физическими координатами точки можно выразить формулами:

xViewPort = (xWindow - xWinOrg) * xScale + xViewOrg , yViewPort = (yWindow - yWinOrg) * yScale + yViewOrg ,

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5168
Авторов
на СтудИзбе
438
Средний доход
с одного платного файла
Обучение Подробнее