화면에 선을 그리는 기능은 다음과 같이 WndProc 함수 내부에서 진행한다.

화면에 선을 그리기 위해서는 어느 위치에서 어느 방향으로 그릴지 알아야한다.

그래서 WndProc 함수에 RECT라는 변수를 만들어준다.

변수는 정적 변수로 만들어 준다.

이유는 지역 변수로 만들어주면 변수가 Stack 영역에 할당이 되어

해당 함수가 종료될 시 변경 한 값이 초기화가 진행되기 때문이다.

 

RECT란?

-> 상하좌우 방향이 정의되어 있는 구조체이다.

WndProc 함수에 message 조건이 들어가 있는 switch 문을 볼 수 있다.

그 안에 있는 WM_PAINT 부분을 보자.

안에 있는 PAINTSTRUCT와 HDC는 기본적으로 포함되어 있다.(기본 그리기 도구)

 

그림을 그릴 수 있는 함수는 여러가지가 있다.

그 중에서 몇가지만 알아보자.

 

##1. MoveToEx()
커서의 위치를 변경시킨다.

##2. LineTo()
기존 커서의 위치부터 넘겨주는 위치까지 선을 그린다.

##3. Rectangle()

사각형을 그려주는 함수

##4. Ellipse()

원을 그려주는 함수

 

그려진 그림 움직이게 하기

그림을 움직이게 하려면 먼저 해당 방향의 버튼이 눌렸다는 메시지를 알려줘야한다.

case에 WM_KEYDOWN을 추가하여 키가 눌렸다는 것을 알려주고,

다시 switch문으로 눌려진 키는 어떤 키인지 알려준다.

 

VK_LEFT = 왼쪽

VK_RIGHT = 오른쪽

VK_UP = 위

VK_DOWN = 아래

 

그리고 자신이 원하는 방향으로 얼마만큼 이동할건지 값을 + 또는 - 를 해주면 된다.

위의 예를 들어보면 left의 값과 right의 값이 같이 바뀌는 것을 볼 수 있다.

 

이유는 left의 값만 이동시킬 경우 left 측에 그려진 선만 이동하기 때문에

다음과 같이 한쪽 부분만 늘려지거나 찌그러지는 현상이 발생한다.

 

left -

 

left +

클래스 만들기

 

HINSTANCE

H : Handle -> 고유 식별 번호

INSTANCE : 메모리에 등록된 객체

 

위의 함수 내용을 보면 GetMessage()라는 함수가 있다.

GetMessage() : 메시지를 읽어오는 함수

-> 시스템이 유지하는 '메시지 큐'라는 곳에서 메시지를 읽어오는 함수이다.

-> queue는 컴퓨터의 기본 자료구조의 한가지로 선입선출형 구조를 가진다.

-> 메시지도 먼저 들어온 메시지부터 처리해야 하기 때문에,

-> 메시지 큐에서 메시지를 읽어오면 구조체에 전달한다.

 

Windows는 대화식 운영체제이다.

키보드 눌림 -> 하드웨어가 이벤트 발생 -> OS 감지 -> 메시지 발생 -> 응용 프로그램 읽음 -> 처리

 

메시지 처리 함수는 WndProc 함수에서 처리한다.

DestroyWindow 함수가 호출되면 PostQuitMessage 함수를 호출한다.

PostQuitMessage 함수가 호출되면 메시지 큐에 WM_QUIT이라는 메시지를 발생시킨다.

 


GetMessage는 메시지 큐에서 메시지를 읽어왔을 때 WM_QUIT을 읽어올 경우 false를 반환한다.
그 외에는 true를 반환한다.
단, 읽어올 메시지가 없을 경우에는 해당 프로그램은 블로킹 상태에 빠지게 된다.

블로킹이란?
프로그램은 CPU를 점유하고 있는 상태이다.
Windows의 장점 중 하나인 멀티태스킹은 여러개의 윈도우를 띄울 수 있다.
내가 점유하고 있는 CPU를 다른 프로그램에 양보하는 것이 블로킹이다.

게임은 메시지 입력이 없어도 연산을 수행해야 한다.

-> CPU를 사용해야 한다.
->즉, GetMessage함수는 게임 개발에 적합하지 않은 함수라고 볼 수 있다.

 

Windows APi 프로젝트에 메인 소스파일 부분을 살펴보면 CALLBACK이라는 함수가 있는 것을 볼 수 있다.

CALLBACK 함수란?

운영체제에 의해 호출되는 응용 프로그램 내의 함ㅅ루를 가리켜 CALLBACK 함수라 한다.

 

함수 호출 규약

함수의 실행이 종료되면 할당되어 있는 Stack 영역을 정리해야한다.

이 때 Stack 영역을 함수를 호출한 호출원에서 정리할 것인지 피호출자가 정리할 것인지에 따라 규약이 나눠진다.

 

__stdcall

Win32 API의 기본 호출 규약.
피호출자가 stack 영역을 정리한다.
-> API에서 제공하는 함수들은 고정인자 함수를 제공해준다.
-> 본인이 인자를 몇개 받을지 알 수 있는 상황이기 때문에 본인이 Stack 영역을 정리할 수 있다.

 

__cdecl
C/C++의 기본 호출 규약이다.
호출자가 Stack 영역을 정리한다.
-> printf, scanf : 가변인자 함수
-> 인자의 개수가 변한다.
-> 함수가 실행되면 몇 개의 인자를 받는지 알 수 없는 상황이다.
-> 본인이 몇개를 받는지 알 수 없기 때문에 Stack 영역을 정리할 수 없게 된다.


__fastcall
레지스터를 사용하기 때문에 함수 호출을 빠르게 처리할 수 있다.

+ Recent posts