Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
289-320.doc
Скачиваний:
2
Добавлен:
11.11.2019
Размер:
301.57 Кб
Скачать

Режим отображения

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

Текущий режим отображения действует на все функции рисования графики и текста через координаты, передаваемые в функции графического вывода и другие функции, принимающие логические координаты. Однако текущий режим отображения не влияет на функции, которым передают координаты устройства.

Координаты устройства описывают положение объекта в клиентской области окна. Для этого указывают расстояния по горизонтали и по вертикали от левого верхнего угла клиентской области окна или левого верхнего угла доступной для печати области страницы до объекта в пикселах, называемых также единицами устройства. Горизонтальные координаты возрастают при перемещении вправо, а вертикальные координаты увеличиваются при перемещении вниз. Для координат устройства начало координат (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 — что вы видите, то и получаете). Речь идет о программах, в которых размер объекта на экране такой же, как его размер на любом принтере или на другом устройстве вывода. В примерах программ, приведенных в этой книге, для простоты используется стандартный режим отображения.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]