Читайте также:
|
|
Еще одна функция 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 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Работа с битовыми образами. Функции BitBlt() и PlgBlt(). Загрузка и вывод на экран битовых образов. Обработка битовых образов при помощи функции Windows NT MaskBlt(). | | | Норма времени на один привод, чел. ч. |