www.adept7.kiev.ua
| Форум| Гостевая| Ссылки| Программы| Исходные тексты| Наши партнеры.|
   
| Главная| Рассылки| Услуги| Библиотека| Новости| Авторам| Программистам| Студентам|
delphi c++ assembler
  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
 

Rambler's Top100 Rambler's Top100

©  Adept Design Studio

Используются технологии uCoz