[WinAPI] Windows API
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, 0, 0))
{
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를 주로 사용.
'⭐ DirectX > DirectX11 2D + WinAPI' 카테고리의 다른 글
[WinAPI] Bullet 속도를 Gauge Bar와 연동 (0) | 2022.07.29 |
---|---|
[winAPI] 시계 만들기 (0) | 2022.07.22 |
[WinAPI] 도형 만들기 (0) | 2022.07.07 |
[WinAPI] 좌표 활용 연습 (0) | 2022.07.07 |
[WinAPI] Window Procedure, Message Loop/Queue, Window Message (0) | 2022.07.05 |
댓글
이 글 공유하기
다른 글
-
[winAPI] 시계 만들기
[winAPI] 시계 만들기
2022.07.22 -
[WinAPI] 도형 만들기
[WinAPI] 도형 만들기
2022.07.07 -
[WinAPI] 좌표 활용 연습
[WinAPI] 좌표 활용 연습
2022.07.07 -
[WinAPI] Window Procedure, Message Loop/Queue, Window Message
[WinAPI] Window Procedure, Message Loop/Queue, Window Message
2022.07.05