무효영역 처리
Hello SDK 예제
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 100, 100, str, lstrlen(str));
EndPaint(hwnd, &ps);
return 0;
Begin - End 는 항상 쌍으로 존재한다.
end를 하지 않는다면 무효영역 처리 마친줄 모르고
계속해서 페인트를 한다.
MFC예제
void CMainFrame::OnPaint()
{
char *msg = "Hello, MFC";
CPaintDC dc(this);
dc.TextOut(100, 100, msg, lstrlen(msg));
}
여기는 Begin - End 가 존재하지 않는다.
여기서는 생성자로 만들어 준다, 멤버함수로 DC가 존재한다.
그리고 핸들이없는데, 이것 역시 객체안에 핸들이 존재한다.
end가 없는 이유는 지역변수로 존재하기 때문에 블락을 벗어나는순간,
자동으로 소멸자가 생성된다.
nSDK
사용해 API 함수를 호출하여 출력한다.
디바이스 컨텍스트 클래스
//CPaintDC 예제
void CChildView::OnPaint()
{
CPaintDC dc(this);
dc.Rectangle(0, 0, 200, 100);
dc.Ellipse(200, 100, 500, 200);
}
//CClitent DC를 한다, 하지만 문제점이 존재한다.
// CPoint point는 왼쪽버튼 누른 위치
void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
CClientDC dc(this);
// 위치를 기준해서 40 40 사각형을 생성한다.
dc.Rectangle(point.x-20, point.y-20, point.x+20, point.y+20);
}
--> 이것은 언제든지 페인트 메시지를 받으면 다 지워져 버린다.
--> OnPaint에 추가를 해야된다. 아니면 지속력이 없다.
--> 누른위치가 오는 포인트 좌표를 배열에 담는다. 클릭한 위치를
--> invalied 를 해서, 배열에 위치를 받아서 다시 찍어낸다.
클래스 위자드.( 2008은 클래스 뷰에서 속성을 조정해야한다. )
W : OnLButtonDown
W : OnPaint -> wm_paint 다시 그릴때
V : PreCreateWindo -> oncreate전에
w는 윈도우 메시지 처리 핸들러를 가진다.
v는 가상 함수를 말한다.
이것들은 자동으로 만들어준다.
그리기 함수
선을 그을라면
시작점은 moveto 끝점은 lineto 로한다.
GetCliendRect( &rect ) 는 view 클래스의 멤버 함수라서 Cwnd의 멤버함수
굳이 아무것도 붙이지 않는다.
mfc 전역함수는 afx로 시작.
:: 이게 붙으면 api함수.
roundrect는 이렇게 사용한다.