본문 바로가기
프로그래밍/MFC

MFC-GDI의 개념

by 리뷰하는 (게임)프로그래머_리프TV 2010. 5. 16.



API에서 GetDC라던가, BeginPaint라던가, ReleaseDC, EndPaint에 대해서,

CDC 클래스가 담당 하고 있다고 생각하면 딱히 GDI의 개념 자체는 바뀐게 없다.

WM_PAINT에서는 화면에 출력, 가려진 부분이 생기면 다시 출력 하거나 그런 부분은 모두 똑같고,

Pen이나 Brush에 대한 것도

CPen이나 CBrush 클래스에서 정보들을 가지고 있다.

OldPen이나 OldBrush를 통해서 되돌아 오는 DC의 값을 저장해 두었다가,

출력이 끝나면 다시 이전 값으로 되돌리는 작업이라던가.

BitMap을 출력할 때 MemDC를 사용해서 미리 그려 넣은 후 Dc간의 복사를 해준다거나 하는 것도

API의 GDI와 차이가 없다.

단지 그것이 클래스에서 관리하게 되었다는 것뿐?

일단 실행 화면을 먼저 보고 예제 소스를 봐보자.

왼쪽은 WM_PAINT가 아닌 부분에서 그린 것.
오른 쪽은 WM_PAINT에서 그린것

화면을 가리고 그 부분을 다시 움직여 보면,

왼쪽은 지워져 있고( 다시 그려 주지 않고 ), 오른쪽은 그대로이다( 다시 그려준다 )

왜 저러는 지는 이미 API에서 살펴 보았기 때문에 설명을 또 하진 않고,

간단하게 사용법을 훑어 보기 위해 이제 코드를 보자.

WM_LBUTTONDOWN과, WM_PAINT를 메시지 탭에서 추가한다.

//View::OnLButtonDown
	CDC* pDC = GetDC();

	pDC->Rectangle( 10, 10, 110, 110 );

	ReleaseDC( pDC );

	CView::OnLButtonDown(nFlags, point);​

LBUTTONDOWN에서는 CDC에 GetDC를 받아서 그림을 그려 주고 있고,
PAINT에서는 CPaintDC를 통해 그림을 그려 주고 있다.

특별히 어려운 부분은 없으니 그냥 넘어 가자.

//View::OnPaint
	CPen NewPen( PS_SOLID, 3, RGB( 192, 0, 0) );
	CPen* pOldPen = dc.SelectObject( &NewPen );
	CBrush NewBrush( RGB( 192, 192, 192 ) );
	CBrush* pOldBrush = dc.SelectObject( &NewBrush );
	
	dc.Rectangle( 120, 10, 220, 110 );

	dc.SelectObject( pOldPen );
	dc.SelectObject( pOldBrush );​

'프로그래밍 > MFC' 카테고리의 다른 글

MFC-도형 그리기  (0) 2010.05.16
MFC-선 그리기  (0) 2010.05.16
MFC-마우스 입력( TRACKMOUSEEVENT )  (0) 2010.05.16
MFC-새로운 클래스 추가 하기  (0) 2010.05.16
MFC-마우스입력( 드래그 & 드랍 )  (0) 2010.05.16