본문 바로가기

Win32 api

Win32 api 강의 3화.

- WM_PAINT 명령이 들어오는 이유.

case WM_PAINT:  // 윈도우의 클라이언트 영역을 다시 그려야 할 때 발생하는 메시지
                // 무효화된 영역을 다시 그리기 위해 발생
                // 최소화, 최대화, 복원, MoveWindow, SetWindowPos, ShowWindow 등으로 인해 발생
                // BeginPaint와 EndPaint 사이에 그리기 코드를 넣음
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hWnd, &ps);
        // TODO: 여기에 hdc를 사용하는 그리기 코드를 추가합니다...

        Rectangle(hdc, 50, 50, 200, 200);

        EndPaint(hWnd, &ps);
    }
    break;

해당 블럭 사이에 F9 로 중단점을 걸고 실행해봄.

처음 실행할 때 걸리고, 그 이후로 걸리지 않음. 다른 프로그램의 윈도우로 가려도 해당 명령이 실행되지 않는다.

옛날에는 다른 윈도우에 의해 가리는 것으로 무효화 영역이 발생했다고 하는데, 지금은 최적화된 듯.

 

프로그램의 윈도우가 화면 밖으로 벗어나거나, 최소화 최대화 했을 때 등에 발생하는 것을 확인함.

 

- 윈도우 핸들에 대한 설명.

윈도우즈 운영체제의 핵심은 윈도우(창)이다. CreateWindowW() 함수를 통해서 생성되는 이 창은

HWND 라는 윈도우를 식별하는데 사용되는 고유한 값을 리턴한다. 윈도우에 대한 핸들을 말함.

 

Windows 운영체제 Kernel 단에서 다루는 중요 오브젝트임. 따라서 우리는 이 윈도우를 직접 다룰 수 없고, HWND 라는 핸들을 가지고 api 를 통해 다뤄야 함.

 

HDC 도 마찬가지로 Device Context 에 대한 핸들이다. 핸들이 붙으면 대부분 운영체제에서 관리하는 오브젝트이고, 우리는 그것에 대한 핸들만을 사용하게 된다.

 

이러한 H~로 시작하는 핸들 타입들은 F12 눌러서 찾아보면

#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name

이런 전처리기 명령에 의해 단순 int 값 구조체임을 확인할 수 있다.

 

이렇게 단순한 구조체인 자료형을 HWND, HBRUSH, HDC 등 수많은 자료형으로 구분하는 것은

윈도우즈 개발자들의 실수를 줄이고 가독성, 컴파일 안정성 등을 높이기 위한 의도라고 보임.

 

- Device Context 에 대한 설명

그리기 작업에 필요한 정보를 담고 있는 구조체.

그리기 색상, 폰트, 펜, 브러시 등의 정보가 포함. 

'Win32 api' 카테고리의 다른 글

Win32 api 강의 6화.  (0) 2025.09.11
Win32 api 강의 5화.  (0) 2025.09.11
Win32 api 강의 4화.  (0) 2025.09.10
Win32 api 강의 2화.  (0) 2025.09.09
Win32 api 강의 1화.  (0) 2025.09.09