WinAPI(Windows Application Programming Interface)

-  Window      : OS (Operation System)
-  Application : 응용 프로그램

-  Interface   : 함수의 집합체
- 윈도우가 제공하는 응용프로그램을 개발하는 함수들의 집합체

 

윈도우 데스크탑 애플리케이션 만들기

 

WindowsProject.cpp

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
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <Windows.h>
 
WCHAR szTitle[100]       = L"API";      // 창의 제목을 저장하는 전역변수입니다.
WCHAR szWindowClass[100= L"Window";   // 윈도우 클래스 이름을 저장하는 전역변수입니다.
 
HINSTANCE hInst;
 
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
 
 
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,  // 내가 실행하고 있는 프로그램의 시작 위치를 저장합니다.
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
 
{        
    MyRegisterClass(hInstance);
 
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }
 
    MSG msg;
 
    while (GetMessage(&msg, nullptr, 00))
    {        
            DispatchMessage(&msg);
    }
 
    return (int) msg.wParam;
}
 
 
// Window를 만들기 위해 Window 구조(class)를 등록합니다.
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;
 
    wcex.cbSize         = sizeof(WNDCLASSEX);                   // class의 size를 결정합니다.
    wcex.style          = CS_HREDRAW | CS_VREDRAW;              // window style을 결정합니다.    
    wcex.lpfnWndProc    = WndProc;                              // 메세지처리 함수를 등록합니다. Window Procedure
    wcex.cbClsExtra     = 0;                                    // 클래스 여분의 메모리입니다.
    wcex.cbWndExtra     = 0;                                    // 윈도우 여분의 메모리입니다.
    wcex.hInstance      = hInstance;                            // Instance Handle 을 설정합니다.
    wcex.hIcon          = LoadIcon(nullptr, IDI_APPLICATION);   // 큰 아이콘을 설정합니다.
    wcex.hIconSm        = LoadIcon(nullptr, IDI_ERROR);         // 작은 아이콘을 설정합니다.
    wcex.lpszMenuName   = nullptr;                              // 메뉴 사용 여부를 결정합니다.
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);       // 커서 아이콘을 설정합니다.
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 1);           // 화면 배경을 설정합니다. +1(흰색),2(회색),3(검은색)
    wcex.lpszClassName  = szWindowClass;                        // 클래스 이름을 설정합니다.
 
    return RegisterClassExW(&wcex);                             // 창 클래스를 등록합니다.
}
 
// 등록한 클래스로 창을 만들어줍니다.
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; 
 
   HWND hWnd = CreateWindowW(
       szWindowClass,           // 등록할 클래스 이름
       szTitle,                 // 창의 제목
       WS_OVERLAPPEDWINDOW,     // 윈도우 스타일, WS_OVERLAPPEDWINDOW : 겹칠 수 있는 창의 스타일
       CW_USEDEFAULT,           // 창의 시작 위치 x값
       0,                       // 창의 시작 위치 y값
       CW_USEDEFAULT,           // 창의 너비
       0,                       // 창의 높이
       nullptr,                 // 부모 윈도우 핸들
       nullptr,                 // 메뉴
       hInstance,               // 인스턴스 핸들
       nullptr
   );
 
   // 창이 제대로 만들어지지 않았다면 프로그램을 종료합니다.
   if (!hWnd) { return FALSE; }
 
   ShowWindow(hWnd, nCmdShow);
 
   return TRUE;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
 
cs

 

 

 

 

 

 WCHAR
 -wchar_t 형식을 typedef으로 별칭을 사용한 구문입니다.
    wide character 형식이라 불립니다.
    넓은 형태(아스키코드로 표현하지 못하는 문자)를 표현할 수 있습니다.
    char(8bit)와 다르게 16bit(2Byte) 형식을 저장하므로 보다 넓은 문자를 사용할 수 있습니다.
    L"" : wide char 형식의 문자열 상수 표기법입니다. 

 

HINSTANCE (Instance Handle)

- 프로세서의 실행 위치를 주소값을 반환한 형식입니다.
- 프로세서란 현재 실행하고 있는 프로그램을 의미하며 프로그램은 컴퓨터 메모리에서 특정 위치에서 실행합니다. 우리의 프로그램에 접근하기 위해서 어디에서 실행하고 있는지 알고 있어야하는데 그 위치를 저장할 수 있는 기법입니다.

 

 

wWinMain : 창 프로그램의 시작 위치를 결정합니다.
main     : 콘솔 프로그램의 시작 위치를 결정합니다.

APIENTRY : __stdcall 의 심볼입니다.
__stdcall : 프로그래머가 직접 호출해주는 것이 아닌 컴퓨터가 자동으로 호출해준 함수 호출 규정 방식

 

 

Window를 만들기 위해 Window 구조(class)를 등록합니다.

 

 

- 등록한 클래스로 창을 만들어줍니다.
- CreateWindow : 등록한 클래스로 창을 만들어주는 매크로 함수입니다. 창을 제대로 만들지 못했다면 nullptr를 반환하고 창을 제대로 만들었다면 만든 창의 시작 위치를 반환합니다.  
- HWND : Window의 시작 위치를 저장할 수 있는 Window Handle 입니다.

 

 

 

GetMessage

- GetMessage()와 GetMessageW()는 같음. GetMessage()가 매크로 함수.

- GetMessage(&msg, nullptr, 0, 0): nullptr로 받기 때문에 메세지가 어디에 있던 모든 베세지를 받아주겠다는 의미. 그 후에 msg에 저장해주겠다는 의미.

- GetMessage : 대기하고 있는 메세지를 가져와 MSG 형태에 저장.
- 만약 메세지가 없다면 while문을 잠재움.
- WM_QUIT 메세지가 들어온다면 false를 반환함. WM_QUIT은 컴퓨터가 반환하지 않고 프로그래머가 직접 반환해야 한다.

 

 

- wParam: Windows Parameter

- WM_KEYDOWN: 키보드 입력 (참고. WM_LBUTTONDOWN: 마우스 좌클릭)

- VK_SPACE: Windows Spacebar 버튼

- 스페이스 바를 누르면 "Space Key Down !"이 적힌 "MessageBox" 창이 뜬다.

 

 

 

 

 

 

 

GetMessage vs. PeekMessage 차이점 알기

- PeekMessage를 주로 사용.