LEKCII (Лекции), страница 20
Описание файла
Файл "LEKCII" внутри архива находится в папке "Лекции". Документ из архива "Лекции", который расположен в категории "". Всё это находится в предмете "api windows" из 6 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лекции и семинары", в предмете "api windows" в общих файлах.
Онлайн просмотр документа "LEKCII"
Текст 20 страницы из документа "LEKCII"
Сделаем небольшое пояснение относительно режима отображения MM_TWIPS. В этом режиме используется единица длины twip (от twentieth of a point - двадцатая часть точки, или, в терминах полиграфии, двадцатая часть пункта). Размер одного пункта приблизительно равен 1/72 дюйма, следовательно, размер единицы длины twip равен 1/1440 дюйма.
С помощью функции GetMapMode приложение может в любой момент времени определить номер режима отображения, выбранный в контекст отображения hdc:
int WINAPI GetMapMode(HDC hdc);
Преобразование координат.
Приложение, вызывая для рисования функции GDI, указывает логические координаты. Перед выводом GDI преобразует их в физические с использованием следующих формул:
В этих формулах используются следующие обозначения.
Переменные xWindow и yWindow обозначают, соответственно, логические координаты по оси X и Y. Физические координаты обозначаются как xViewport и yViewport. Таким образом, логические координаты (xWindow,yWindow) преобразуются в физические координаты (xViewport,yViewport).
С помощью переменных xViewOrg и yViewOrg можно изменить расположение начала физических координат. По умолчанию в контексте отображения значения атрибутов, соответствующих этим переменным, равны 0. Приложение может сместить начало координат, изменив значения переменных xViewOrg и yViewOrg.
Для перемещения начала логической системы координат приложение может изменить значения переменных xWinOrg и yWinOrg, которые также определены как атрибуты контекста отображения. По умолчанию в этих переменных находятся нулевые значения.
Переменные xViewExt, yViewExt, xWinExt и yWinExt (вернее, их отношения) задают масштаб, который используется в процессе преобразования координат. Этот масштаб зависит от установленного режима отображения. Приложения могут изменить его только в режимах MM_ISOTROPIC и MM_ANISOTROPIC, для остальных режимов отображения используются фиксированные значения.
Обратные преобразования (из логических координат в физические) выполняются с использованием следующих формул:
Для выполнения подобных вычислений удобна функция MulDiv , определенная в программном интерфейсе Windows:
int WINAPI MulDiv(
int nMultiplicand, // множимое
int nMultiplier, // множитель
int nDivisor); // делитель
Эта функция выполняет умножение 16-разрядного параметра nMultiplicand на 16-разрядный параметр nMultiplier, а затем делит полученное 32-разрядное произведение на 16-разрядный параметр nDivisor. В случае переполнения или при нулевом значении делителя функция возвращает отрицательное значение 32768.
Однако есть специальные функции, предназначенные для преобразования логических координат в физические и физических в логические. Это функции LPtoDP и DPtoLP.
Функция LPtoDP выполняет преобразование логических координат в физические , причем одновременно можно преобразовать несколько пар координат, что ускоряет работу приложения за счет сокращения количества вызовов функции:
BOOL WINAPI LPtoDP(
HDC hdc, // идентификатор контекста отображения
POINT FAR* lppt, // указатель на массив структур POINT
int cPoints); // размер массива структур POINT
Параметр hdc указывает контекст отображения, для которого требуется выполнить преобразования. В процессе преобразования используются атрибуты контекста, такие как смещение и масштаб осей координат.
Через параметр lppt передается указатель на массив структур POINT, в котором находятся преобразуемые координаты. Размер массива определяется значением параметра cPoints. Структура POINT определена в файле windows.h следующим образом:
typedef struct tagPOINT
{
int x;
int y;
} POINT;
После успешного выполнения преобразования функция возвращает значение TRUE. При возникновении ошибки возвращается FALSE.
Обратное преобразование (физических координат в логические ) выполняется функцией DPtoLP :
BOOL WINAPI DPtoLP(
HDC hdc, // идентификатор контекста отображения
POINT FAR* lppt, // указатель на массив структур POINT
int cPoints); // размер массива структур POINT
Назначение параметров функции DPtoLP и возвращаемое ей значение аналогично назначению параметров и возвращаемому значению функции LPtoDP.
Есть еще две функции, предназначенные для преобразования координат - ClientToScreen и ScreenToClient.
Функция ClientToScreen выполняет преобразование координат в системе координат, связанной с внутренней областью окна, в экранные координаты:
void WINAPI ClientToScreen(HWND hwnd, POINT FAR* lppt);
Параметр hwnd содержит идентификатор окна, для которого выполняется преобразование.
Параметр lppt содержит указатель на структуру типа POINT, в которую перед вызовом функции следует записать преобразуемые координаты.
Функция ScreenToClient имеет аналогичные параметры, но выполняет обратное преобразование:
void WINAPI ScreenToClient(HWND hwnd, POINT FAR* lppt);
Режимы отображения.
Теперь, после того как мы рассказали о физических и логических координатах, а также о преобразованиях координат, займемся подробным описанием каждого режима отображения .
Режим MM_TEXT.
Режим отображения MM_TEXT устанавливается в контексте отображения по умолчанию. Для этого режима формулы преобразования координат упрощаются:
xViewport = (xWindow - xWinOrg) + xViewOrg
yViewport = (yWindow - yWinOrg) + yViewOrg
Соответствующая система координат представлена на рис. (начало системы координат расположено точно в левом верхнем углу внутренней области окна, рисунок иллюстрирует только направление координатных осей).
Рис. Система координат в режиме отображения MM_TEXT
Так как в формуле преобразования не присутствуют переменные xViewExt, yViewExt, xWinExt и yWinExt, в данном режиме преобразования невозможно изменить масштаб осей координат. Поэтому логическая единица длины в режиме отображения MM_TEXT равна физической, т. е. одному пикселю.
Тем не менее, приложение может изменить смещение физической или логической системы координат, изменив, соответственно, значение пар переменных (xViewOrg, yViewOrg) и (xWinOrg,yWinOrg). Для установки смещения можно использовать функции SetViewportOrg и SetWindowOrg.
Функция SetViewportOrg устанавливает смещение физической системы координат:
DWORD WINAPI SetViewportOrg(
HDC hdc, // контекст отображения
int nXOrigin, // новое значение для xViewOrg
int nYOrigin); // новое значение для yViewOrg
Для контекста отображения hdc эта функция устанавливает новое расположение начала физической системы координат. Младшее и старшее слово возвращаемого значения содержат, соответственно, предыдущие x- и y-координаты начала физической системы координат.
С помощью функции SetWindowOrg вы можете установить начало логической системы координат:
DWORD WINAPI SetWindowOrg(
HDC hdc, // контекст отображения
int nXOrigin, // новое значение для xWinOrg
int nYOrigin); // новое значение для yWinOrg
По своему смыслу параметры nXOrigin и nYOrigin являются логическими x- и y-координатами верхнего угла окна, используемого для отображения (так как в формуле они используются со знаком минус).
Как правило, приложения изменяют либо начало физических координат, вызывая функцию SetViewportOrg, либо начало логических координат, вызывая функцию SetWindowOrg, хотя, в принципе, вы можете изменить и то, и другое. В программном интерфейсе Windows есть варианты описанных выше двух функций, которые называются SetViewportOrgEx и SetWindowOrgEx. Они отличаются более удобным способом передачи старых координат начала соответствующей системы координат:
BOOL WINAPI SetViewportOrgEx(
HDC hdc, // контекст отображения
int nXOrigin, // новое значение для xWinOrg
int nYOrigin, // новое значение для yWinOrg
POINT FAR* lppt); // указатель на структуру POINT
BOOL WINAPI SetWindowOrgEx(
HDC hdc, // контекст отображения
int nXOrigin, // новое значение для xWinOrg
int nYOrigin, // новое значение для yWinOrg
POINT FAR* lppt); // указатель на структуру POINT
В структуру, адрес которой передается через параметр lppt, записываются старые координаты начала системы координат. Обе функции возвращают TRUE в случае успеха и FALSE при возникновении ошибки.
В любой момент времени вы можете определить расположение начала физических или логических координат, если воспользуетесь функциями GetViewportOrg и GetWindowOrg (или их более новыми аналогами - GetViewportOrgEx и GetWindowOrgEx).
Функция GetViewportOrg возвращает x- и y-координаты начала физической системы координат для контекста отображения hdc:
DWORD WINAPI GetViewportOrg(HDC hdc);
Младшее и старшее слово возвращаемого значения содержат, соответственно, предыдущие x- и y-координаты начала физической системы координат.
Функция GetWindowOrg возвращает x- и y-координаты начала логической системы координат:
DWORD WINAPI GetWindowOrg(HDC hdc);
Функции GetViewportOrgEx и GetWindowExtEx записывают координаты начала координат в структуру, адрес которой передается через параметры lppt и lpSize:
BOOL WINAPI GetViewportOrgEx(HDC hdc, POINT FAR* lppt);
BOOL WINAPI GetWindowExtEx(HDC hdc, SIZE FAR* lpSize);
Структура SIZE определена для Windows версии 3.1 и описана в файле windows.h следующим образом:
typedef struct tagSIZE
{
int cx;
int cy;
} SIZE;
Определены также разнообразные указатели на структуру SIZE:
typedef SIZE* PSIZE;
typedef SIZE NEAR* NPSIZE;
typedef SIZE FAR* LPSIZE;
Метрические режимы отображения.
Режим MM_LOMETRIC , наряду с режимами MM_HIMETRIC , MM_LOENGLISH , MM_HIENGLISH и MM_TWIPS, относится к метрическим режимам. Эти режимы отображения позволяют использовать привычные единицы измерения, такие как миллиметры и дюймы.
В метрических режимах отображения используются полные формулы преобразования координат, приведенные выше в разделе "Преобразование координат". В этих формулах приложение может изменять переменные, определяющие смещение начала физической или логической системы координат xViewOrg, yViewOrg, xWinOrg и yWinOrg.
Приложение не может изменить значения переменных xViewExt, yViewExt, xWinExt и yWinExt, от которых зависит масштаб по осям координат. Отношения xViewExt/xWinExt и yViewExt/yWinExt имеют фиксированное значение для каждого из метрических режимов отображения.
Заметим, что для этих режимов отношение yViewExt/yWinExt имеет отрицательный знак, в результате чего ось Y оказывается направленной снизу вверх.
Обратим ваше внимание на одно важное обстоятельство, связанное с использованием метрических режимов отображения.
Сразу после переключения в метрический режим отображения система координат примет достаточно странный вид.
Рис. Ориентация осей сразу после переключения в метрический режим отображения
Ось X, как и следовало ожидать, окажется направленной слева направо, а ось Y - снизу вверх. Точка с координатами (0,0) будет находиться в верхнем левом углу экрана, поэтому для того чтобы нарисовать что-нибудь в такой системе координат, вам придется для y-координаты графических объектов использовать отрицательные числа. Для того чтобы система координат приняла более удобный вид, можно переместить начало физических координат в нижний левый угол окна или в центр окна.