C++

[강의] 1월 15일 수업정리

k-codestudy 2025. 1. 16. 04:24

오늘도 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 사용 시 자동 조정

 

요약

  1. MyRegisterClass
    • 윈도우 클래스 등록, 고유 ID(szWindowClass) 설정
  2. LoadString
    • 리소스에서 문자열 읽기. _UNICODE 설정에 따라 A 또는 W 사용
  3. WndProc
    • 운영체제가 사용하는 표준 함수. stdcall 호출 규약
  4. InitInstance
    • 윈도우 생성 및 초기화. 고유 ID(szWindowClass)와 제목(szTitle) 필수
  5. 매크로
    • MAKEINTRESOURCE: 리소스 식별자 변환
    • TEXT, _T: _UNICODE 여부에 따라 문자열 타입 자동 변환
  6. 유니코드 지원
    • 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