본문 바로가기

Win32 API

6. Win32 API - WindowClass

Window Class

정의

  • Windows API에서 GUI 응용 프로그램을 작성하는데 사용되는 기본적인 구성 요소 중 하나입니다.
  • 각 Winodw Class는 특정한 형태의 동작을 가지며, 이를 기반으로 윈도우 인스턴스를 생성하여 화면에 GUI 요소를 표시합니다.

 

Window Class의 사용 이유

  • 동일한 디자인 패턴과 동작을 갖는 여러 윈도우를 생성할 수 있습니다.
  • 일관된 패턴을 가지면서 코드를 재사용할 수 있고 이를 통해 많은 Resource들을 절약할 수 있습니다.
  • Windows API는 Window Class를 이용하여 윈도우를 생성하고 관리하게 됩니다. 따라서 윈도우 클래스를 사용하면 Windows API와의 효율적인 통합이 가능해집니다.

Window Class 구성 정보

구조체 형태

typedef struct tagWNDCLASSW {
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCWSTR     lpszMenuName;
    LPCWSTR     lpszClassName;
} WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;

typedef WNDCLASSW WNDCLASS;

 

구조체 형태 설명

 

WNDCLASSA(winuser.h) - Win32 apps

RegisterClass 함수에 의해 등록된 창 클래스 특성을 포함합니다. (ANSI)

learn.microsoft.com

 

Window Class의 사용

WindowClass의 생성

int APIENTRY WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance
    , _In_ LPSTR lpszCmdParam, _In_ int nCmdShow)
{
    WNDCLASS WndClass;

    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    //WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // 메인화면.
    WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    WndClass.hInstance = hInstance;
    WndClass.lpfnWndProc = WndProc;
    WndClass.lpszClassName = lpszClass;
    WndClass.lpszMenuName = NULL;
    WndClass.style = CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&WndClass);

    hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, (HMENU)NULL, hInstance, NULL);
     //... 생략   
}
  • WNDCLASS WndClass;: WNDCLASS 구조체의 인스턴스인 WndClass를 선언합니다. 이 구조체는 윈도우 클래스를 정의하는 데 사용됩니다.
  • WndClass.cbClsExtra = 0;: 클래스의 여분의 메모리(Extra Class Memory) 크기를 지정합니다. 현재는 사용하지 않으므로 0으로 설정합니다.
  • WndClass.cbWndExtra = 0;: 윈도우 인스턴스의 여분의 메모리(Extra Window Memory) 크기를 지정합니다. 현재는 사용하지 않으므로 0으로 설정합니다.
  • WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);: 윈도우의 배경색을 설정합니다. 여기서는 COLOR_WINDOW를 기반으로 한 특정 브러시를 사용하여 메인 화면의 배경을 지정합니다.
  • WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);: 윈도우에 사용될 커서를 지정합니다. 여기서는 기본 화살표 커서를 사용합니다.
  • WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);: 윈도우의 아이콘을 설정합니다. 여기서는 기본 응용 프로그램 아이콘을 사용합니다.
  • WndClass.hInstance = hInstance;: 현재 실행 중인 인스턴스의 핸들을 지정합니다. 일반적으로 윈도우를 생성하는 응용 프로그램의 인스턴스 핸들이 여기에 사용됩니다.
  • WndClass.lpfnWndProc = WndProc;: 윈도우 프로시저의 포인터를 지정합니다. WndProc 함수는 윈도우 이벤트를 처리하는 함수로 사용됩니다.
  • WndClass.lpszClassName = lpszClass;: 윈도우 클래스의 이름을 설정합니다. lpszClass는 미리 정의된 문자열로 클래스의 고유한 이름을 나타냅니다.
  • WndClass.lpszMenuName = NULL;: 윈도우 클래스에 연결된 메뉴의 이름을 설정합니다. 여기서는 메뉴를 사용하지 않으므로 NULL로 설정합니다.
  • WndClass.style = CS_HREDRAW | CS_VREDRAW;: 윈도우 클래스의 스타일을 설정합니다. 여기서는 가로 및 세로 크기가 변경될 때 다시 그리도록 하는 스타일을 설정합니다.
  • RegisterClass(&WndClass);: 앞서 정의한 윈도우 클래스를 등록합니다. 등록된 클래스를 기반으로 윈도우 인스턴스를 생성할 수 있습니다.
  • CreateWindow : 생성된 윈도우 클래스를 이용하여 윈도우를 생성합니다.

 

참조

win32 API

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