오늘도 API에 대한 수업을 들었다.
1. ATOM 및 MyRegisterClass
- ATOM: 16비트 크기의 정수 값으로, 특정 데이터를 고유하게 식별할 수 있는 ID로 사용. 문자열을 고유 ID로 변환 가능
- MyRegisterClass 함수: 애플리케이션의 윈도우 클래스 정보를 등록
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW wcex; // 윈도우 클래스 구조체 선언.
wcex.cbSize = sizeof(WNDCLASSEX);
// 구조체 크기를 설정. RegisterClassExW에서 구조체를 읽기 위해 필요.
wcex.style = CS_HREDRAW | CS_VREDRAW;
// 윈도우 스타일 지정.
// CS_HREDRAW: 가로 크기 변경 시 전체 화면 다시 그리기.
// CS_VREDRAW: 세로 크기 변경 시 전체 화면 다시 그리기.
wcex.lpfnWndProc = WndProc;
// 윈도우 프로시저 함수 포인터 설정. 윈도우 메시지 처리 담당.
wcex.cbClsExtra = 0;
// 클래스에 추가적인 메모리를 할당하지 않음.
wcex.cbWndExtra = 0;
// 윈도우에 추가적인 메모리를 할당하지 않음.
wcex.hInstance = hInstance;
// 애플리케이션의 인스턴스 핸들 지정.
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT1));
// 애플리케이션 아이콘 설정. 리소스에서 아이콘 로드.
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
// 기본 마우스 커서를 화살표로 설정.
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
// 윈도우 배경색 설정. 기본 윈도우 배경색 사용.
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT1);
// 메뉴 리소스 이름 지정. 리소스에서 메뉴 정보를 로드.
wcex.lpszClassName = szWindowClass;
// 윈도우 클래스 이름 설정. CreateWindowW에서 동일 이름을 사용해야 함.
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
// 작은 아이콘 설정. 작업 표시줄이나 Alt+Tab 전환 시 사용.
return RegisterClassExW(&wcex);
// 설정한 윈도우 클래스를 등록. 성공 시 고유 ATOM 값을 반환.
}
2. LoadString 및 문자열 포인터
- LoadString: 리소스에서 문자열을 읽어오는 함수
- LoadStringA: 멀티바이트 문자열 (ANSI, 일반 char)
- LoadStringW: 유니코드 문자열 (wchar_t)
- LoadString: _UNICODE 설정에 따라 A 또는 W 함수로 변환
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_WINDOWSPROJECT1, szWindowClass, MAX_LOADSTRING);
- 문자열 및 포인터 종류
- LPSTR: char* (ASCII 문자열의 포인터)
- LPWSTR: wchar_t* (유니코드 문자열의 포인터)
- LPCWSTR: const wchar_t* (읽기 전용 유니코드 문자열)
- TCHAR: _UNICODE 여부에 따라 char 또는 wchar_t 결정
3. WndProc 및 호출 규약
- WndProc: 운영체제에서 신호를 처리하는 콜백 함수
호출 규약
- stdcall: 운영체제가 사용하는 표준 호출 규약
- 인자를 오른쪽부터 왼쪽으로 스택에 전달
- 스택 정리는 호출된 함수(Callee)가 수행 - cdecl: C API에서 많이 사용, 스택 정리는 호출자(Caller)가 수행
4. InitInstance 함수
- 윈도우를 생성하고 초기화
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // 전역 변수에 인스턴스 핸들 저장.
HWND hWnd = CreateWindowW(
szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
nullptr, nullptr, hInstance, nullptr);
if (!hWnd) return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
주요 매개변수:
- szWindowClass: 윈도우 클래스 이름, MyRegisterClass에서 등록된 고유 ID
- szTitle: 윈도우 제목.
- WS_OVERLAPPEDWINDOW: 기본 윈도우 스타일 (확대/축소/닫기 버튼 포함)
- CW_USEDEFAULT: 창의 위치나 크기를 자동 조정
5. 리소스 및 매크로
- MAKEINTRESOURCE: 정수를 리소스 관리 함수와 호환되는 포인터로 변환, 리소스의 이름 대신 사용
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT1));
6. 유니코드 문자열
- 유니코드 문자열은 L 접두어를 붙여 생성 ( WCHAR )
L"Sample Text"
- _UNICODE 매크로 설정에 따라:
- TEXT("Sample Text") → 유니코드(L) 문자열 또는 일반 문자열로 변환
7. CreateWindowW
- 윈도우를 생성
HWND hWnd = CreateWindowW(
szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
nullptr, nullptr, hInstance, nullptr);
- 매개변수:
- X, Y 위치: CW_USEDEFAULT로 설정하면 창이 겹치지 않도록 자동 조정
- Width, Height: 창의 크기 지정. CW_USEDEFAULT 사용 시 자동 조정
요약
- MyRegisterClass
- 윈도우 클래스 등록, 고유 ID(szWindowClass) 설정
- LoadString
- 리소스에서 문자열 읽기. _UNICODE 설정에 따라 A 또는 W 사용
- WndProc
- 운영체제가 사용하는 표준 함수. stdcall 호출 규약
- InitInstance
- 윈도우 생성 및 초기화. 고유 ID(szWindowClass)와 제목(szTitle) 필수
- 매크로
- MAKEINTRESOURCE: 리소스 식별자 변환
- TEXT, _T: _UNICODE 여부에 따라 문자열 타입 자동 변환
- 유니코드 지원
- L"Text", TEXT("Text")로 유니코드 문자열 생성
'C++' 카테고리의 다른 글
[강의] 1월 17일 수업정리 (0) | 2025.01.17 |
---|---|
[강의] 1월 16일 수업정리 (0) | 2025.01.16 |
[강의] 1월 13일 수업정리 (0) | 2025.01.13 |
[강의] 1월 3일 수업정리 (1) | 2025.01.03 |
[강의] 1월 2일 수업정리 (0) | 2025.01.02 |