9.19(수) 이론-1

from Study/API 2007/10/10 19:20 view 15746
1. 무효화 영역과 WM_PAINT

  1) 무효환 영역 ? 윈도우가 다른 윈도우에 가려 있다가 앞으로 나올 때 다시 그려야 하는 영역
  2) size 조절시 윈도우 전체가 무효화 : 윈도우 클래스에 CS_HREDRAW | CS_VREDRAW style을 줘야함.
  3) InvalidateRect() : 사용자가 윈도우의 특정영역을 무효화 한다. TRUE or FALSE(강추!!)

2. 무효화 영역 발생시 OS가 하는일

  1) WM_PAINT 메시지를 전달한다.( OS가 Application에 전달, App는 무효화영역을 기억해야 한다. )
  2) 메시지 Q에  QS_PAINT 형태로 flag가  1일때 GetMessage 로 꺼내온다.
  3) ValidateRect 나 BeginPaint 로 유효화영역으로 바뀌게 되면 flag 는 0 이된다.
  4) BeginPaint : Caret 숨김, 유효화 영역.. 기본적으로 해야 하는것들을 해준다.
 
3. 화면떨림방지( Flicker 방지 )
 
  1) RECT rc = ps.rcPaint;  // 무효화 영역의 크기를 받아서 꼭 필요한 곳만 그릴 수 있다.
  2) 더블 버퍼링 ( 좌표 대신에 비트맵으로 보관해 놓는다. ) ***해결책**
  3) 무효화 영역을 꼭 지워야 할까 ?
    - wc.hbackground = 0; // 윈도우 클래스의 백그라운드색을 0으로 해놓는다.
    - 배경을 지우라는 메시지를 가로채서 WM_ERASEBKGND 아무일도 못한게 한다.

4. 알아 둘 것.

  1) 항상 윈도우에 보여주고 싶다면 WM_PAINT 내에서 호출한다.
  2) 출력을 Update 하고 싶다면 무효화 영역을 만들어야 한다. InvalidateRect
  3) 화면에 즉시 뿌리고 싶다면
    - UpdateWindow() => if( msgQ has WM_PAINT ) WndProc( HWND, WM_PAINT )


1. GDI Object
 
  1) 생성 => 선택 => 선택해지 => 파괴 의 순서를 지켜야 한다.
  2) SelectObject( Createxxx() )
  3) DeleteObject( SelectObject() )
  4) StockObject 는 OS가 미리 만들어 놓은 Object 이므로 GetStockObject로 얻은 것은 파괴하면 안된다!!!
 
2. Region

  1) 영역 생성             CreatexxxRgn()   // 다양한 모양이 생성가능
  2) 영역 합치기          CombineRgn()     // RGN_AND,RGN_COPY 등 다양한 모드 지원
  3) 적용 하기             SetWindowRgn()
  4) 영역 해지             DeleteObject()

3. 그리기 모드

  1) 선의 색은 배경색과 DC의 PEN의 색을 비트연산하여 나오는 것이다.( | , & )
  2) a | 흰색(1111)  => 흰색 , a & 흰색(1111) => a  // 어떤 연산을 할 것인지를 정하는게 그리기모드의 핵심!!
  3) R2_NOT 은 bending 효과를 구현 할 수 있다. 선잡고 움직이기.

2007/10/10 - [Study/API] - 9.19(수) 실습-1
2007/10/10 - [Study/API] - 9.19(수) 실습-2

Tag | ,

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다