(Application Programming Interface)
운영체제가 응용 프로그램 개발을 위해 제공하는 서브루틴 또는 함수의 집합이라고 한다.
명령어의 집합으로 어플리케이션 프로그램에서 오퍼레이팅 시스템의 기본적인 기능을 사용할 필요가 있을 경우 API에서 명령어 호출이 진행된다.
가장 근본적인 녀석임.
즉, 하드웨어 --------- 운영체제 (Windows) --------- 응용프로그램
▷ 장점
운영체제가 같으면 같은 기능의 집합을 사용하기에 확장성 및 연동성, 그리고 유지보수가 편리하다
ㄴ 윈도우즈 != 리눅스
( 윈도우즈에서 리눅스로 넘어갈거라면 헤더파일에 추가만 한다면 가능하지만, 리눅스에서 윈도우즈로 넘어가는 것은 불가능하다.)
윈도우즈에서 지원하는 다양한 라이브러리 지원 가능
▷ 단점
▶ API 구조
이 세가지를 기억해야한다.!! ★★★★★★★★★★★★
API에서의 기본적인 용어
인스턴스
윈도우 OS가 현재 실행되고 있는 프로그램을 확인하기 위한 값
같은 프로그램이면 같은 인스턴스 값을 가진다.
실행되고 있는 각각의 프로그램들을 의미
즉, 인스턴스라 함은 프로그램에 대한 정보라고 생각하면 된다.
윈도우 핸들
▶ TCHAR
TCHAR형은 프로젝트의 문자셋 설정에 따라 자동적으로 char또는 wchar_t로 type casting 되는 중간 매크로 자료형이다.
멀티 바이트와 유니 코드 환경에서 별도의 수정 작업 없이 프로그램을 구동하기 위해서는 TCHAR형으로 문자열을 표현하는걸 추천
일반적으로 윈도우 응용 프로그램에서 문자열 상수를 쓰기 위해서는 중간 설정에 따라 char 포인터 또는 wchar_t 포인터 로 변환해주는 _T 매크로를 사용해야 한다.
※ 영어가 아닌 다른 문자들을 표현할 때는 영어라면 1byte로 표현하나 다른것들은 2byte로 표현이 되므로 이를 해결하기 위해서 유니 코드( Unicode ) 를 사용하는데, 유니코드는 모든 문자 집합을 지원한다.
hInstance : 프로그램 인스턴스 핸들
hPrevInstance : 이전에 실행된 인스턴스 핸들
lpszCmdParam : 명령형으로 입력된 프로그램 인수(자)
nCmdShow : 프로그램이 시작될 형태 ( 최소화 or 보통 크기 등등... )
// 진입점 (윈도우 메인함수)
int APIENTRY WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdParam,
int nCmdShow)
▶ WinMain의 역할
윈도우 창을 셋팅 후 화면에 띄우기
ㄴ 화면에 창을 띄우기 위해서는 4가지를 모두 처리해야 한다.
WndClass 정의
ㄴ 윈도우 창 구조체 선언 및 초기화
WNDCLASS wndClass;
wndClass.cbClsExtra = 0; // 클래스 여분 메모리
wndClass.cbWndExtra = 0; // 윈도우 여분 메모리 -> 이 여분 메모리들은 우리는 게임을 만들기 때문에 동적할당으로 이용해서 안씀
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 백그라운드
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); // 마우스 커서 -> 윈도우에서 지원하고 있는 화살표를 쓸것임. (NULL은 이미지를 쓰지 않는다는것)
wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 아이콘 -> 아이콘은 쓰지 않겠다고 NULL을 입력함. application에 지원하는 것을 쓰겠다.
wndClass.hInstance = hInstance; // 윈도우를 소유한 프로그램의 식별자 정보
wndClass.lpfnWndProc = (WNDPROC)WndProc; // 윈도우 프로시저 -> 우리가 쓰고 있는 procedure를 쓰겠다. 일단 강제치환해서 씀
wndClass.lpszClassName = _lpszClass; // 클래스 이름 (윈도우 클래스 식별자 정보를 뜻한다.)
wndClass.lpszMenuName = NULL; // 메뉴 이름
wndClass.style = CS_HREDRAW | CS_VREDRAW; // 윈도우 스타일 (윈도우 다시 그리기 정보)
WndClass 등록
RegisterClass(&wndClass);
윈도우 생성
ㄴ 화면에 보여줄 윈도우 창 생성
_hWnd = CreateWindow
(
_lpszClass, // 윈도우 클래스 식별자
_lpszClass, // 윈도우 타이틀 바 이름
WS_OVERLAPPEDWINDOW, // 윈도우 스타일
400, // 윈도우 화면 X좌표
100, // 윈도우 화면 Y좌표
800, // 윈도우 화면 가로크기
800, // 윈도우 화면 세로크기
NULL, // 부모 윈도우 GetDesktopWindow() 이게 더 안전하긴함
(HMENU)NULL, // 메뉴 핸들
hInstance, // 인스턴스 지정
NULL // 윈도우의 자식 윈도우를 생성하면 지정하고 아니라면 NULL
// ㄴ 필요에 의해서 사용하지만 지금은 NULL
);
윈도우 출력
ㄴ 화면에 윈도우 창 보여주기
ShowWindow(_hWnd, nCmdShow);
메세지 루프
// MSG: 운영체제에서 발생하는 메세지 정보를 저장하기 위한 구조체
MSG message;
▶ 메세지의 종류
장점: 안정적이다. (메세지가 하나씩 들어오기 때문에)
단점: 다량의 데이터를 처리하기에는 부족하다.
// 메세지 루프
while (GetMessage(&message, 0, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
TranslateMessage : 키보드에서 입력 메세지 처리를 담당, 입력된 키가 문자키인지 확인 후 대문자 혹은 소문자, 한글, 영문인지에 대한 WM_CHAR 메세지를 발생 시킨다.
DispatchMessage : 윈도우 프로시저에서 전달된 메세지를 실제 윈도우로 전달
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
콜백함수 (CallBackFunction) : 사용자가 호출하는 것이 아닌, 운영체제에 의해 호출된 함수
윈도우 프로시저
LRESULT가 반환형인 CallBack함수로 4개의 인수를 가지고 있다.
▶ Window Procedure
※ 윈도우 프로시저 내부에서는 윈도우에서 발생한 모든 메세지를 처리하는 것이 아니라 특정 메세지만을 처리하고 나머지 메세지는 DefWindowProc 함수가 처리하도록 로직을 설계하는 것이 일반적이다.
hWnd : 어느 윈도우에서 발생한 메세지인지 구분
iMessage : 메세지 구분 번호
wParam : unsigned int 마우스 버튼의 상태, 키보드 조합 키의 상태를 전달
lParam : usingned long 마수으 클릭 좌표를 전달
switch (iMessage)
{
// 윈도우 메세지 크리에이트, 생성자 느낌이 난다.
case WM_CREATE: // 생성자
break;
case WM_DESTROY: // 소멸자
/*
PostQuitMessage 함수는 메세지 큐에 Quit 메세지를 보내는 역할을 한다.
즉, Quit 메세지를 수신하는 순간 GetMessage 함수가 FALSE를 반환함으로서 메세지 루프가 종료된다.
*/
PostQuitMessage(0);
return 0;
}
// 윈도우 프로시저에서 처리되지 않은 나머지 메세지를 처리해준다.
return (DefWindowProc(hWnd, iMessage, wParam, lParam));