Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Вращение графического образа

Читайте также:
  1. XVIII. ПРЕДОТВРАЩЕНИЕ ПРОТИВОПРАВНОГО ВЛИЯНИЯ НА РЕЗУЛЬТАТЫ ОФИЦИАЛЬНОГО СПОРТИВНОГО СОРЕВНОВАНИЯ
  2. Арча. Возвращение
  3. Божественное возвращение в пройденные этапы развития
  4. Божественный настрой на комплексное возвращение в пройденные этапы развития
  5. В РПДВС «ЯРЕДВАС» происходит прямое превращение энергии сгорания топлива в механическую энергию вращения выходного вала.
  6. В чем разница между альфа-образами и тета-образами?
  7. ВЕЧНОЕ ВОЗВРАЩЕНИЕ

Еще одна функция SetWorldTransform(), реализованная в Windows NT, позволяет

производить вращение изображения. Строго говоря, функция обеспечивает пово-

рот не самого изображения, а системы координат:

BOOL WINAPI SetWorldTransform(HDC hdc, CONST XFORM *lpXform);

Здесь hdc — контекст устройства, lpXform — структура, содержащая данные для преобразования координат.

struct XFORM {FLOAT eM11, eM12, eM21, eM22, eDx, eDy;};

Формулы преобразования координат имеют следующий вид:

x' = x * eM11 + y * eM21 + eDx

y' = x * eM12 + y * eM22 + eDy

Из аналитической геометрии нам известны формулы преобразования координат:

cos() sin()

sin() cos()

x x x y

y y x y

Из сравнения этих формул следует, что первые четыре параметра структуры — это косинусы и синусы угла поворота, а два последних — сдвиг системы координат.

Для демонстрации работы функции SetWorldTransform() напишем программу

(листинг 4.7), где отобразим небольшую картинку из bmp-файла, над ко-

торой поместим текст. При каждом нажатии на левую кнопку мыши обеспечим поворот на 45.

Листинг 4.7. Демонстрация вращения графического образа

#define _USE_MATH_DEFINES

#include <math.h>

TCHAR *text = _T("Масяня");

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

PAINTSTRUCT ps;

HDC hdc;

static int x, y, cx, cy;

static double angle;

static HDC memBit;

static HBITMAP hBitmap;

static BITMAP bm;

static XFORM xf;

switch (message)

{

case WM_CREATE:

hBitmap = (HBITMAP)LoadImage(NULL, _T("mas1.bmp"), IMAGE_BITMAP, 0,0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);

GetObject(hBitmap, sizeof(bm), &bm);

hdc = GetDC(hWnd);

memBit = CreateCompatibleDC(hdc);

SelectObject(memBit, hBitmap);

ReleaseDC(hWnd, hdc);

break;

case WM_SIZE:

cx = LOWORD(lParam)/2; //Координаты центра окна

cy = HIWORD(lParam)/2;

xf.eDx = cx; //Точка будет являться и новым началом

xf.eDy = cy; //координат для графических функций

x = - bm.bmWidth/2;

y = - bm.bmHeight/2;

break;

case WM_LBUTTONDOWN: angle += M_PI*45.0/180.0;

InvalidateRect(hWnd, NULL, TRUE);

break;

case WM_PAINT:

xf.eM22 = xf.eM11 = cos(angle);

xf.eM12 = -(xf.eM21 = sin(angle));

hdc = BeginPaint(hWnd, &ps);

SetGraphicsMode(hdc, GM_ADVANCED);

SetWorldTransform(hdc, &xf);

TextOut(hdc,x+35, y-20, text, _tcsclen(text));

BitBlt(hdc, x, y, bm.bmWidth, bm.bmHeight, memBit, 0, 0, SRCCOPY);

EndPaint(hWnd, &ps);

break;

case WM_COMMAND:

switch (LOWORD(wParam))

{

case IDM_EXIT: DestroyWindow(hWnd); break;

default: return DefWindowProc(hWnd, message, wParam, lParam);

}

break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

}

Картинку загружаем функцией LoadImage() из файла mas1.bmp при обработке сообщения о создании окна WM_CREATE. Здесь же создаем контекст в памяти, совместимый с контекстом устройства вывода, так же, как мы делали в предыдущих задачах.

В сообщении WM_SIZE определяем размеры окна и заполняем поля eDx и eDy

структуры XFORM. Эта точка будет началом новой системы координат.

При обработке сообщения WM_LBUTTONDOWN увеличим угол поворота системы коор-

динат angle на 45 и инициируем перерисовку окна функцией InvalidateRect().

Поскольку переменная angle — статическая, начальное значение угла 0.

В сообщении WM_PAINT определяем остальные поля структуры XFORM (они опреде-

лены в библиотеке как FLOAT). Далее получаем контекст устройства вывода, обес-

печиваем поворот системы координат функцией SetWorldTransform(), выводим

текст и графику, учитывая, что начало координат сейчас находится в центре окна.

 

114.Изменение цвета фона. Файл заголовков (resource.h).
По умолчанию Visual C++ всегда называет соответствующий файл заголовка RESOURCE.H независимо от имени файла ресурсов (например, MYAPP.RC). С помощью команды Включение ресурсов из меню Вид в Visual C++ можно изменить имя этого файла заголовка, обновив файл символов заголовка в диалоговом окне Включение наборов. С помощью команды Включение ресурсов из меню Вид в Visual C++ можно задать любое количество дополнительных файлов заголовков только для чтения в качестве директив символов только для чтения. Ограничение "только для чтения" означает, что при добавлении нового ресурса в RC-файл можно использовать символ, определенный в файле заголовка только для чтения; но при удалении ресурса символ по-прежнему останется определенным в файле заголовка только для чтения. Невозможно изменить числовое значение, присвоенное символу только для чтения.
RESOURCE.H — это зависящий от приложения файл заголовка. Мастером создания приложений ему всегда присваивается имя RESOURCE.H, что соответствует именованию файла заголовка по умолчанию в Visual C++. Оператор #include для этого файла заголовка — это первый оператор в файле ресурсов (MYAPP.RC).

#include "resource.h"

Может потребоваться включить дополнительные, доступные только для чтения файлы заголовка в следующих случаях:
Файл заголовка предоставляется внешним источником, либо требуется предоставить общий доступ к файлу заголовка из нескольких проектов или нескольких частей одного и того же проекта.
Файл заголовка имеет форматирование и комментарии, которые не нужно менять или отфильтровывать при сохранении файла в Visual C++. Возможно, к примеру, требуется сохранить оператор #define, использующий арифметические операции с символами:

#define RED 0

#define BLUE 1

#define GREEN 2

#define ID_COLOR_BUTTON 1001

#define ID_RED_BUTTON (ID_COLOR_BUTTON + RED)

#define ID_BLUE_BUTTON (ID_COLOR_BUTTON + BLUE)

#define ID_GREEN_BUTTON (ID_COLOR_BUTTON + GREEN)

 


Дата добавления: 2015-09-03; просмотров: 139 | Нарушение авторских прав


Читайте в этой же книге: То получим внутри прямоугольника эллипс. | Добавление курсоров | Добавление битовых образов | Разработка ресурсов меню и акселераторов клавиатуры. Файл заголовков (resource.h). Файл ресурсов (MENU3.RC). Файл приложения (MENU3.CPP). | Idefine IDM_AFILES 501 Idefine IDMJ3FILES 502 Idefine IDM_CFILES 503 Idefine IDM DFILES 504 | FindClose(hFindFile); | Модальные диалоговые окна и класс CDialog | Как вводить данные при помощи окон диалога | ДИАЛОГОВОЕ ОКНО ШРИФТЫ (FONTS) | Средства и методы GDI. Перья. Кисти. Изменение цветов фона. Изменение цветов текста. |
<== предыдущая страница | следующая страница ==>
Работа с битовыми образами. Функции BitBlt() и PlgBlt(). Загрузка и вывод на экран битовых образов. Обработка битовых образов при помощи функции Windows NT MaskBlt().| Норма времени на один привод, чел. ч.

mybiblioteka.su - 2015-2024 год. (0.01 сек.)