WNDCLASS와 WNDCLASSEX 차이

Win32 창 클래스 구조체를 헷갈리지 않는 기준

Win32 API를 처음 공부하다 보면 WNDCLASSWNDCLASSEX를 동시에 만나게 된다. 이름은 거의 비슷하고 코드 구조도 비슷하다. 하지만 두 구조체는 완전히 다른 기능을 가진 것이 아니라, 기존 구조체를 확장한 관계에 가깝다.

실제 학습 관점에서는 WNDCLASSEX를 먼저 이해하는 편이 이후 창 생성 과정 전체를 따라가기 쉽다.

WNDCLASS와 WNDCLASSEX는 모두 창 클래스를 등록하기 위한 구조체다

두 구조체는 모두 창 클래스를 등록하기 위한 정보 저장용 구조체다.

여기서 창 클래스는 C++ 클래스와 다르다. 앞으로 생성될 윈도우가 어떤 속성을 가질지 미리 정의한 설계도에 가깝다.

등록되는 정보는 다음과 같다.

  • 메시지를 처리할 함수(WndProc)
  • 아이콘
  • 커서
  • 배경색
  • 클래스 이름
  • 추가 메모리 정보

실제 Win32 흐름은 다음 순서로 진행된다.

  1. 창 클래스 등록
  2. 창 생성
  3. 창 표시
  4. 메시지 처리

이 순서를 이해하면 이후 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가 더 자주 선택된다.

기능 차이는 크지 않다.

실제로는 cbSizehIconSm 정도가 추가된 수준이다.

다만 Win32에서는 이런 작은 차이가 이후 CreateWindowEx(), 리소스 관리, 메시지 처리 구조까지 연결되는 경우가 많다.

창 생성 흐름을 처음부터 이해해두면 이후 학습이 훨씬 편해진다.