Win32 창 클래스 구조체를 헷갈리지 않는 기준
Win32 API를 처음 공부하다 보면 WNDCLASS와 WNDCLASSEX를 동시에 만나게 된다. 이름은 거의 비슷하고 코드 구조도 비슷하다. 하지만 두 구조체는 완전히 다른 기능을 가진 것이 아니라, 기존 구조체를 확장한 관계에 가깝다.
실제 학습 관점에서는 WNDCLASSEX를 먼저 이해하는 편이 이후 창 생성 과정 전체를 따라가기 쉽다.
WNDCLASS와 WNDCLASSEX는 모두 창 클래스를 등록하기 위한 구조체다
두 구조체는 모두 창 클래스를 등록하기 위한 정보 저장용 구조체다.
여기서 창 클래스는 C++ 클래스와 다르다. 앞으로 생성될 윈도우가 어떤 속성을 가질지 미리 정의한 설계도에 가깝다.
등록되는 정보는 다음과 같다.
- 메시지를 처리할 함수(
WndProc) - 아이콘
- 커서
- 배경색
- 클래스 이름
- 추가 메모리 정보
실제 Win32 흐름은 다음 순서로 진행된다.
- 창 클래스 등록
- 창 생성
- 창 표시
- 메시지 처리
이 순서를 이해하면 이후 CreateWindowEx()와 메시지 루프 구조도 이해하기 쉬워진다.
가장 큰 차이는 cbSize와 hIconSm 멤버의 존재다
실질적인 차이는 두 개의 멤버가 추가된 점이다.
| 구조체 | 추가 멤버 |
|---|---|
| WNDCLASS | 없음 |
| WNDCLASSEX | cbSize, hIconSm |
cbSize
구조체 크기를 Windows에 알려주는 멤버다.
wc.cbSize = sizeof(WNDCLASSEX);
Windows는 이 값을 확인해 구조체를 정상적으로 해석한다.
hIconSm
작은 아이콘을 지정하는 멤버다.
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
이 아이콘은 작업 표시줄이나 Alt + Tab 화면 등에서 사용된다.
두 구조체의 차이는 크지 않지만 실제 프로그램 외형에서는 영향을 줄 수 있다.
WNDCLASS는 RegisterClass와 함께 사용한다
WNDCLASS는 Win32 초기부터 사용된 구조체이며 지금도 사용할 수 있다.
WNDCLASS wc={0};
wc.lpfnWndProc=WndProc;
wc.hInstance=hInstance;
wc.lpszClassName=TEXT("MyWindow");
RegisterClass(&wc);
간단한 테스트 프로그램이나 기능이 많지 않은 예제에서는 충분히 사용 가능하다.
작은 프로그램에서는 큰 제약이 발생하지 않는다.
WNDCLASSEX는 RegisterClassEx와 함께 사용한다
현재 대부분의 Win32 예제는 WNDCLASSEX를 사용하는 경우가 많다.
WNDCLASSEX wc={0};
wc.cbSize=sizeof(WNDCLASSEX);
wc.lpfnWndProc=WndProc;
wc.hInstance=hInstance;
wc.lpszClassName=TEXT("MyWindow");
wc.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
RegisterClassEx(&wc);
구조 자체는 거의 동일하며 일부 멤버만 추가되었다.
아이콘 설정이나 확장성을 고려하면 이후 프로젝트 관리가 편해진다.
초보자도 WNDCLASSEX부터 배우는 경우가 많은 이유
실제 학습 과정에서는 구조체 자체보다 다른 부분에서 더 많이 막힌다.
예를 들면 다음과 같은 부분이다.
- 메시지 루프
- WndProc 처리 방식
- 리소스 연결
- CreateWindowEx 호출 과정
그런데 이 과정들은 서로 연결되어 있다.
창 생성 구조를 먼저 이해하면 이후 학습 속도가 빨라지는 경우가 많다.
실제로 처음 예제를 따라 작성할 때 cbSize를 빼먹는 실수도 자주 발생한다.
WNDCLASSEX wc={0};
wc.lpfnWndProc=WndProc;
RegisterClassEx(&wc);
이 경우 cbSize가 지정되지 않아 등록 실패가 발생할 수 있다.
오류 메시지가 명확하지 않아서 메시지 처리 함수 문제로 착각하는 경우도 자주 있다.
WNDCLASS와 WNDCLASSEX 선택 기준을 한 문장으로 정리하면
간단한 예제라면 WNDCLASS만으로 충분하다.
하지만 일반적인 Win32 학습이나 프로젝트 확장, 최신 예제 코드 호환성까지 고려하면 WNDCLASSEX가 더 자주 선택된다.
기능 차이는 크지 않다.
실제로는 cbSize와 hIconSm 정도가 추가된 수준이다.
다만 Win32에서는 이런 작은 차이가 이후 CreateWindowEx(), 리소스 관리, 메시지 처리 구조까지 연결되는 경우가 많다.
창 생성 흐름을 처음부터 이해해두면 이후 학습이 훨씬 편해진다.