이제 어떤 방법으로 화면에 표시된 사각형들이 깜빡이지 않고 출력되는지 코드를 자세히 살펴보겠습니다.
다른 부분들은 이미 이전에 설명을 했으니 void DrawIMG() 함수만을 조금 더 자세히 살펴보겠습니다.
RECT crt;
현재 윈도우 클라이언트 영역의 크기를 저장할 RECT를 선언합니다.
GetClientRect ( _hWnd , &crt);
윈도우 클라이언트의 영역의 좌표를 가져옵니다 .
클라이언트는 영역의 왼쪽 위 모서리의 좌표는 0, 0으로 지정됩니다.
BOOL WINAPI GetClientRect( _In_ HWND hWnd, _Out_ LPRECT lpRect ); |
매게 변수 |
의미 |
hWnd |
좌표를 검색할 클라이언트의 핸들 값을 지정합니다. |
lpRect |
클라이언트의 좌표를 저장한 RECT 구조에 대한 포인터를 입력합니다. 왼쪽 및 상단은 0 , 0으로 저장되고 우측 및 하단은 윈도우의 폭과 높이가 저장됩니다. |
만약 윈도우에서의 좌표를 가져오려면 GetWindowRect 함수를 사용하면 됩니다.
hdc = GetDC( _hWnd);
특정 윈도우의 클라이언트 영역 또는 전체 스크린에 대한 DC값을 가져와 대입합니다.
이렇게 가져온 핸들값은 GDI에 반환된 후에 사용할 수 있습니다.
HDC GetDC( _In_ HWND hWnd ); |
매게 변수 |
의미 |
hWnd |
사용할 DC의 윈도우의 핸들값을 입력합니다. 이 값이 NULL 일 경우 전체 화면의 DC를 검색합니다. |
WM_PAINT에서 hdc = BeginPaint(hWnd, &ps);와 완벽 동일한 부분이며 PAINTSTRUCT 매게 변수만
없을 뿐입니다. BeginPaint를 통한 DC의 핸들값은 WM_PAINT에서만 구할 수 있고, 다른 메세지에서의 DC의 핸들값은 GetDC 함수를 통해 구해야 합니다.
FillRect(hMemDC , &crt , GetSysColorBrush (COLOR_WINDOW));
지정된 브러쉬를 사용하여 사각형을 채웁니다.
브러쉬 핸들을 인자값으로 전달하기 떄문에 따로 브러쉬를 먼저 설정하지 않아도 됩니다.
경계선을 그리지 않아 배경색과 동일한 브러시를 사용하면, 이미 출력된 내용을 삭제하는 용도로 사용할
수 있습니다. InvalidateRect( _hWnd , NULL ,TRUE);와 비슷한 효과를 가집니다.
int FillRect( _In_ HDC hDC,
_In_ const RECT *lprc,
_In_ HBRUSH hbr
); |
매게 변수 |
의미 |
hDC |
DC의 핸들값을 입력합니다. |
*lprc |
좌표를 포함한 RECT 구조에 대한 포인터를 입력합니다. |
hbr |
사용할 브러시의 핸들값을 지정합니다. 이 값에는 CreateHatchBrush, CreatePatternBrush, 또는 CreateSolidBrush , GetStockObject를 사용할 수 있습니다. |
* GetSysColorBrush
지정된 색에 대응하는 인덱스를 브러시핸들에서 검색합니다.
HBRUSH GetSysColorBrush( _In_ int nIndex
); |
매게 변수 |
의미 |
nIndex |
컬러 인덱스를 입력합니다. 시스템 색상은 GetSysColor를 참조하면 됩니다. https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms724371(v=vs.85).aspx |
위에서는 윈도우의 색상을 선택하는 COLOR_WINDOW 값을 사용하였습니다.
ReleaseDC ( _hWnd , hdc);
GetDC와 쌍으로 사용하는 함수입니다.
GetDC 함수로 DC 핸들을 구해 GDI 함수를 호출하고 사용이 끝난 후에는 반드시 해제해주어야 합니다.
(단 , 클래스 DC나 Private DC의 경우 해제해주지 않아도 됩니다. - 소멸자에서 해제되기 때문입니다.)
설명은 생략합니다.
InvalidateRect( _hWnd , NULL ,FALSE);
기존에 사용했던 화면을 다시 그리는 용도와 동일합니다.
다만, 끝에 매게 변수가 기존에 TRUE 반면에 FALSE 입니다. FillRect 함수를 통해 이미 다시 그렸기
때문입니다.(배경을 다시 그릴 필요가 없으므로) 해당 부분이 TRUE이면 또 InvalidateRect를 통해 다시
그리기 때문에 깜빡이게 됩니다.
'프로그래밍 관련 > Win API' 카테고리의 다른 글
WIndows API - #10-1 그래픽 처리 - (맵핑 - 윈도우 좌표) (0) | 2015.10.10 |
---|---|
WIndows API - #9-7 그래픽 처리 - (여러개의 DC 이미지 출력하기) (2) | 2015.10.09 |
WIndows API - #9-5 그래픽 처리 - (더블 버퍼링)(1) (0) | 2015.09.07 |
WIndows API - #9-4 그래픽 처리 - (비트맵 출력)(2) - 코드 살펴보기 (0) | 2015.09.06 |
WIndows API - #9-3 그래픽 처리 - (비트맵 출력) (1) (0) | 2015.09.06 |