본문 바로가기

카테고리 없음

Window API 입문

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
LRESULT CALLBACK WndProc(
    HWND hWnd,
    UINT msg,
    WPARAM wParam,
    LPARAM TParam) {
    
    switch (msg) {
    
    case WM_DESTROY:
    
        PostQuitMessage(0);
        break;
    default :
        break;
    };
    
    return DefWindowProc(hWnd, msg, wParam, TParam);
};
cs

WndProc 윈도우 프로시저 함수

윈도우에서 이벤트가 발생할때마다 호출되며

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// 유니코드 사용 wWinMain                 
int WINAPI wWinMain(HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPWSTR    lpCmdLine,
                    int    nCmdShow)
{
    // 생성할 윈도우 클래스 운영체제 등록
    WNDCLASSEXW wc;
    ZeroMemory(&wc,sizeof(WNDCLASSEXW));
    wc.cbSize = sizeof(WNDCLASSEXW);
    wc.hInstance = hInstance;
    // 가로 세로 Draw 
    wc.style = CS_HREDRAW | CS_VREDRAW;
    // 클래스 이름으로 등록 하였기 때문에
    // 다음에 찾을때 이 이름으로 찾아야함
    wc.lpszClassName = L"KGCAWIN";
    // 프로시저 등록
    wc.lpfnWndProc = WndProc;
    wc.lpfnWndProc= WndProc;
    // 백그라운드 Color 를 설정한다.
    wc.hbrBackground = static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
    //// 마우스 커서 세팅
    //wc.hCursor = LoadCursor(NULL, IDC_IBEAM);
    //// 윈도우 창 아이콘을 바꾼다.
    //wc.hIcon = LoadIcon(NULL, IDI_QUESTION); 
    // WNCCLASSEXW 구조체의 내용을 바탕으로 등록
    if (RegisterClassEx(&wc)==false) {
        return 1;
    }
    // 2. 등록된 윈도우 클래스로 윈도우 생성
    // 하나의 프로세스에서 여러개의 윈도우 창을
    // 띄울수 있으며 각각의 윈도우 창을 관리하는 핸들을
    // 반환한다.
    auto hWnd = CreateWindowExW(0,
        /*WNDCLASSEXW 이름으로 반드시 설정*/
        //_In_opt_ LPCWSTR lpClassName,
        L"KGCAWIN",
        /*_In_opt_ LPCWSTR lpWindowName,*/
        // 내가 하고싶은 이름으로 설정
        L"SAMPLEWINDOW",
        WS_OVERLAPPEDWINDOW,
        //_In_ DWORD dwStyle,
 
        // 윈도우의 시작 좌표와 크기를 설정한다.
        /*_In_ int X,
        _In_ int Y,
        _In_ int nWidth,
        _In_ int nHeight,*/
        10010030030000, hInstance, 0);
 
    if (hWnd == NULL)return 1;
    ShowWindow(hWnd, SW_SHOW);
    //GetMessage(&msg) = 운영체제의 MessageQueue 에서
    // 메시지를 가지고 온다. (키가 눌렸다는것을 알려준다)
    // GetMessage window msg queue 에서 큐가
    // 비었을 경우 GetMessage 는 리턴하지않고 대기한다
    // 즉 게임에서는 쓸모가 없다...
 
    //PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)
    //    PM_REMOVE 파라미터를 지정해주면
    // 메시지 큐에서 메시지를 가져온 이후 큐에서 메시지를 지우며
    // 지정하지 않으면 지우지 않는다.
 
    // TranslateMessage(&msg) ; 
    // 해당 키를 해석한다 (무슨 키가 눌렸는지)
 
    // DispatchMessage(&msg)
    // 해당 메시지를 바탕으로 윈도우 프로시저를 호출한다.
    // 메시지를 전부 처리 하고나서 Frame Render 를 호출한다
 
    MSG msg;
 
    auto Run{ [] {} };
    
    while (true) {
 
        while (PeekMessage(&msg, nullptr, 00, PM_REMOVE)){
            TranslateMessage(&msg);
            DispatchMessage(&msg);
            
            if (msg.message == WM_QUIT) 
                break;
            else {
                Run();
                /*CoreFrame();
                CoreRender();*/
            }
        }
    }
    return 0
};
 
cs