Шаг 152 - Много элипсов шаг 1

Мы как то с Вами всегда делали шаги с одним элементом.
Настало время попробовать, а как же работать с несколькими элементами.
Мы будет создавать приложение, которое будет рисовать серию эллипсов,
сохранять их на диск и читать файл.

Главное здесь решить где хранить данные. Я, например, предлагаю с классе CArray - нормальный класс и хранить можно. Только для удобства я думаю необходимо создать промежуточный класс. Этот класс обеспечит нас функциями, которые необходимы именно нам, часть из них будет повторять функции CArray, часть будет наша. Итак Вы можете взять проект для экпериментов из прошлого шага. Я делал именно так. Переделывал предыдущий проект.

Создадим новый класс. Как добавлять классы уже писалось. Это просто класс (Generic) с именем CContainerEllipce.

А вот и его описание.

#include "afxtempl.h"
 
class CContainerEllipce  
{
public:
	int FindEllipce(CPoint cp);	  // найти элипс по точке в него входящей
	void Clear();		   	  // Очистить массив элипсов
	void SetData(int x, CRect cr);    // Изменить данные
	int GetSize();			  // молучить размер массива
	CRect Get(int x);		  // Получить данные о элипсе
	void Draw(CDC *pDC);		  // Наримовать элипс в контексте устройства
	void Add(CRect cr);               // Добавить элипс
	CContainerEllipce();              // просто конструктор
	virtual ~CContainerEllipce();     // деструктор
private:
 CArray arrayEllipce;	  // контейнер с этипсами
};
Как видите, я объявил свой контейнер arrayEllipce. И необходимые функции. Они вроде как подписаны. Давайте посмотрим реализацию.
// ContainerEllipce.cpp: implementation of the CContainerEllipce class.
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "TestEllipse.h"
#include "ContainerEllipce.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CContainerEllipce::CContainerEllipce()
{

}

CContainerEllipce::~CContainerEllipce()
{

}

void CContainerEllipce::Add(CRect cr)
{
 arrayEllipce.Add(cr); 
}

void CContainerEllipce::Draw(CDC *pDC)
{
for (int x=0;x < arrayEllipce.GetSize();x++) 
	pDC->Ellipse(arrayEllipce.GetAt(x)); 
}

CRect CContainerEllipce::Get(int x)
{
 return arrayEllipce.GetAt(x); 
}

int CContainerEllipce::GetSize()
{
 return arrayEllipce.GetSize() ; 
}

void CContainerEllipce::SetData(int x,CRect cr)
{
 arrayEllipce[x]=cr;
}

void CContainerEllipce::Clear()
{
 arrayEllipce.RemoveAll(); 
}

int CContainerEllipce::FindEllipce(CPoint cp)
{
for (int x=0;x < arrayEllipce.GetSize();x++) 
	if (arrayEllipce[x].PtInRect(cp)) return x;  
return -1;
}

В основном это повтор стандартных функций CArray, только добавлена функция FindEllipce эта функция позволяет пробегать по всем данным и использовать PtInRect для определения нахождение точки внутри прямоугольника ограничивающего эллипс. Если точка входит в прямоугольник, то возвращается позиция. Если нет то -1. Вот она какая.

BOOL PtInRect( POINT point ) const;

Так же есть функция Draw, она пробегает по всему массиву и отрисовывает эллипс на контексте устройства переданного в параметрах.

Обратите внимание, что я иногда пользуюсь просто [], а иногда GetAt, что совершенно идентично и показано для разнообразия.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 16.03.2000