ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Win32 API 기본 로직
    MFC 2025. 4. 1. 16:24
    // HelloWin32.cpp : 애플리케이션에 대한 진입점을 정의합니다.
    //
    
    #include "framework.h"
    #include "HelloWin32.h"
    
    #define MAX_LOADSTRING 100
    
    // 전역 변수:
    HINSTANCE hInst;                                // 현재 인스턴스입니다.
    WCHAR szTitle[MAX_LOADSTRING];                  // 제목 표시줄 텍스트입니다.
    WCHAR szWindowClass[MAX_LOADSTRING];            // 기본 창 클래스 이름입니다.
    
    // 이 코드 모듈에 포함된 함수의 선언을 전달합니다:
    ATOM                MyRegisterClass(HINSTANCE hInstance);
    BOOL                InitInstance(HINSTANCE, int);
    LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
    
    int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                         _In_opt_ HINSTANCE hPrevInstance,
                         _In_ LPWSTR    lpCmdLine,
                         _In_ int       nCmdShow)
    {
        UNREFERENCED_PARAMETER(hPrevInstance);
        UNREFERENCED_PARAMETER(lpCmdLine);
    
        // TODO: 여기에 코드를 입력합니다.
    
        // 전역 문자열을 초기화합니다.
        LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
        LoadStringW(hInstance, IDC_HELLOWIN32, szWindowClass, MAX_LOADSTRING);
        MyRegisterClass(hInstance);
    
        // 애플리케이션 초기화를 수행합니다:
        if (!InitInstance (hInstance, nCmdShow))
        {
            return FALSE;
        }
    
        HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_HELLOWIN32));
    
        MSG msg;
    
    }

     

    HINSTANCE는 Handle Instance이다. c언어는 main함수가 끝나면 프로그램이 종료된다. 여기선 wWinMain함수가 끝나면 프로그램이 종료된다. LoadStringW는 상수 103으로 정의돼있고, 리소스 뷰를 확인해볼 수 있다. szTitle로 저장돼있는데, 이는 배열 100칸으로 정의돼있다.

    프로그램이 실행되면 InitInstance 함수를 호출하여 애플리케이션 초기화를 시작한다. 이후 기본 메시지 루프를 돈다.

        // 기본 메시지 루프입니다:
        while (GetMessage(&msg, nullptr, 0, 0))
        {
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    
        return (int) msg.wParam;

    GetMessage 함수는 메시지를 끄집어 내어 어떤 메시지인지 해석한다.

    TranslateMessage함수는 키보드 입력 메시지를 문자 메시지로 변환한다.

    DispatchMessage 함수가 호출되면 WndProc라는 메시지 처리기 함수를 호출한다.

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {
        case WM_COMMAND:
            {
                int wmId = LOWORD(wParam);
                // 메뉴 선택을 구문 분석합니다:
                switch (wmId)
                {
                case IDM_ABOUT:
                    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                    break;
                case IDM_EXIT:
                    DestroyWindow(hWnd);
                    break;
                default:
                    return DefWindowProc(hWnd, message, wParam, lParam);
                }
            }
            break;

    WM_COMMAND는 메뉴 선택했거나 버튼을 눌렀을때 실행된다.

    그 안에서 EXIT는 윈도우를 종료한다는 것이다.

    메인쓰레드의 이벤트루프가 끝나면 프로그램이 끝난다.

     

    정리하자면, InitInstance가 애플리케이션 초기화를 수행하고, GetMessage로 이동해 이벤트를 큐에서 불러온다.

    Translate함수가 이벤트 메시지를 문자 메시지로 변환하고, Dispatch함수가 실행돼 윈도우 프록시를 호출한 뒤, 해당 이벤트에 맞는 로직을 수행한다.

     

    'MFC' 카테고리의 다른 글

    솔루션, 프로젝트, 리소스  (0) 2025.04.04
    CString 클래스와 CFile 안내  (0) 2025.04.04
    MBCS와 유니코드  (0) 2025.04.03
    CPtrList, CMapStringToPtr 클래스  (0) 2025.04.03
    Mesasage Driven 구조  (0) 2025.04.01
Designed by Tistory.