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' 카테고리의 다른 글
8. Win32 API - 윈도우의 생성과 소멸 (0) | 2024.02.24 |
---|---|
7. Win32 API - Windows 프로그램 구성 (0) | 2024.02.24 |
5. Win32 API - Event (0) | 2024.02.24 |
4. Win32 API - Message (0) | 2024.02.19 |
3. Win32 API - hInstance (0) | 2024.02.19 |