접두어 원래말 의미
cb Count of Bytes 바이트 수
dw double word 부호없는 long형 정수
h handle 윈도우, 비트맵, 파일 등의 핸들
sz Null Terminated NULL 종료 문자열
ch Character 문자형
a Array 배열
w Word 부호없는 정수형
I Integer 정수형
p, lp long pointer 포인터형
b bool 논리형

변수명을 나타내는 이런 관습 외에도 윈도우즈에서는 사용자정의 데이터형들이 많이 있다.

이 데이터형은 windows.h라는 헤더 파일에 typedef로 선언되어 있으며 마치 표준 데이터형처럼 사용하므로

알아두면 유용하다.

데이터형 의미
BYTE unsigned char형
CHAR char형
WORD unsigned short형
DWORD unsigned long형
LONG long과 동일
BOOL 정수형이며, TRUE, FALSE 중 한 값을 가짐

 

'Programming > Windows APi' 카테고리의 다른 글

Windows API_WinMain  (0) 2020.10.25
Windows API_유니코드  (0) 2020.10.25
Windows API_핸들(handle)에 대한 이해  (0) 2020.10.25
Windows API_화면에 선 그리기  (0) 2020.10.09
Windows API_개론  (0) 2020.10.09

화면에 선을 그리는 기능은 다음과 같이 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
레지스터를 사용하기 때문에 함수 호출을 빠르게 처리할 수 있다.

vector의 메모리 정책

-> vector는 메모리 개수를 초과하는 삽입의 시도가 있을 경우 재할당 및 복사가 발생한다.

-> 재할당은 (기존 메모리 개수 / 2) 만큼 추가로 할당이 된다.

-> 재할당 및 복사를 최소화 하기 위해 사용할 만큼 메모리를 예약하여 사용하는 것이 좋다.

 

#1. 생성자

-> 메모리 개수를 생성자의 인자만큼 만들어준다.

-> 단, 원소도 모두 채워 넣는다.

-> 사용하기 위해서는 clear 이후 push_back을 사용하는 방법과 인덱스 접근을 통한 대입을 이용하면 된다.

1
vector<int> vecInt(5);
cs

 

#2. reserve

-> 객체 생성 후 멤버 함수를 호출하면 된다.

1
2
vector<int> vecInt;
vecInt.reserve(5);
cs

 

비어있는 컨테이너의 begin과 end

1
2
3
4
5
6
7
8
9
10
11
vector<int>        vecInt;
vecInt.reserve(5);
 
vector<int>::iterator        iter_begin = vecInt.begin();
vector<int>::iterator        iter_end = vecInt.end();
 
for (; iter_begin != iter_end; ++iter_begin)
    cout << *iter_begin << endl;
 
if (iter_begin == iter_end)
    cout << "같다" << endl;
cs

위의 결과에서는 메모리 5개가 생성된 상태이지만 원소안에 값이 들어가 있지 않기때문에 begin과 end가 서로 값이 "같다"가 나오게 된다.

'Programming > STL' 카테고리의 다른 글

C++(STL Container) 조건자(algorithm)  (0) 2020.09.28
C++(STL Container) 반복자(iterator)  (0) 2020.09.28
C++(STL Container) vector  (0) 2020.09.27
C++(STL Container) map  (0) 2020.09.27
C++(STL Container) list  (0) 2020.09.27

+ Recent posts