##1. 기본예제분석 / 그림그리기
핸들(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