Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

4.6.4 Работа в режиме mm_text

В режиме MM_TEXT заданы следующие величины начал координат и протяженностей:

Отношение протяженности области вывода к протяженности окна равно 1, таким образом, масштабирование между логическими и физическими координатами не производится. Формулы, приведенные выше, принимают вид:

xViewport = xWindow — xWinOrg + xViewOrg

yViewport = yWindow — yWinOrg + yViewOrg

Этот режим отображения называется "текстовым" не потому, что он наиболее удобен для вывода текста, а из-за направления осей координат.

Мы читаем текст слева направо и сверху вниз, и MM_TEXT аналогично задает направления увеличения координат:

Windows имеет функции SerViewportOrgEx и SetWindowOrgEx для изменения начала координат области вывода и окна. Эти функции обладают эффектом сдвига осей координат таким образом, что логическая точка (0, 0) не будет далее соответствовать левому верхнему углу рабочей области.

Чаще всего вы будете использовать SetViewportOrgEx или SetWindowOrgEx, но не обе функции одновременно.

Вот как работают эти функции. Если вы переносите начало координат области вывода в точку (xViewOrg, yViewOrg), то логическая точка (0, 0) будет соответствовать физической точке с координатами (xViewOrg, yViewOrg). Если вы переносите начало координат окна в точку (xWinOrg, yWinOrg), то логическая точка (xWinOrg, yWinOrg) будет соответствовать физической точке с координатами (0, 0), т. е. левому верхнему углу рабочей области.

Например, предположим, что рабочая область вашего окна имеет ширину cxClient и высоту cyClient пикселей.

Если вы хотите установить начало логической системы координат — точку (0, 0) — в центр рабочей зоны окна, вы можете это сделать так:

SetViewportOrgEx(hdc, cxClient / 2, cyClient / 2, NULL);

Аргументы функции SetViewportOrgEx всегда задаются в координатах устройства.

Логическая точка (0, 0) будет теперь отображаться в точку с физическими координатами (cxClient/2, cyClient/2). Теперь вы используете рабочую область так, как будто бы она имела представленную ниже систему координат:

Значения логической координаты x могут изменяться в диапазоне от —cxClient/2 до cxClient/2. Значения логической координаты y могут изменяться в диапазоне от cyClient/2 до cyClient/2. Правый нижний угол рабочей области — точка с логическими координатами (cxClient/2, cyClient/2). Если вы хотите вывести текст, начиная от верхнего левого угла рабочей зоны, имеющего физические координаты (0, 0), вам необходимо задать отрицательные координаты:

TextOut(hdc, -cxClient / 2, -cyClient / 2, "Hello", 5);

Вы можете добиться того же результата, используя функцию SetWindowOrgEx вместо функции SetViewportOrgEx:

SetWindowOrgEx(hdc, -cxClient / 2, -cyClient / 2, NULL);

Аргументы функции SetWindowOrgEx всегда задаются в логических координатах. После этого вызова логическая точка (—cxClient/2, —cyClient/2) соответствует физической точке (0, 0) — левому верхнему углу рабочей области.

То, чего вы не должны делать (до тех пор, пока вы не будете знать, к чему это приведет) — это использовать обе функции совместно:

SetViewportOrgEx(hdc, cxClient / 2, cyClient / 2, NULL);

SetWindowOrgEx(hdc, -cxClient / 2, -cyClient / 2, NULL);

Это означает, что логическая точка (—cxClient/2, —cyClient/2) соответствует физической точке (cxClient/2, cyClient/2), представляя вам такую систему координат:

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

GetViewportOrgEx(hdc, &pt);

GetWindowOrgEx(hdc, &pt);

где pt — структура типа POINT (точка).

Функция GetViewportOrgEx возвращает значение в координатах устройства, а функция GetWindowOrgEx — в логических координатах.

Вы можете изменить начала координат области вывода и окна так, чтобы сдвинуть экранный вывод в рабочую зону вашего окна — например, в ответ на изменение пользователем состояния полосы прокрутки. Изменение начала координат области вывода или окна не приводит к немедленному сдвигу экранного вывода. Например, в программе SYSMETS2 из главы 2 мы использовали значение iVscrollPos (текущее положение вертикальной полосы прокрутки) для вычисления соответствующей координаты y экранного вывода:

case WM_PAINT :

BeginPaint(hwnd, &ps);

for (i = 0; i < NUMLINES; i++)

{

y = cyChar *(1 — iVscrollPos + i);

[вывод текста]

}

EndPaint(hwnd, &ps);

return 0;

Мы можем добиться того же результата, используя функцию SetWindowOrgEx:

case WM_PAINT :

BeginPaint(hwnd, &ps);

SetWindowOrgEx(ps.hdc, 0, cyChar * iVscrollPos);

for (i = 0; i < NUMLINES; i++)

{

y = cyChar *(1 + i);

[вывод текста]

}

EndPaint(hwnd, &ps);

return 0;

Теперь вычисление координаты y для функции TextOut не требует значения iVscrollPos. Это означает, что вы можете поместить функции вывода текста в подпрограмму, не передавая в нее значение iVscrollPos, так как мы настраиваем вывод текста путем изменения начала координат окна.

Если у вас есть опыт работы с прямоугольной (Декартовой) системой координат, то перенос логической точки (0, 0) в центр рабочей области, как мы сделали ранее, может показаться вам полезным. Тем не менее, тут есть небольшая проблема в режиме MM_TEXT: обычно в Декартовой системе координат значение координаты y увеличивается при перемещении вверх, а в режиме MM_TEXT — вниз. В этом смысле режим MM_TEXT несколько странноват, тогда как следующие пять режимов отображения делают это корректно.

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