Этот раздел главы содержит пример, который демонстрирует нижеследующие задачи:
Нижеследующий пример используется, чтобы создать иллюстрации, которые показывались раньше в этом обзоре.
void TransformAndDraw(int iTransform, HWND hWnd) { HDC hDC; XFORM xForm; RECT rect; // Получим дескриптор DC окна приложения. hDC = GetDC(hWnd); // Установим режим отображения LOENGLISH. Затем переместим // начало координат рабочей области из левого верхнего угла // окна в левый нижний угол (это также переориентирует // ось Y так, что операции рисования происходят в истинном // Декартовом пространстве). Это гарантирует мобильность таким образом, что // нарисованный объект сохраняет свои размеры на любом дисплее. SetGraphicsMode(hDC, GM_ADVANCED); SetMapMode(hDC, MM_LOENGLISH); // Установим соответствующее преобразование мирового пространства (основанное на // выборе меню пользователя). switch (iTransform) { case SCALE: // Масштаб 1/2 первоначального размера. xForm.eM11 = (FLOAT) 0.5; xForm.eM12 = (FLOAT) 0.0; xForm.eM21 = (FLOAT) 0.0; xForm.eM22 = (FLOAT) 0.5; xForm.eDx = (FLOAT) 0.0; xForm.eDy = (FLOAT) 0.0; SetWorldTransform(hDC, &xForm); break; case TRANSLATE: // Переместим по прямой на 3/4 дюйма. xForm.eM11 = (FLOAT) 1.0; xForm.eM12 = (FLOAT) 0.0; xForm.eM21 = (FLOAT) 0.0; xForm.eM22 = (FLOAT) 1.0; xForm.eDx = (FLOAT) 75.0; xForm.eDy = (FLOAT) 0.0; SetWorldTransform(hDC, &xForm); break; case ROTATE: // Повернем на 30 градусов против часовой стрелки. xForm.eM11 = (FLOAT) 0.8660; xForm.eM12 = (FLOAT) 0.5000; xForm.eM21 = (FLOAT) -0.5000; xForm.eM22 = (FLOAT) 0.8660; xForm.eDx = (FLOAT) 0.0; xForm.eDy = (FLOAT) 0.0; SetWorldTransform(hDC, &xForm); break; case SHEAR: // Сдвинем по оси X с // коэффициентом пропорциональности 1.0. xForm.eM11 = (FLOAT) 1.0; xForm.eM12 = (FLOAT) 1.0; xForm.eM21 = (FLOAT) 0.0; xForm.eM22 = (FLOAT) 1.0; xForm.eDx = (FLOAT) 0.0; xForm.eDy = (FLOAT) 0.0; SetWorldTransform(hDC, &xForm); break; case REFLECT: // Отразим относительно горизонтальной оси. xForm.eM11 = (FLOAT) 1.0; xForm.eM12 = (FLOAT) 0.0; xForm.eM21 = (FLOAT) 0.0; xForm.eM22 = (FLOAT) -1.0; xForm.eDx = (FLOAT) 0.0; xForm.eDy = (FLOAT) 0.0; SetWorldTransform(hDC, &xForm); break; case NORMAL: // Установим единицу измерения в преобразовании. xForm.eM11 = (FLOAT) 1.0; xForm.eM12 = (FLOAT) 0.0; xForm.eM21 = (FLOAT) 0.0; xForm.eM22 = (FLOAT) 1.0; xForm.eDx = (FLOAT) 0.0; xForm.eDy = (FLOAT) 0.0; SetWorldTransform(hDC, &xForm); break; } // Найдем середину рабочей области. GetClientRect(hWnd, (LPRECT) &rect); DPtoLP(hDC, (LPPOINT) &rect, 2); // Выберем пустую кисть. SelectObject(hDC, GetStockObject(HOLLOW_BRUSH)); // Рисуем внешний круг. Ellipse(hDC, (rect.right / 2 - 100), (rect.bottom / 2 + 100), (rect.right / 2 + 100), (rect.bottom / 2 - 100)); // Рисуем внутренний круг. Ellipse(hDC, (rect.right / 2 -94), (rect.bottom / 2 + 94), (rect.right / 2 + 94), (rect.bottom / 2 - 94)); // Рисуем клавишу. Rectangle(hDC, (rect.right / 2 - 13), (rect.bottom / 2 + 113), (rect.right / 2 + 13), (rect.bottom / 2 + 50)); Rectangle(hDC, (rect.right / 2 - 13), (rect.bottom / 2 + 96), (rect.right / 2 + 13), (rect.bottom / 2 + 50)); // Рисуем горизонтальные линии. MoveToEx(hDC, (rect.right/2 - 150), (rect.bottom / 2 + 0), NULL); LineTo(hDC, (rect.right / 2 - 16), (rect.bottom / 2 + 0)); MoveToEx(hDC, (rect.right / 2 - 13), (rect.bottom / 2 + 0), NULL); LineTo(hDC, (rect.right / 2 + 13), (rect.bottom / 2 + 0)); MoveToEx(hDC, (rect.right / 2 + 16), (rect.bottom / 2 + 0), NULL); LineTo(hDC, (rect.right / 2 + 150), (rect.bottom / 2 + 0)); // Рисуем вертикальные линии. MoveToEx(hDC, (rect.right/2 + 0), (rect.bottom / 2 - 150), NULL); LineTo(hDC, (rect.right / 2 + 0), (rect.bottom / 2 - 16)); MoveToEx(hDC, (rect.right / 2 + 0), (rect.bottom / 2 - 13), NULL); LineTo(hDC, (rect.right / 2 + 0), (rect.bottom / 2 + 13)); MoveToEx(hDC, (rect.right / 2 + 0), (rect.bottom / 2 + 16), NULL); LineTo(hDC, (rect.right / 2 + 0), (rect.bottom / 2 + 150)); ReleaseDC(hWnd, hDC); } |