C++/summary

4장 화면출력

gandus 2010. 12. 6. 10:54

무효영역 처리


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가 없는 이유는 지역변수로 존재하기 때문에 블락을 벗어나는순간,
자동으로 소멸자가 생성된다.



 



n
SDK
—운영체제에 디바이스 컨텍스트를 요청한다.
—운영체제가 제공한 디바이스 컨텍스트를 전달 인자로
사용해 API 함수를 호출하여 출력한다.
—디바이스 컨텍스트 사용이 끝났음을 운영체제에 알린다.
nMFC
—디바이스 컨텍스트 객체를 생성한다.
—객체의 멤버 함수를 호출하여 출력한다.






디바이스 컨텍스트 클래스





//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는 이렇게 사용한다.