본문 바로가기

C++

[TIL 34장] Win32 API 원리 (feat. 윈도우 초기화)

오늘의 TIL 목차 (22. 09. 29)

 

  • API 개념
  • 윈도우 초기화

 

API 개념


[ API ]

: Application Programming Interface, 인터페이스는 컴퓨터와 사람 간의 연결 고리 ( 키보드, 모니터 등 )

 

[ Handle, 핸들 ]

: OS 보호 차원에서 응용프로그램이 바로 OS 자원의 주소값을 접근하는 것이 아니라 핸들값을 제공하는 것

 

[ WM ]

: Window Message, 윈도우는 메세지 기반

 

[ DC ]

: 출력에 관한 정보를 갖고 있는 데이터 구조체, GDI가 관리하며 어떤 포인트(점)인지 선의 색상, 굵기, 무늬 등 그리기와 관련된 정보를 가진다. => hdc는 도화지라고 생각하면 된다.

 

윈도우 초기화


[ wWinMain ]

: 윈도우의 메인 함수

 

[ CALLBACK wndProc ]

함수: WndProc(HWND, UINT, WPARAM, LPARAM)
목적:  주 창의 메시지를 처리합니다.

- 기본 구성 요소 -
WM_COMMAND  - 응용 프로그램 메뉴를 처리합니다.
WM_PAINT    - 주 창을 그립니다.
WM_DESTROY  - 종료 메시지를 게시하고 반환합니다.


CALLBACK : 함수 포인터의 콜백 기능과 같으며 __stdcall 함수 호출 규약을 사용하는데 이를 매크로화한 것
=> CALLBACK WndProc( ~ ) 으로 쓰임

switch(message) {
case WM_CREATE: // 윈도우 창 생성 시 실행
	SetTimer(hWnd, 0, 0, 0); // 갱신 주기 함수
    break;
    
case WM_TIMER: // SetTimer 실행 시 실행
	InvalidateRect(hWnd, 0, true); // 잔상 노출 여부 함수
    break;
    
case WM_PAINT: // InvalidateRect() 함수 실행 시 실행
	// WM_PAINT 안의 코드는 SetTimer에 의해
    // InvalidateRect가 지정한 갱신 범위만큼 계속해서 갱신됨
  	break;
    
case WM_KEYDOWN: // 키를 입력받으면 실행
	switch(wParam) // 입력한 키보드의 주소는 wParam으로 넘겨짐
    {
    case VK_ESCAPE: // 키보드마다 각각의 주소에 맞는 매크로명이 존재
    	break;
    ...
    }
    break;
    
case WM_DESTROY: // 종료 메세지를 게시하고 반환
	PostQuitMessage(0);
    break;
    
=> window는 메세지를 엄청나게 빠른 속도로 계속 받고 있으며,
받은 메세지를 SetTimer의 시간 주기로 PAINT에서 새로 그리는 것

 

총알 원리 ( 윈도우 초기화ver )


 

  • wndProc 안의 함수는 엄청난 속도로 계속해서 메세지를 받고 있음
  • 받은 메세지 중 setTimer의 시간 주기만큼 PAINT를 실행
  • SPACE 키를 누른다면 rcBullet 원소 하나 listRec 리스트에 대입
  • 스페이스바 한 번 기준 listRec에는 원소 하나밖에 없지만 PAINT에선 메세지를 계속 받아 계속 갱신(그리기)를 하기 때문에 원소가 실시간으로 -= 10만큼 계속 이동 ( 잔상 여부를 false로 한다면 잔상이 남아 여러겹으로 보임 )