관심 분야/Windows API
[WinAPI] WinAPI 기본 코드
yozura
2022. 10. 7. 06:23
반응형
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
|
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClassName = TEXT("MyWinAPI");
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
g_hInst = hInstance;
WNDCLASS wndClass;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.lpfnWndProc = WndProc;
wndClass.lpszClassName = lpszClassName;
wndClass.lpszMenuName = NULL;
wndClass.hInstance = hInstance;
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndClass.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndClass);
HWND hWnd = CreateWindow(
lpszClassName, lpszClassName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, (HMENU)NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
MSG msg = {};
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
|
cs |
이 코드는 WinAPI를 처음 시작할 때 볼 수 있는 코드다. 가장 간략화된 버전으로 이를 수정하고 추가해나가면서 개발을 시작할 수 있다.
1. WinMain 함수는 WinAPI의 진입점 함수로서 콘솔에서의 main함수를 대신한다.
- 지정자 APIENTRY는 윈도우즈 표준 호출 규약인 __stdcall 을 사용한다는 뜻이다.
- hInstance를 제외한 매개변수는 잘 사용되지 않는다. hInstance는 해당 프로그램의 인스턴스 핸들을 의미한다. 운영체제에서 프로그램을 구분하는 핸들값으로 사용되며 많은 API함수에서 이를 요구하기 때문에 전역 변수(10행)로 저장해두었다.
2. WndProc 함수는 메시지를 처리하는 함수다.
- 지정자 CALLBACK은 APIENTRY, WINAPI와 같이 __stdcall 호출 규약을 사용한다는 의미이다.
- 메시지 루프에서 해석된 메시지를 처리하는 콜백 함수로서 다양한 메시지 처리를 할 수 있다.(크기 변경 및 그리기 처리 등)
- switch문에서 메시지를 처리하고 대부분 바로 return 하는 것이 원칙이나 특별한 경우(시스템 메시지)를 처리할 경우에는 break로 switch문을 빠져나와 DefWindowProc 함수를 거치게 해야 한다. 그렇지 않으면 시스템이 오작동할 수 있다.