100 likes | 254 Views
WM_PAINT 메세지. 어떤 윈도우가 다른 원도우 밑에 있게 되면 , 깔린 부분이 지워지게 됨 대책 : 다시 그려주어야 됨 Window XP 가 WM_PAINT 메시지를 발생시킴 WM_PAINT 메시지 처리 routine OnPaint 함수 OnDraw 함수 CView class 에만 있음 일반적으로 OnDraw 함수에서 그림. 지워짐. 왼쪽 마우스 click 예제 프로그램. 예제 : 왼쪽 마우스를 click 하면 그 지점에 사각형을 그리는 프로그램
E N D
WM_PAINT 메세지 • 어떤 윈도우가 다른 원도우 밑에 있게 되면, 깔린 부분이 지워지게 됨 • 대책 : 다시 그려주어야 됨 • Window XP가 WM_PAINT 메시지를 발생시킴 • WM_PAINT 메시지 처리 routine • OnPaint 함수 • OnDraw 함수 • CView class 에만 있음 • 일반적으로 OnDraw 함수에서 그림 지워짐
왼쪽 마우스 click 예제 프로그램 • 예제 : 왼쪽 마우스를 click하면 그 지점에 사각형을 그리는 프로그램 • WM_LBUTTONDOWN 메시지 처리 • OnLButtonDown 함수에서 처리 (View Class Wizard 사용) • OnDraw 함수는 이미 존재함 class 조심 : CView class 선택
왼쪽 마우스 click 예제 프로그램 • Version 0.3 : OnDraw 함수에서 그려야 되는 것은? void CTest2View::OnLButtonDown(UINT nFlags, CPoint point) { CClientDC dc(this); dc.Rectangle(point.x-10,point.y -10,point.x+10,point.y+10); CView::OnLButtonDown(nFlags, point); } void CTest2View::OnDraw(CDC* pDC) { CTest2Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here 여기에 다시 그리는 프로그램이 와야 됨 } CDC가 인수로 넘어옴
V0.7: 왼쪽 마우스 click 예제 프로그램 • Version 0.7 : 전역변수의 사용 CPoint m_p; void CTest2View::OnLButtonDown(UINT nFlags, CPoint point) { CClientDC dc(this); dc.Rectangle(point.x-10,point.y -10,point.x+10,point.y+10); m_p = point; CView::OnLButtonDown(nFlags, point); }
왼쪽 마우스 click 예제 프로그램 • Version 0.7 : 전역변수의 사용 • CDC가 인수로 넘어옴으로 다음과 같이 device context를 선언할 필요가 없음 void CTest2View::OnDraw(CDC* pDC) { CTest2Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDC->Rectangle(m_p.x-10,m_p.y -10,m_p.x+10,m_p.y+10); } CClientDC dc(this);
V0.7.1 왼쪽 마우스 click 예제 프로그램 • Version 0.7.1 : member 변수의 사용 • class view 에서 오른쪽 마우스 click class CTest2View : public Cview { public: CPoint m_p; XXXview.h 파일에 멤버변수가 추가됨
왼쪽 마우스 click 예제 프로그램 • Version 0.8 : 그리는 부분을 한 곳에 모아둠 • 멤버 변수 (m_p) 및 멤버함수 (my_draw) 사용 void CTest2View::my_draw(void) { // 그리는 부분을 여기에 추가하면 됨 }
V0.8: 왼쪽 마우스 click 예제 프로그램 • Version 0.8 : void CTest2View::my_draw(CPoint point) { CClientDC dc(this); dc.Rectangle(point.x-10,point.y -10,point.x+10,point.y+10); } void CTest2View::OnLButtonDown(UINT nFlags, CPoint point) { m_p = point; my_draw(); CView::OnLButtonDown(nFlags, point); } void CTest2View::OnDraw(CDC* pDC) { CTest2Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); my_draw(); }
V1.0 왼쪽 마우스 click 예제 프로그램 • Invalidate 함수 (member function) • WM_PAINT를 강제로 발생시킴 Invalidate(); void CTest2View::OnLButtonDown(UINT nFlags, CPoint point) { m_p = point; CView::OnLButtonDown(nFlags, point); Invalidate(); } void CTest2View::OnDraw(CDC* pDC) { CTest2Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDC->Rectangle(m_p.x-10,m_p.y -10,m_p.x+10,m_p.y+10); }
여러 개의 점을 그릴 때 • 멤버변수 • 멤버변수배열을 사용하여 위치값을 저장해야 됨 • int count • CPoint pt[50] void CTest2View::OnLButtonDown(UINT nFlags, CPoint point) { pt[count] = point; ++count; CView::OnLButtonDown(nFlags, point); Invalidate(); }