직사각형, 리전, 클리핑
직사각형으로 작업하기
* FillRect ( hdc, &rect, hBrush ) ; // 지정한 브러시로 직사각형을 채운다.
* FrameRect ( hdc, &rect, hBrush ) ; // 브러시를 이용하여 직사각형 프레임을 그리지만, 내부를 채우지 않는다.
* InvertRect ( hdc, &rect, hBrush ) ; // 직사각형 내의 모든 픽셀을 반전시킨다. (0은 1로, 1은 0으로...)
* RECT 구조체를 쉽고 깔끔하게 조작할 수 있게 해주는 9개 함수
1. SetRect ( &rect, xLeft, yTop, xRight, yBottom ); // RECT 구조체의 네 개 필드의 값 설정
2. OffsetRect ( &rect, x, y ); // 직사각형을 x,y축을 따라 일정 단위만큼 이동
3. InflateRect ( &rect, x, y ); // 직사각형의 크기를 증가, 감소
4. SetRectEmpty ( &rect ); // 직사각형의 모든 필드를 0으로
5. CopyRect ( &DestRect, &SrcRect ); // 한 직사각형을 또 다른 직사각형에 복사
6. IntersectRect ( &DestRect, &SrcRect1, &SrcRect2); // 두 직사각형의 교집합 얻기
7. UnionRect ( &DestRect, &SrcRect1, &SrcRect2); // 두 직사각형의 합집합 얻기
8. bEmpty = IsRectEmpty ( &rect ); // 직사각형이 비어 있는지 여부
9. bInRect = PtInRect (&rect, point ); // 점이 직사각형 내에 있는지 여부
PeekMessage( )
데드 타임 동안 어떻게든 제어를 얻어서 직사각형을 그리되, 프로그램의 메시지 큐에 메시지가 추가될 때만 제어를 포기!
PeekMessage( &msg, NULL, 0, 0, PM_REMOVE );
→ 이 부분의 매개변수를 0 또는 NULL로 설정하면,
프로그램의 모든 윈도우가 받는 모든 메시지를 PeekMessage()가 리턴하기 원한다는 뜻
- GetMessage( ) : 프로그램의 메시지 큐에서 메시지를 제거할 때까지 제어를 반환하지 않음.
- PeekMessage() : 메시지의 존재 유무와 관계없이 항상 곧바로 리턴.
* PeekMessage( ) 의 리턴값이 TRUE → 메시지 정상 처리
.. FALSE → 프로그램이 윈도우즈에 제어를 반환하기 전에 어떤 작업을 할 수 있다.
주의 ) While ( PeekMessage ( &msg, NULL, 0, 0, PM_REMOVE ) ) ;
▶ 이 문장은 메시지 큐에서 WM_PAINT를 제외한 모든 메시지를 제거하고 버린다.
만약 큐에 WM_PAINT 메시지가 들어 있다면, while 루프에서 영원히 빠져 나오지 못한다.
리전 생성과 그리기
- 리전(region) : 직사각형, 다각형, 타원들의 조합으로 구성된 화면 영역에 대한 기술 (description)
- 펜이나 브러시처럼 리전도 GDI 객체이다.
따라서, 생성된 모든 리전은 DeleteObject( ) 를 호출하여 삭제해야 한다.
- 리전 생성 → HRGN 타입의 리전 핸들 리턴!
- 직사각형 리전
hRgn = CreateRectRgn ( xLeft, yTop, xRight, yBottom );
또는
hRgn = CreateRectRgnIndirect ( &rect );
- 타원형 리전
hRgn = CreateEllipticRgn ( xLeft, yTop, xRight, yBottom );
또는
hRgn = CreateEllipticRgnIndirect ( &rect );
- 다각형 리전
hRgn = CreatePolygonRgn ( &point, iCount, iPolyFillMode );
댓글 없음:
댓글 쓰기