본문 바로가기

공부/MFC

Visual C++ 2008 MFC Chapter 7 GDI - 1

페이지수가 아마 젤 많은. GDI관련 내용.

DC는 Device Context 의 준말이다 

프로젝트 제목은

RedrawDemo 로 하고 다음의 코드를

클래스 뷰 -> 메시지 핸들러 함수를 추가한 뒤

아래와 같이 코드를 짜면


///////////////////////////////////////////////////////////////////////
void CRedrawDemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.


CDC* pDC = GetDC(); //DC를 얻는다

pDC->Rectangle(10,10,110,110); //주어진 좌표에 네모를 그린다.

ReleaseDC(pDC); //DC를 반환한다.



CView::OnLButtonDown(nFlags, point);
}
////////////////////////////////////////////////////////////////////////////

윈도우 내부에서 마우스 클릭시에 사각형이 그려진다. 

하지만 이 사각형은 다른 윈도우에 가려지거나

화면 밖으로 갈 경우 그림이 가려진 채 복구가 되지 않는다.[다시 클릭을 하면 그려지긴 한다.]

또한 윈도우의 크기를 변경하면 삭제되어버리기도 한다.

 

 
이 문제를 해결하기 위해서

WM_PAINT 메시지 핸들러 함수를 뷰 클래스에 등록하여 다음과 같은 코드를 추가 수정해주면.


void CRedrawDemoView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
// 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.

dc.Rectangle(120,10,220,110);

}
/////////////////////////////////////////////////////////////////


 
처음 작성했던 사각형과 달리 계속 그 모양이 유지되는 사각형이 그려지게 된다. 

이는  OnPaint 함수에 그 코드가 있기 때문에 지속적으로 화면에 다시그려지기 때문이다.

위의 코드와 아래 코드에서의 차이점은 위는 DC를 할당하거나 반환하는 코드가 있는 반면 아래에서는

CPaintDC 로 쓰여있다.

이는 OnPaint()함수 내부에 이미 들어있는 코드이기 때문이므로 없다고 해서 어리둥절 해 할 필요는 없다. 

 
/////////////////////////////////////////////

 CDC 클래스

 
CClientDC  : 윈도우의 클라이언트 영역으로 한정되는 DC입니다.

CWindowDC : 윈도우의 모든 영역(비 클라이언트 영역 포함) 에 대한 DC입니다. 이 DC를 이용하면 다른 윈도우에 대해서 그리기가 가능합니다. 

CPaintDC :  CClientDC 클래스와 유사하지만, 내부적으로 BeginPaint()/EndPaint() 함수를 호출하여 WM_ERASEBKGND  메시지가 발생한다는 것이 다릅니다.[?? 뭔메시지인지는 모르겠으면 비쥬얼 C++에서 클래스뷰를 통해 알아봅시다. [ - 창 배경을 지워야 함을 알려주는 메시지 핸들러  -]

CMetaFileDc : WMF(Window Meta File)와 EMF(Enhanced Meta File) 파일에 대한 DC입니다.
 

WMF와 EMF?



다른 설명