2009년 11월 6일 금요일

5_6 직사각형, 리전, 클리핑

직사각형, 리전, 클리핑

 

 

직사각형으로 작업하기

*  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 );  

댓글 없음:

댓글 쓰기