프로그래밍/Win32 API

##1. 기본예제분석 / 그림그리기

hscho00 2020. 8. 12. 03:30

핸들(Handle)

> 운영체제가 발급해주며 사용자는 쓰기만 하면 됨

> 32비트 정수값. 실제값이 무엇인지 몰라도 상관 없음

> 핸들의 사용 목적은 오로지 구분을 위한 것이므로 핸들끼리 중복 X

> 접두어 h로 시작

 

인스턴스(Instance)

> 메모리에 실제로 구현된 실체

> 윈도우즈용 프로그램은 여러 개의 프로그램이 동시에 실행되는 멀티태스킹 시스템일 뿐만 아니라

하나의 프로그램이 여러 번 실행될 수도 있다.

이 때 실행되고 있는 각각의 프로그램을 인스턴스라 한다.


윈도우즈 프로그램의 시작점은 WinMain

> WndClass 정의 -> CreateWindow -> ShowWindow -> 메시지 루프

 

윈도우 클래스

윈도우의 여러가지 특성을 정의한 구조체(WNDCLASSEX)

> 윈도우의 가로, 세로의 길이 등등...

 

메시지 루프는 크게 세 개의 함수 호출로 이루어져 있으며 전체 루프는 while 문으로 싸여져 있음

GetMessage()

> 메시지 큐에서 메시지를 읽어들임

> 읽어들일 메시지가 없으면 블로킹(호출한 함수에게 제어권을 넘겨주지 않고 대기)

> 읽어들인 메시지가 프로그램을 종료하라는 메시지인 WM_QUIT일 경우 FALSE, 그 외의 경우 TRUE 리턴

TranslatateMessage()

> 키보드 입력 메시지를 가공하여 프로그램에서 쉽게 쓸 수 있도록 해줌

> A키를 누른 후(VM_KEYDOWN) 다시 A키를 떼면(VM_KEYUP) A문자가 입력되었다는 메시지(VM_CHAR)를 만들어 냄

DispatchMessage()

> 시스템 메시지 큐에서 꺼낸 메시지를 프로그램의 메시지 처리 함수(WndProc)로 전달

 

wParam : word parameter (32비트) 

lParam : long Parameter (32비트)

전달되는 메시지에 대한 부가적인 정보를 가짐

어떤 의미를 가지는가는 메시지 별로 다름!!!


윈도우 프로시져(WndProc)

> 메시지 처리 함수

> 운영체제(윈도우즈)에 의해 호출되는 CALLBACK 함수

 

PostQuitMessage(0) : WM_QUIT 메시지를 보냄

 

WndProc에서 처리하지 않은 나머지 메시지는 DefWindowProc()로 넘기면 됨

 

WndProc은 메시지를 처리했을 경우 반드시 0을 리턴해야 함

DefWindowProc()가 메시지를 처리했을 경우 이 함수가 리턴한 값을 WndProc에서 다시 리턴해야 함


번외) 함수 호출 규약

> Parameter 전달 방법과 전달 순서, 함수 리턴 값 전달 방법, stack frame 정리 방법에 따라 종류가 나뉘어짐

대표적으로 __cdecl, __stdcall 등이 있음

 

__cdecl

> C언어에서 만든 함수 호출 규약

> caller(호출한 함수)가 callee(호출된 함수)의 stack frame 공간을 정리

printf, scanf 같은 가변인자함수(파라메터 제한 X) 때문

 

__stdcall

> 윈도우에서 사용하고 있는 표준 호출 규약

> callee(호출된 함수)가 자신의 stack frame 공간을 직접 정리

> windows API는 대개 stdcall을 따름

가변인자함수가 없고 모든 함수의 파라메터가 고정되어 있으므로


윈도우즈는 세 가지 동적 연결 라이브러리(DLL)로 구성

> 메모리를 관리하고 프로그램을 실행시키는 KERNEL

> 유저 인터페이스와 윈도우를 관리하는 USER

> 화면 처리와 그래픽을 담당하는 GDI(Graphic Device Interface)

 

DC(Device Context)

> 출력에 필요한 모든 정보를 가지는 데이터 구조체. GDI 모듈에 의해 관리

> 어떤 폰트를 사용할 것인가, 선의 색상과 굵기, 채움 무늬와 색상, 출력 방법 등등

 

DC를 얻는 방법(해제하는 방법)

> GetDC(), ReleaseDC()

>> DC 핸들을 얻는 일반적인 방법

> BeginPaint(), EndPaint()

>> WM_PAINT 메시지 루틴에서만 사용 가능한 전문적인 함수

 

GDI 함수

MoveToEx() : 커서의 위치를 이동

LineTo() : 기본 커서의 위치에서 인자로 넘겨주는 위치까지 선을 그려줌

Rectangle() : 사각형을 그려줌

Ellipse() : 원을 그려줌


과제

 

MoveToEx(), LineTo()로 그림그리기

미사일 쏘기

 

 

진도상 더블버퍼링이 없어서 깜빡임

PeekMessage가 아니라 GetMessage

Timer로 InvalidateRect()를 계속 호출해 WM_PAINT 메시지를 날림


 

참고 : http://www.soen.kr/

 

SoEn:소프트웨어 공학 연구소

 

www.soen.kr