Лекция 2. Основы программирования. Работа с классом Вид.
Якунин М.С

[На главную страницу сайта] [Другие темы раздела] [Содержание курса] [Лабораторная работа к лекции] [Скачать задачи] [Следующая лекция]

 

Методические рекомендации:

  1. Для лучшего понимания контекст устройства можно сравнить с холстом, а программирование с работой художника. Сначала необходимо подготовить инструмент: карандаши и кисти, затем нарисовать картину, и после этого аккуратно убрать за собой и сложить все кисти и карандаши в сумку.
  2. При объяснении работы с GDI объектами нужно обратить внимание студента на необходимость восстанавливать старый контекст устройства, а то это может грозить неправильной работой некоторых приложений.
  3. Необходимо акцентировать внимание студента на различие между режимами MM_ISOTROPIC и MM_ANISOTROPIC. Хорошим примером может служить тот факт, что в режиме MM_ISOTROPIC эллипс всегда будет кругом, а прямоугольник квадратом.
  4. Следует обратить внимание студентов на то, что функции, работающие с логическими координатами, имеют в своем названии слово Window, а функции, работающие с физическими координатами, слово Viewport.

План:

  1. Интерфейс графического устройства
  2. Работа с GDI объектами
  3. Режимы преобразования координат
  4. Работа с окнами, содержащими полосы прокрутки

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

Работая с Windows приложениями вы постоянно сталкиваетесь с элементами интерфейса графического устройства (GDI). Всякий раз, когда программа выводит что-нибудь на экран монитора или принтер, она обязана воспользоваться GDI – функциями. Эти функции позволяют рисовать точки, линии, прямоугольники, многоугольники, эллипсы, растровые изображения и выводить текст. Как вам уже должно быть известно – все рисование ведется в контексте устройства, который связан с физическим устройством.

Вспомним что такое контекст устройства

Контекст устройства (Device context) – ключевой элемент GDI, служащий для представления физического устройства. С каждым объектом “контекст устройства” С++ связан контекст устройства Windows, идентифицируемый 32 разрядным описателем типа HDC. Библиотека MFC предоставляет несколько классов контекста устройства.

Классы контекстов устройств:

Класс

Описание

CDC

Базовый класс для контекстов устройств; используется непосредственно для доступа ко всем экранным и не экранным контекстам устройств, таких как принтеры.

CWindowDC

Контекст экрана для всего окна, включая клиентскую и не клиентскую области.

CСlientDC

Контекст экрана для клиентской области окна; используется, например, при рисовании в ответ на события от мыши.

CpaintDC

Контекст экрана, используемый в функции OnPaint() оконных классов; в конструкторе автоматически вызывается функция BeginPaint, а в деструкторе – EndPaint.

CMetaFileDC

Контекст устройства для метафайла Windows, который содержит последовательность команд GDI, необходимых для создания образа.

Работа с GDI объектами

Каждый тип объектов GDI Windows представлен отдельным классом MFC. CGdiObject – абстрактный базовый класс для классов объектов GDI. Объект GDI представляется С++ объектом некоторого класса , производного от CGdiObject. Вот эти классы:

Имя класса

Расшифровка

Описание

CBitmap

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

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

CBrush

Кисть

Точечный шаблон, используемый для закраски областей

CFont

Шрифт

Полный набор символов, некоторой гарнитуры и некоторого размера. Обычно шрифты хранятся на диске как ресурсы, причем некоторые шрифты специфичны для определенных устройств.

CPallete

Палитра

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

CPen

Перо

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

CRgn

Регион

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

Правила работы с GDI объектами.

  1. Создать новый GDI объект с нужными свойствами.
  2. Сохранить старый объект этого класса и выбрать в текущем контексте только что созданный.
  3. Произвести графические работы
  4. Восстановить ранее сохраненный объект.

Замечание

Пункты 2 и 4 могут быть заменены на сохранить текущий контекст устройства, и восстановить текущий контекст устройства соответственно.

Пример создания нового GDI объекта

void CMyView::OnDraw (CDC* pDC)

{

// Создание нового пера

CPen newPen (PS_DASHDOT,2,(COLORREF) 0);

//Сохранение указателя на старое перо, и выбор

// в текущем контексте созданного пера.

CPen* oldPen=pDC->SelectObject(&newPen);

//Перемещение курсора в точку (10;10)

pDC->MoveTo(10,10);

//Проводим линию до точки (110;10)

pDC->LineTo(110,10);

//Востанавливаем старое перо

pDC->SelectObject(oldPen);

}

Режимы преобразования координат

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

Все режимы преобразования координат можно разделить на две части:

  1. Режимы преобразования координат с постоянным масштабом
  2. Режимы преобразования координат с переменным масштабом

Режимы преобразования координат с постоянным масштабом

Режим преобразования

Логическая единица

Описание

MM_TEXT

1 пиксель

Установлен по умолчанию. Начало координат – верхний левый угол. Ось х возрастает вправо. Ось у возрастает вниз.

MM_LOENGLISH

0.01 дюйма

Начало координат – верхний левый угол. Ось х возрастает вправо. Ось у убывает вниз.

MM_HIENGLISH

0.001 дюйма

Начало координат – верхний левый угол. Ось х возрастает вправо. Ось у убывает вниз.

MM_LOMRTRIC

0.1 мм

Начало координат – верхний левый угол. Ось х возрастает вправо. Ось у убывает вниз.

MM_HIMETRIC

0.01 мм

Начало координат – верхний левый угол. Ось х возрастает вправо. Ось у убывает вниз.

MM_TWIPS

1/1440 дюйма

Начало координат – верхний левый угол. Ось х возрастает вправо. Ось у убывает вниз.

Режимы преобразования координат с переменным масштабом

Режим преобразования

Логическая единица

Описание

MM_ISOTROPIC

Нет, но коэффициент пропорциональности всегда равен 1:1

Начало координат – верхний левый угол. Ось х возрастает вправо. Ось у убывает вниз.

MM_ANISOTROPIC

Нет

Начало координат – верхний левый угол. Ось х возрастает вправо. Ось у убывает вниз.

Замечание

Режим преобразования координат следует устанавливать в виртуальной функции OnPrepareDC, которая переопределяется при помощи ClassWizard.

Координатные пространства MFC

Для настойки системы координат в MFC используются два понятия:

  1. Физическая область вывода (viewport), координаты и размеры, которой задаются в физических единицах – пикселях. Физические единицы, еще называют координатами устройства.
  2. Логическая область вывода (window), координаты и размеры, которой задаются в логических единицах, определяемых режимом рисования.

Правила работы с логическими и физическими координатами

  • Считайте, что все параметры функций – членов CDC – это логические координаты
  • Считайте, что все параметры функций – членов CWnd – это координаты устройства
  • Проверяя, попадает ли указатель мыши в определенную область, используйте координаты устройства. Задавайте области в координатах устройства. Такие функции, как CRect::PtInRect, лучше всего работают, если используются координаты устройства.

Некоторые функции для работы с координатами устройства

Все ниже представленные функции являются функциями – членами класса “контекст устройства”

Функция

Описание

SetMapMode(<режим преобразования>);

Устанавливает один из вышеперечисленных режимов преобразования

SetVieportOrg(<координаты нового начала>);

Устанавливает новую точку начала координат

SetWindowExt(<размер по горизонтали, размер по вертикали>);

Устанавливает размер области вывода по горизонтали и вертикали в логических единицах.(Для режима с переменным масштабом).

SetVieportExt(<размер по горизонтали, размер по вертикали >);

Устанавливает размер области вывода по горизонтали и вертикали в физических единицах. (Для режима с переменным масштабом).

LPtoDP(<координаты (CRect)>);

Преобразовывает логические координаты в физические

DPtoLP(<координаты (CRect)>)

Преобразовывает физические координаты в логические.

Пример использования режимов преобразования координат

void CEeView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)

{

pDC->SetMapMode(MM_LOMETRIC);

pDC->SetViewportOrg(100,100);

CView::OnPrepareDC(pDC, pInfo);

}

В данном примере устанавливается режим преобразования координат MM_LOMETRIC, и начало координат переносится в точку (100;100).

Работа с окнами, содержащими полосы прокрутки

Если с помощью мыши уменьшить размеры обычного окна, то содержимое окна останется неподвижным относительно его левого верхнего уровня, а элементы, расположенные снизу и справа, исчезнут. После увеличения размеров окна эти элементы появятся вновь. Отсюда можно логично заключить, что окно больше, чем его область вывода (viewport), которую Вы видите на экране. Однако область вывода не обязана быть жестко привязана к левому верхнему краю окна. Благодаря функциям CWnd ScrollWindow и SetWindowOrg класс CScrollView позволяет перемещать область вывода в любое место окна, включая области, расположенные выше и левее.

Линейки прокрутки

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

Эту задачу выполняет класс CScrollView. Функции-члены CScrollView обрабатывают сообщения WM_HSCROLL и WM_VSCROLL, которые линейки прокрутки посылают объекту “вид”. Эти функции перемещают область вывода внутри окна и выполняют необходимые вспомогательные действия.

Различные способы прокрутки

Класс CScrollView поддерживает один определенный способ прокрутки, в котором используется одно большое окно и маленькая область вывода. Для каждого элемента определено положение внутри большого окна. Например, если необходимо отобразить на экране 10000 адресных строк, то вместо окна длиной в 10 000 строк, вероятно, лучше иметь небольшое окно, поддерживающее алгоритм прокрутки, который выбирает для отображения столько строк, сколько можно отобразить в данный момент. В данном случае Вам необходимо создать свой класс “вид” с прокруткой, производный от CView

Microsoft Windows NT использует для представления логических координат 32 разрядные числа, так что пространство логических координат практически не ограничено. Но Windows 95 по прежнему использует некоторые 16 разрядные компоненты и потому представляет логические координаты с помощью 16 разрядных чисел, что ограничивает диапазон их значений от 32.768 до 32.767. Линейки прокрутки в обоих ОС посылают сообщения с 16 разрядными значениями.

Функция OnlnitialUpdate

Виртуальная функция OnlnitialUpdate важна потому, что к ней первой обращается каркас приложения после того, как полностью создано окно представления, но перед вызовом OnDraw, так что именно в OnlnitialUpdate следует задать логический размер и режима преобразования координат для вывода с прокруткой. Эти параметры устанавливаются с помощью функции CScrollView::SetScrollSizes.

Прием ввода с клавиатуры

Ввод с клавиатуры — двухэтапный процесс. Windows посылает окну сообщения WM_KEYDOWN и WM_KEYUP с кодами виртуальных клавиш (virtual key codes), но прежде, чем эти сообщения доходят до окна, они транслируются. Если введен символ ANSI (в результате чего генерируется сообщение WM_KEYDOWN), то функция трансляции проверяет состояние регистра клавиатуры и посылает сообщение WM_CHAR с соответствующим кодом символа – либо верхнего, либо нижнего регистра. Клавиши перемещения курсора и функциональные клавиши не имеют соответствующих кодов символов, поэтому для них трансляция не требуется. Окно получает только сообщения WM_KEYDOWN и WM_KEYUP.

Чтобы создать в классе “вид” обработчики этих сообщений, можно воспользоваться ClassWizard. Если Вы собираетесь принимать алфавитно-цифровые клавиши, обрабатывайте WM_CHAR, если Вам нужно обрабатывать нажатия и других клавиш – обрабатывайте WM_KEYDOWN. Библиотека MFC аккуратно предоставляет в качестве параметра функции-обработчика код символа или код виртуальной клавиши.

Контрольные вопросы

  1. Что такое “контекст устройства”?
  2. Какие классы GDI вы знаете ?
  3. Чем отличаются режимы преобразования координат с постоянным масштабом, от режимов с переменным масштабом
  4. Какие координатных пространства используются в MFC
  5. Чем отличается режим преобразования MM_ISOTROPIC от режима MM_ANISOTROPIC
  6. Какая функция преобразует логические координаты в физические. Чем отличаются режимы прокрутки Windows NT и Windows 95.

    [На главную страницу сайта] [Другие темы раздела] [Содержание курса] [Лабораторная работа к лекции] [Скачать задачи] [Следующая лекция]