각 플랫폼(Windows, Mac, Android 등)마다 맞는 함수들을 제공해 준다. => API(Application Programming Interface)
winAPI란 Windows를 이용하기 위한 무수히 많은 함수의 집합이다.
windows.h: 윈도우 창에서 무언가를 출력하는 등 윈도우 창을 컨트롤할 수 있는 함수들을 제공
wWinMain: win32의 진입점 함수(메인 함수)
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
//...
}
APIENTRY: __stdcall(함수 호출 규약)
HINSTANCE: H - Handle / Instance - 실제 사용할 수 있는 객체
기계어로 변환된 .exe 파일이 코드 영역 메모리에 올라간다. CPU는 코드 영역의 코드를 동작시킨다. 이를 위한 식별자가 바로 HINSTANCE이다. 커널 영역은 절대 건들면 안 됨!!
※ 커널: 우리가 사용하는 영역이 아닌, 운영체제가 사용하는 핵심적인 기능들을 위해 사용하는 영역
// Global Variables:
HINSTANCE hInst; // current instance
WCHAR szTitle[MAX_LOADSTRING]; // The title bar text
WCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
//...
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_PROJECT3, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
WCHAR: wchar_t를 typedef, 2바이트 유니코드 문자
타이틀 바에 제목을 문자열로 지정할 수 있다. String Table(key, value)에 있는 것을 읽어 오는 방식이다.
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_PROJECT3));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL; //MAKEINTRESOURCEW(IDC_PROJECT3);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassExW(&wcex);
}
WNDCLASSEXW: 구조체
프로그램을 동작시킬 때, 운영체제에 레지스터라는 것이 있다. 운영체제는 레지스터에 등록된 값들로 어떤 걸 동작시키고 있는지를 손쉽게 알 수 있다. 우리가 만든 프로그램을 실행하기 전에 레지스터에 등록하는 과정.
style: 최소화 버튼 등 창의 스타일 설정
lpfnWndProc: 윈도우는 메시지 기반 운영체제, 마우스/키보드 입력 등을 '이벤트'라고 부름, 윈도우는 그러한 이벤트가 발생하면 어떤 이벤트이냐에 따라서 메시지로 만들고 이를 메시지 큐가 받아서 처리함, 따라서 메시지 큐에 메시지가 있는지를 무한 루프를 돌며 실시간으로 감시해야 함
※ 큐(Queue): 선입선출, 이벤트가 발생한 순서대로 진행하기 위해 큐를 사용함
hIcon: 일반 아이콘, 바탕화면에 있는 아이콘
hIconSm: 작은(small) 아이콘, 실행 창 상단에 뜨는 아이콘
hCursor: 마우스 모양, 이미지로도 변경 가능함!
hbrBackground: 백그라운드 컬러
lpszMenuName: 메뉴 설정, 사용하지 않을 거라면 NULL로 변경하면 됨
lpszClassName: 레지스터에 등록할 클래스 이름
RegisterClassExW(): 레지스터에 등록해 주는 함수
해당 포스트는 'WinApi 2D 게임제작 무료강의' 강의를 수강하며 개인 백업용으로 메모하였습니다.
유튜브: youtu.be/lBawfsBIT7s