CPoint, CRect, CSize 클래스는 API에서 사용하는 구조체 타입인
POINT, RECT, SIZE 에서 파생한 클래스다.
클래스의 정의
C++ 컴파일러는 C 언어의 구조체를 클래스로 취급
예를 들어 POINT 구조체는 POINT 클래스로 간주 POINT 클래스로 파생된
CPoint 클래스는 POINT 클래스의 모든 데이터 멤버를 갖게 되므로
CPoint 객체는 POINT 객체라고 할 수 있다.
따라서 POINT 타입의 인자를 사용할 때 CPoint 객체를 대신 사용해도 상관 X
이처럼 파생 클래스 객체(CPoint)가 베이스 클래스 객체(POINT)로 간주되는 현상을
업 캐스팅(Upcasting) 이라고 함
업 캐스팅
void SomeFunc(RECT* rect){....}
RECT r1;
CRect r2;
SomeFunc(&r1); // OK!
SomeFunc(&r2); // OK! (Upcasting)
CPoint 객체 생성과 다루기
CPoint 클래스는 Long 타입의 x, y를 멤버 변수로 가짐
또 다양한 초기화 방법을 지원하고, 이 중 기본이 되고 자주 사용되는 형태는
두 개의 멤버 변수를 직접 생성자 인자로 사용하는 것
생성자
CPoint::CPoint (int x, int y);
생성자와 연산자 함수를 제외한 유일한 멤버 함수는 CPoint::Offset()으로 x, y에
일정한 값을 더하는 역할
연산자 종류 ( !=, ==, -, +, +=, -=)
예>
CPoint pt1(10, 20); // x, y 좌표를 생성자의 인자로 사용
POINT pt = {30, 40}; //포인트 객체 변수 pt
CPoint pt2(pt); //POINT 타입의 변수를 생성자의 인자로 사용
//화면에 값 출력
cout << pt1.x << "" << pt1.y << endl;
cout << pt2.x << "" << pt2.y << endl;
pt1.Offset(40, 30); //x, y 좌표에 40, 30을 각각 더한다.
pt2.Offset(20, 10); //x, y 좌표에 20, 10을 각각 더한다.
//화면에 값 출력
cout << pt1.x << "" << pt1.y << endl;
cout << pt2.x << "" << pt2.y << endl;
if(pt1 == pt2) //두객체의 내용이 같은지 확인
cout << "두 점의 좌표가 같습니다." << endl;
else
cout << "두 점의 좌표가 다릅니다." << endl;
CRect 객체 생성과 다루기
CRect 클래스는 LONG 타입의 left, top, right, bottom을 멤버 변수로 가짐
가장 기본이며 자주 사용되는 형태는 네 개의 멤버 변수를 직접 생성자의 인자로 사용 하는 것
생성자
CRect::CRect(int 1, int t, int r, int b);
또 사각형의 폭과 높이를 곧바로 얻을 수 있도록 Width(), Height() 제공
int CRect::Width();
int CRect::Height();
특정 좌표가 사각형의 내부인지 외부인지 알려주는 PtInRect()
BOOL CRect::PtInRect(POINT point);
이밖에도 30개 이상의 함수와 연산자가 정의되어 있음
MSDN 참고해서 사용하면됨
예>
CRect rect1;
rect1.SetRect(0, 0, 200, 100); //사각형의 좌표를 설정
CRect rect2(0, 0, 200, 100); //사각형의 좌표를 생성자의 인자로 사용
//두객체의 내용이 값은지 확인
if(rect1 == rect2)
cout << "두 직사각형의 좌표가 같습니다." << endl;
else
cout << "두 직사각형의 좌표가 다릅니다." << endl;
RECT rect = {100, 100, 300, 200};
CRect rect3(rect); //RECT 타입의 변수를 생성자의 인자로 사용
//사각형의 폭과 높이를 얻는다
cout << rect3.Width() << " " << rect3.Height() << endl;
CPoint pt(200, 150);
// 해당 점이 사각형 내부에 있는지 판단
if(rect3.PtInRect(pt))
cout << "점이 직사각형 내부에 있습니다." << endl;
else
cout << "점이 직사격형 외부에 있습니다." << endl;
CSize 객체 생성과 다루기
CSize 클래스는 Long 타입의 cx, cy를 멤버 변수로 가짐
여러 초기화 방법을 지원 기본이며 자주 사용되는 형태는 두 개의 멤버 변수를
직접 생성자의 인자로 사용하는 것
생성자
CSize::CSize(int x, int y);
연산자
!=, +=, -=, ==, =, +
예>
CSize size1(100, 200); //폭과 높이값을 생성자 인자로 사용
SIZE size = {100, 200};
CSize size2(size); //SIZE 타입의 변수를 생성자 인자로 사용
cout << size2.cx << " " << size2.cy << endl;
//두 객체 내용이 같은지 확인
if(size1 == size2)
cout << "크기가 같습니다." << endl;
else
cout << "크기가 다릅니다." << endl;
ps.
유틸 클래스에서 CPoint, CRect, CSize 클래스는
POINT, RECT, SIZE 클래스 파생클래스
그런데 모든 데이터 멤버를 갖고 있고
서로 같은 역할을 함 결국 파생클래스 객체가 베이스 클래스 객채로 간주 할수 있는 업캐스팅을 사용 가능