
- •Управление курсором при редактировании текста
- •Задание 3. Реализация процесса управления курсором при редактировании
- •Подведение итогов
- •Глава 10. Интерфейс графических устройств
- •Контексты устройств и объекты gdi
- •Объекты контекста устройства и выбор инструментов рисования
- •Идентификаторы стандартных инструментов рисования
- •Создание инструментов рисования
- •Некоторые стили пера
- •Значения, передаваемые в макрос rgb() для генерации стандартных чистых цветов vga
- •Режим отображения
- •Установка графических атрибутов
Режим отображения
Режим отображения определяет зависимость между пространствами логических координат и координат устройства. Он сопоставляет начало отсчета логического координатного пространства и начало отсчета координат устройства, а также единицы измерения логических и координат устройства. Он определяет направление увеличения значений координат, используемых для отображения графики и текстов. Режимы отображения для горизонтального и вертикального направлений могут не зависеть друг от друга.
Текущий режим отображения действует на все функции рисования графики и текста через координаты, передаваемые в функции графического вывода и другие функции, принимающие логические координаты. Однако текущий режим отображения не влияет на функции, которым передают координаты устройства.
Координаты устройства описывают положение объекта в клиентской области окна. Для этого указывают расстояния по горизонтали и по вертикали от левого верхнего угла клиентской области окна или левого верхнего угла доступной для печати области страницы до объекта в пикселах, называемых также единицами устройства. Горизонтальные координаты возрастают при перемещении вправо, а вертикальные координаты увеличиваются при перемещении вниз. Для координат устройства начало координат (0, 0) всегда находится в верхнем левом углу окна.
В стандартном режиме отображения, который имеет идентификатор MM_TEXT, логические координаты приведены в пикселах (горизонтальные координаты увеличиваются при перемещении вправо, а вертикальные — вниз, рис. 10.4). В этом режиме отображения логические координаты совпадают с координатами устройства, если программа не меняет положение начала системы логических координат.
Рис. 10.4. Направление увеличения значений координат и разметка осей для стандартного режима отображения MM_TEXT
Создание альтернативного режима отображения может изменить и логические единицы, и направление увеличения логических координат. Чтобы назначить альтернативный режим отображения, вызовите функцию CDC::SetMapMode().
virtual int CDC::SetMapMode (int nMapMode);
где nMapMode — идентификатор, определяющий новый режим отображения. В табл. 8.5 главы 8 приведены значения, которые можно присвоить nMapMode, и соответствующие им размеры логических единиц в результирующем режиме отображения.
Для режимов отображения MM_HIENGLISH, MM_HIMETRIC, MM_LOENGLISH, MM_LOMETRIC и MM_TWIPS горизонтальные координаты увеличиваются при перемещении вправо, вертикальные — при передвижении вверх. На рис. 10.5 показано направление увеличения координат для альтернативных режимов MM_HIENGLISH, MM_HIMETRIC, MM_LOENGLISH, MM_LOMETRIC и MM_TWIPS. Метки на осях координат определены для режима MM_HIMETRIC.
Заметим, что режимы отображения MM_ANISOTROPIC или MM_ISOTROPIC, описывая размер логических единиц и направление увеличения координат, создают настраиваемый режим отображения. Вертикальные и горизонтальные координаты для режима MM_ISOTROPIC имеют одинаковый масштаб, а для режима MM_ANISOTROPIC могут иметь разные масштабы. Для их описания используются функции CDC::SetWindowExt() и CDC::SetViewportExt(). Прототипы этих функций определены таким образом:
virtual CSize CDC::SetWindowExt( int cx, int cy ); virtual CSize CDC::SetWindowExt( SIZE size );
Рис. 10.5. Направление увеличения значений координат и разметка осей для режима отображения MM_HIMETRIC
Параметры cx и cy определяют ширину и высоту окна в логических единицах, поэтому тип параметров int. В качестве параметра может использоваться структура типа SIZE, имеющая поля cx и cy. Функция CSize CDC::SetWindowExt() возвращает размер окна в логических единицах как объект класса CSize.
Для определения размера области просмотра используются функции, прототипы которых приводятся ниже.
virtual CSize CDC::SetViewportExt( int cx, int cy ); virtual CSize CDC::SetViewportExt( SIZE size );
Здесь параметры задаются в единицах устройства (device units).
Для всех режимов отображения начало системы логических координат (т.е. точка с логическими координатами 0, 0) расположена в верхнем левом углу клиентской области окна. На рис. 10.6. показан эффект типичного преобразования логических координат в координаты устройства.
Рис. 10.6. Преобразование логических координат в координаты устройства.
Начало координат можно переместить с помощью функций CDC::SetViewportOrg() и CDC::SetWindowOrg(). Прототипы функций определены таким образом:
virtual CPoint CDC::SetViewportOrg( int x, int y ); virtual CPoint CDC::SetViewportOrg( POINT point ); CPoint CDC::SetWindowOrg( int x, int y ); CPoint CDC::SetWindowOrg( POINT point );
Функции возвращают координаты предыдущего начала координат и в качестве аргументов принимают координаты нового начала в логических единицах.
Ниже приведена функция OnDraw() класса представления, которая рисует эллипс, точно соответствующий размерам окна. Используемые функции CDC::SetWindowExt() и CDC::SetViewportExt() задают масштабные множители в зависимости от текущего размера клиентской области окна. Функция CDC::SetViewportOrg() устанавливает новое начало координат в центр окна.
void CMyView::Draw(CDC* pDC) { CRect rect; GetClientRect(&rect); pDC->SetMapMode(MM_ANISOTROPIC); pDC->SetWindowExt(2000,2000); pDC->SetViewportExt(rect.right,-rect.bottom); pDC->SetViewportOrg(rect.right/2,rect.bottom/2); pDC->Ellipse(-1000,-1000,1000,1000); }
Логические координаты необходимо описывать при вызове любой из функций отображения текста, функций рисования или функций битовых операций. Однако многие функции и уведомляющие сообщения Windows используют координаты устройства, например, функции CWnd::GetClientRect() и CWnd::MoveWindow() и сообщение WM_MOUSEMOVE. Если используется стандартный режим отображения, и окно представления не поддерживает прокрутку, то логические координаты совпадают с координатами устройства. Но если класс представления поддерживает прокрутку или используется альтернативный режим отображения, необходимо выполнять преобразования координат устройства в логические координаты и наоборот. Напомним, что логические координаты можно преобразовать в координаты устройства, вызвав функцию CDC::LPtoDP(), а координаты устройства — в логические, вызвав функцию CDC::DPtoLP().
Иногда используются значения измерений, показывающие размер некоторого элемента. Значения измерения можно представить в логических единицах, определяемых текущим режимом отображения, например, в единицах ширины пера, переданных в функцию CPen::CreatePen() или в размерах графического блока, переданных в функцию CDC::BitBlt(). Значения измерения могут также задаваться в единицах устройства (например, в пикселах) для величины прокрутки, передаваемой в CWnd::ScrollWindow(), или размера окна, передаваемого сообщением WM_SIZE. Пользуйтесь справочной системой Visual C++.NET, чтобы узнать, какие единицы необходимо задавать в различных функциях.
Важным преимуществом в использовании альтернативных режимов отображения (например, MM_HIENGLISH, MM_HIMETRIC, MM_LOENGLISH, MM_LOMETRIC или MM_TWIS, а также MM_ANISOMETRIC или MM_ISOMETRIC при соответствующем задании единиц) является то, что размер рисуемого изображения не зависит от устройства, на котором оно отображается. И, наоборот, при использовании стандартного режима отображения MM_TEXT размер изображения зависит от разрешения устройства. Соответственно, альтернативные режимы отображения полезны для программ, которые согласуются с принципами WYSIWYG (What You See Is What You Get — что вы видите, то и получаете). Речь идет о программах, в которых размер объекта на экране такой же, как его размер на любом принтере или на другом устройстве вывода. В примерах программ, приведенных в этой книге, для простоты используется стандартный режим отображения.