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) 무효환 영역 ? 윈도우가 다른 윈도우에 가려 있다가 앞으로 나올 때 다시 그려야 하는 영역
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 효과를 구현 할 수 있다. 선잡고 움직이기.
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