http://tikitak.narod.ru ---- Главная страница сайта
Шаг 19 - Сдвиг графического изображения
Создание проекта
Дополняем Step1. Мы создадим метод каким передвигаются изображения скажем с Corel Draw. Нажал мышку и поташил.
Нам надо методу указанным в Шаге 16 создать класс CScreenPos.
Создаем код
Описание ScreenPos.h
class CScreenPos
{
public:
CScreenPos();
virtual ~CScreenPos();
CPoint GetPoint();
void MovePoint(CPoint cp);
private:
CPoint cpXY;
};
Реализация ScreenPos.cpp
#include "afxwin.h"
#include "ScreenPos.h"
CScreenPos::CScreenPos()
{
cpXY=CPoint(0,0);
}
CScreenPos::~CScreenPos()
{
}
CPoint CScreenPos::GetPoint()
{
return cpXY;
}
void CScreenPos::MovePoint(CPoint cp)
{
cpXY+=cp;
}
Добавляем обьявление нашего класса к Step1.cpp
..........
#include "ScreenPos.h"
Изменения в классе рамки окна.
class CMainWnd : public CFrameWnd
{
public:
.................
afx_msg void OnLButtonUp( UINT, CPoint cp);
afx_msg void OnLButtonDown( UINT, CPoint cp);
..........
private:
CScreenPos position;
BOOL blFlagMove;
CPoint TempPoint;
.............
};
Изменение в консрукторе рамки окна
CMainWnd::CMainWnd()
{
.................
blFlagMove=false;
}
Изменения в таблице откликов
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)
..............
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
..............
END_MESSAGE_MAP()
Реализация обьявленных функций.
void CMainWnd::OnLButtonDown( UINT, CPoint cp)
{
blFlagMove=true;
TempPoint=cp;
}
void CMainWnd::OnLButtonUp( UINT, CPoint cp)
{
if (blFlagMove)
{
position.MovePoint(cp-TempPoint);
Invalidate(true);
}
blFlagMove=false;
}
Изменение функции отрисовки экрана
void CMainWnd::OnPaint()
{
CMyPaintDC dc(this);
CPen MyPen(PS_DASHDOT,1,RGB(0,255,0));
dc.SetViewportOrg(position.GetPoint());
..............
}
Описание
Мы локализовали данные по координатам начала экрана в отдельном класса CScreenPos. Это удобно и я думаю правильно. В классе рамки окна и так много данных и кода.
Реализация его очень простая. В коснтрукторе устанавливаются координаты по нулям. Возврат точки, для получения координат и перемещение точки. В классе CPoint перегружены многие функции +,-,=,== и т.д. Этим я и воспользовался.
cpXY+=cp; это тоже самое, что и cpXY=cpXY+cp;. Вообще C++ обладает возможностью сделать код совершенно нечитаемым, из за многих сокращений, но это дело привычки. Вероятно это хорошая привычка, раз мы пишем на C++.
Раз мы создали класс в отдельном модуле тому кто будет его использовать необходимо обьявить о его наличии. Это мы делаем с помощью #include "ScreenPos.h".
Далее мы создали статический обьект этого класса в классе рамки окна. Так мы делали вроде часто.
Дальше идея в следующем. Когда нажимается левая кнопка мыши (вниз) происходит событие ON_WM_LBUTTONDOWN() для этого события и описана функция OnLButtonUp. Аналогично и при поднятии кнопки (вверх).
При нажатии на кнопку мы выставляем флаг нажатия и запоминаем текущее положение мыши. При отпускании вычисляем разность (смешение) и изменяем данные в классе CScreenPos. Вызываем перерисовку экрана с помощью Invalidate(true); и снимаем флаг.
После вызова функции Invalidate совершится перерисовка экрана, которая релизованна в функции OnPaint. В ней то мы и устанавливаем положение экрана с помощью функции SetViewportOrg.
У Вас должны остаться крестики от старых уроков. Потаскайте за них. Они будут следовать за курсором.
Шпаргалка
Координаты изображения устанавливаются в OnPaint
Установка производится функцией SetViewportOrg
Если координаты меняются за пределами OnPaint , обновите экран функцией Invalidate(true);
Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|