64
Chapter 3 Chapter 3 Windows 9x/XP/2000 Windows 9x/XP/2000 프프프프프프 프프 프프프프프프 프프

Chapter 3 Windows 9x/XP/2000 프로그래밍의 기본

  • Upload
    rob

  • View
    65

  • Download
    0

Embed Size (px)

DESCRIPTION

Chapter 3 Windows 9x/XP/2000 프로그래밍의 기본. 이 장에서는. 윈도우즈의 역사 살펴보기 윈도우즈를 특별하게 만드는 다중작업 (Multitasking) 윈도우즈 프로그래밍의 기본 이해하기 헝가리식 표기법의 요소들 알아보기 간단한 윈도우즈 응용 프로그램 만들기 윈도우즈 응용 프로그램의 여러 부분들 확인하기. 윈도우즈의 역사 - 프로그래머의 관점. 스티브 잡스가 애플 매킨토시를 개발하면서 최초로 윈도우즈 기반 컴퓨터 환경을 대중에게 소개 - PowerPoint PPT Presentation

Citation preview

Page 1: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

Chapter 3Chapter 3

Windows 9x/XP/2000 Windows 9x/XP/2000 프로그래밍의 기본 프로그래밍의 기본

Page 2: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

2

이 장에서는이 장에서는 ......

• 윈도우즈의 역사 살펴보기• 윈도우즈를 특별하게 만드는 다중작업 (Multitasking)• 윈도우즈 프로그래밍의 기본 이해하기• 헝가리식 표기법의 요소들 알아보기• 간단한 윈도우즈 응용 프로그램 만들기• 윈도우즈 응용 프로그램의 여러 부분들 확인하기

Page 3: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

3

윈도우즈의 역사 윈도우즈의 역사 - - 프로그래머의 관점프로그래머의 관점

• 스티브 잡스가 애플 매킨토시를 개발하면서 최초로 윈도우즈 기반 컴퓨터 환경을 대중에게 소개

• 스크린상에 윈도우를 띄우는 아이디어는 오래 전에 제록스 팔로 알토 연구소에서 개발 .

• 마이크로소프트 윈도우즈 1.0 은 1985 년에 출시– 별다른 기능도 없었고 , 보기에도 별로였으며 , 너무 많은

컴퓨터 자원이 필요해서 당시의 8086 기계에서는 잘 돌지도 않았다 .

• 윈도우 2.0– 계산기 같은 프로그램을 개발할 수도 있었다 . – 같은 기능을 도스용으로 작성하면 더 적은 메모리를 사용하며

거의 열 배 정도 빠른 프로그램으로 만들 수 있었다 .

Page 4: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

4

윈도우즈의 역사 윈도우즈의 역사 - - 프로그래머의 관점프로그래머의 관점

• 1990 년에 윈도우즈 3.0 이 출시 – 이제는 정말로 보아줄만했다 – 도스 응용 프로그램이긴 했지만 다중작업을 지원– 수많은 응용 프로그램들이 존재

• 윈도우즈 3.1 은 1992 년 – 빠르고 , 보기도 좋았다 – 도스의 목숨을 위협 – 오디오와 비디오를 지원 – PC 를 소규모 워크스테이션에 필적하는 멀티미디어 및 업무용

컴퓨터로 변신시켰다 . – 그럼에도 불구하고 , 윈도우즈 3.1 은 여전히 32 비트

컴퓨터에서 돌아가는 16 비트 프로그램이었다 .

Page 5: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

5

윈도우즈의 역사 윈도우즈의 역사 - - 프로그래머의 관점프로그래머의 관점

• 1995 년 후반에 윈도우즈 95 – 인터페이스는 직관적이었고 – 커널은 진정한 다중작업과 다중스레드를 지원했으며– 네트워크와 멀티미디어 등의 많은 것을 지원했다– 프로그래머의 입장에서는 32 비트 운영체제였다 .– 처음으로 윈도우즈 프로그래밍을 만드는 작업이 꽤 쉬워졌다 .

• 윈도우즈 98 이 1998 년 후반– 수많은 새로운 기술들 (ActiveX, COM, DCOM, 동적 HTML)

을 추가한 윈도우즈 95 의 정리된 버전

Page 6: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

6

윈도우즈의 역사 윈도우즈의 역사 - - 프로그래머의 관점프로그래머의 관점

• 2000 년경에 윈도우즈 Me(Millennium Edition) – 윈도우즈 Me 는 일반 사용자들 대상 – 윈도우즈 98 을 다시 포장

• 윈도우즈 2000 – 대단히 진보된 운영체제로 , 거의 처음부터 완전하게 재 작성

• 2001 년에는 윈도우즈 XP – 일반사용자를 위해 출시 – 윈도우즈 98 이나 윈도우즈 Me 와 달리 , 윈도우즈 XP 는 탄탄한

운영체제 • 프로그램의 호환성

– 프로그래머의 관점에서 보면 , 윈도우즈 95, 98, Me, 2000 그리고 XP 들이 다 똑같다 . 제대로 작성된 Win32 응용 프로그램들은 대부분의 윈도우즈 버전에서 돌아간다 .

– DirectX 가 설치되어 있다면 , 윈도우즈 98 에서 작성한 프로그램도 윈도우즈 95/Me/XP 나 2000 이 깔린 컴퓨터에서 바꾸지 않고 실행될 것

Page 7: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

7

다중작업다중작업 (Multitasking) (Multitasking)

• 윈도우즈 운영체제에서 중요한 것은 다중작업을 할 수 있다는 것

• 동시에 여러 개의 프로그램을 실행시킬 수 있다 • 도스는 단일작업 (single-tasking) 운영체제• 윈도우즈 3.0 은 간단하게 도스 위에 GUI 를 올린

정도였으므로 , 한번에 하나의 프로그램만 실행• 게임과 워드 프로세서 , 페인트 프로그램들을 동시에

실행시킬 수 있다 • 이러한 프로그램들은 프로그램 , 프로세스 (process),

혹은 태스크 (task)라고 불린다

Page 8: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

8

다중스레딩다중스레딩 (multithreading) (multithreading)

• 하나의 응용 프로그램 안에 많은 작은 프로세스들이 있는 것으로 생각할 수 있다 .

• 프로그램들 내부에서 보다 작은 실행 스레드가 실행

• 워드 프로세서 – 입력을 다루기 위한

스레드 – 디스크에 저장 스레드– 철자 검사 스레드

Page 9: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

9

컴퓨터 자원을 절약 컴퓨터 자원을 절약 ? ?

• 프로세서가 하나인 컴퓨터를 일반적으로 더 빠르게 만들어주지는 않는다 .

• 첫 번째 프로세스가 대기하고 있는 상황에서 만약 다른 프로세스가 있다면 , 평소라면 놀고 있을 프로세스 사이클을 사용하도록 할 수 있다 .

• 둘 혹은 그 이상의 프로세서를 가진 컴퓨터라면 , 다중작업 OS 가 각각의 프로세서에 작업을 수행하게 되므로 , 더 빠른 결과를 얻을 수 있다 .

• 어떤 프로세서는 한 개 이상의 명령어를 실행시킬 수도 있다 . – 펜티엄 프로세서는 동시에 두 개의 명령어를 실행 (U 파이프에서 ,

다른 하나는 V 파이프에서 )– 파워 PC 나 펜티엄 II 의 경우는 최대 5 개까지 실행

Page 10: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

10

Why multitasking, multithreading?Why multitasking, multithreading?

• 다중스레딩을 통해서 직접 관리하지 않고도 여러 개의 하위 - 프로세스 ( 스레드 ) 들을 가지는 응용 프로그램을 만들 수 있다 .

• 오토마타 ( 자립적인 객체 ) 를 가능하게 한다 .

Page 11: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

11

윈도우즈 윈도우즈 MFC MFC 대 대 SDKSDK

• MFC 는 Microsoft Foundation Class 의 약자이고 , SDK 는 Software Development Kit 의 약자

• SDK– 초기 프로그래머들은 윈도우즈 프로그램을 만들기 위해 SDK

만을 사용 – SDK 는 윈도우즈 프로그래밍을 위한 많은 라이브러리와 헤

더 , 그리고 API(Application Programming Interface) 로 구성

• MFC– SDK 에 기반해서 만들어진 C++ 클래스들의 집합으로

윈도우즈 응용 프로그램을 좀더 쉽게 만들게 하기 위한 것 – 복잡… ^^

• 본 course 에서는 SDK 만 사용– 단순하고 , 간단한 프로그래밍

Page 12: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

12

이벤트이벤트 -- 기반 프로그래밍 모델 기반 프로그래밍 모델

• 윈도우즈는 이벤트 - 기반 운영체제이다 .

Page 13: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

13

이벤트이벤트 -- 기반 프로그래밍 모델기반 프로그래밍 모델

• 메인 루프가 반복되면서 메시지가 들어오는 대로 그때그때 비정기적으로 처리

• 메시지 (message)– 응용 프로그램에게 어떤 특정한 종류의 이벤트가 일어났음을

알리는 신호 – 윈도우즈나 다른 응용프로그램 , 또는 사용자로부터 발생

Page 14: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

14

이벤트의 예이벤트의 예

1. 윈도우 이벤트• 사용자가 윈도우의 크기를 변경• 윈도우즈는 응용 프로그램에게 윈도우의 변경된 크기를

알리는 메시지를 전송한다 .

2. 키보드 이벤트– 사용자가 키보드를 누르면– 키가 눌러졌다는 메시지가 응용 프로그램에 전송된다 . 응용

프로그램은 그 정보를 처리해서 ( 메뉴가 뜬다든가 하는 ) 적절한 행동을 수행한다 .

3. 그리기 (Drawing) 이벤트– 다른 윈도우가 응용 프로그램의 윈도우를 가렸다가

치워지면서 아래에 깔린 윈도우를 다시 그려야 된다면– 다시 칠하라는 메시지가 응용 프로그램에 전송된다 .

Page 15: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

15

메시지메시지

• 윈도우즈안의 모든 것은 메시지이다 . • 중요한 메시지들이 발생할 때마다 제대로

처리해주어야 한다 . • 프로그램이 어떤 윈도우즈 메시지를 처리하지 않을

때에는 , 무엇을 해도 상관없다 . – 그렇기 때문에 비디오 게임 로직을 내부적으로 따로 처리하고

윈도우즈 응용 프로그램으로 렌더링할 수 있는 것이다 .

• 물론 제대로 돌아가는 윈도우즈 응용 프로그램에는 매우 많은 세부적인 것들이 필요하지만 , 프로그램은 기본적으로 메시지를 처리하는 것이다 .

Page 16: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

16

타이핑을 좋아하는 이들을 위한 타이핑을 좋아하는 이들을 위한 헝가리식 표기법 헝가리식 표기법 • 마이크로소프트에 다니던 어떤 헝가리 사람 - 찰스

시모니 (Charles Simonyi) – 마이크로소프트의 모든 프로그래머들을 위한 표기법을 담당

Prefix Data Type (Base Type)

c char

by BYTE (unsigned char)

n short or int (refers to a number)

i int

x, y short (used as x-coordinate or y-coordinate)

cx, cy short (used as x or y; c stands for count)

b BOOL (int)

w UINT (unsigned int) or WORD (unsigned word)

l LONG (long)

dw DWORD (unsigned long)

fn function

s string

sz,str string terminated by 0 byte

lp 32-bit long pointer

h handle

msg message

Page 17: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

17

변수 명명변수 명명

• 핸들 (handle) – 다른 객체를 가리키는 32 비트 정수를 말한다 – 핸들의 자료형이 32 비트가 아닌 다른 것으로 바뀔 경우를

대비한다

• 전치사가 나오고 다음에 변수 이름 – 변수 이름에 포함된 단어의 앞 글자는 대문자 – 예

• szName: NULL 로 끝나는 문자열• dwHitList: WORD (H 와 L 이 대문자임을 알 수 있음 )

• lpData: 무언가를 가리키는 32 비트 포인터• lpwData: 하나의 WORD 를 가리키는 32 비트 포인터

– g 와 밑줄 (_) 을 앞에 넣어서 변수가 전역변수임을 나타내기도 한다 . 예를 들어 g_lTime 은 LONG 형인 전역 변수이다 .

Page 18: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

18

함수 명명함수 명명

• 함수는 단어들 사이에 밑줄 없이 단어 첫 자를 대문자로

• 예WORD IsFull(void);

int LoadBitmap(void);

BOOL IsRunning(void);

Page 19: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

19

타입정의와 상수타입정의와 상수

• 새로 정의되는 자료형이나 상수는 모두 대문자 • 밑줄을 사용하며 , 그렇게 엄밀하진 않다 . • 예

typedef unsigned char UCHAR;

typedef int BOOL;

#define MAX_BRAINS 100

Page 20: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

20

클래스클래스

• 함수 이름과 비슷하다 • 단어의 첫 글자는 대문자를 쓴다 • 모든 클래스에는 앞에 C 가 전치사로 붙는다• 예

class CPoint

{

public:

CPoint(void);

~CPoint();

private:

int x,y;

};

Page 21: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

21

표준 콘솔 표준 콘솔 C C 코드 코드

// PROG3_1.CPP - what’s up standard version#include <stdio.h>// main entry point for all standard DOS/console program

svoid main(void){ printf(“\nWhat’s up, world!”);} // end main

실행 : What’s up, world!C:\

Page 22: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

22

What’s up, world! - What’s up, world! - 윈도우즈 스타일 윈도우즈 스타일

// PROG3_2.CPP - A simple message box#define WIN32_LEAN_AND_MEAN#include <windows.h>#include <windowsx.h>// main entry point for all windows programsint WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow){

// call message box APIMessageBox(NULL, “What’s up, world!”,

“My First Windows Program”,MB_OK);// exit programreturn(0);

} // end WinMain

Page 23: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

23

MessageBox() MessageBox() 함수 함수

int MessageBox(

HWND hWnd, // handle of parent window

LPCTSTR lpText, // pointer to message string

LPCTSTR lpCaption, // pointer to title string

UINT uType); // style of message box

Page 24: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

24

실제 윈도우즈 응용 프로그램의 부분들 실제 윈도우즈 응용 프로그램의 부분들

1. Win32 라이브러리 지정2. include 파일 사용3. WinMain() 함수로 진입점 (entry point) 지정4. 윈도우즈 클래스 지정5. 윈도우즈 클래스 등록6. 윈도우 생성7. 윈도우 보이기8. 필요에 따라 이벤트 루프 마련하기9. 이벤트 처리기 (event handler) 마련하기

Page 25: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

25

Win32 Win32 라이브러리라이브러리

• 윈도우즈 프로그래밍 API – 정적 (static) 라이브러리 – 프로그램이 필요할 때 동적으로 로드 되는 DLL(Dynamic Link

Library)

• 라이브러리가 Win32 응용프로그램을 위한 기본 라이브러리에 들어있지 있지 않을 때에만 , 응용 프로그램에 따로 라이브러리를 추가해주면 된다 . – 예

• 멀티미디어 확장기능 : WINMM.LIB (where?)

• DirectX 응용 프로그램을 만들 때 : DirectX 라이브러리를 응용 프로그램에 추가

Page 26: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

26

include include 파일파일

• WINDOWS.H – 수많은 다른 include file 을 포함 … 직접 확인할것 !!

• WINDOWSX.H – 유용한 macro 들 포함

#define WIN32_LEAN_AND_MEAN // MFC 기능 사용 안함#include <windows.h>

#include <windowsx.h>

Page 27: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

27

WinMain() WinMain() 함수 함수 - 1- 1

• 윈도우즈 응용 프로그램의 진입점 • main() 과 유사

int WINAPI WinMain(HINSTANCE hinstance,

HINSTANCE hprevinstance,

LPSTR lpcmdline,

int ncmdshow);– 함수의 형이 WINAPI 로 선언 : 함수가 PASCAL 호출 규약을

사용하며 , 32 비트라는 것을 의미 – hinstance : 응용 프로그램 인스턴스의 핸들 – hprevinstance 는 거의 쓸모가 없는데 이전 인스턴스의 핸들에

사용 – lpcmdline 이란 인자는 명령행 인자를 가리키는 포인터

Page 28: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

28

WinMain() WinMain() 함수 함수 - 2- 2

• lpcmdline 과 argv 의 차이 – Command Line: APP1.EXE FILE1.BMP FILE2.BMP– argv

• arvg[0] = “APP1.EXE”

• argv[1] = “FILE1.BMP”

• argv[2] = “FILE2.BMP”

– lpcmdline = “FILE1.BMP FILE2.BMP” : 하나의 스트링

Page 29: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

29

WinMain() WinMain() 함수 함수 - 3- 3

• WinMain() 함수의 마지막 인자는 ncmdshow • 윈도우즈 응용 프로그램이 초기에 보여지는 방식을 결정 • SW_SHOWNORMAL 인 경우가 많다 .

Value Action

SW_SHOW Shows the window in its default size and position

SW_SHOWNORMAL Shows the window in its default size and position

SW_SHOWMAXIMIZED Shows the window in a maximized state

SW_SHOWMINIMIZED Shows the window in a minimized state

Page 30: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

30

윈도우즈 클래스윈도우즈 클래스

• C++ 의 개념은 이미 윈도우즈의 디자인에 깊이 뿌리 박혀 있다 .

• 윈도우즈에 있는 모든 객체는 하나의 윈도우 (window)이다 . ( 버튼이나 , 스크롤바 , 텍스트 상자 )

• 윈도우즈의 각각의 객체들은 기본 윈도우 클래스로부터 상속 받은 윈도우 형태중 하나에 속한다 .

• 자신만의 윈도우를 만들기 위해서는 , 하나의 윈도우의 클래스를 만들어야 한다 .

Page 31: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

31

윈도우즈 클래스윈도우즈 클래스

• 윈도우의 클래스란 특정한 윈도우의 속성들을 지정하는 것 • 하나의 윈도우즈 클래스를 정의하면 , 그 클래스에 속한 윈도우를

원하는 개수만큼 생성할 수 있다 .typedef struct _WNDCLASS{

UINT style; // style flagsWNDPROC lpfnWndProc; // pointer to event handlerint cbClsExtra; // extra bytesint cbWndExtra; // extra bytesHANDLE hInstance; // handle of instanceHICON hIcon; // handle to iconHCURSOR hCursor; // handle to cursorHBRUSH hbrBackground; // handle to background brushLPCTSTR lpszMenuName; // name of menuLPCTSTR lpszClassName; // name of class

} WNDCLASS;WNDCLASS wndclass; // a declaration of a window class

Page 32: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

32

StyleStyle

• 윈도우가 어떻게 보이는지 , 크기는 변경가능한지 , 다시 그리는 일은 누가 하는지 , 그것이 처리할 수 있는 메시지는 어떤 종류인지 등의 조건을 제어

• 가장 일반적인 경우 :wndclass.style = CS_DBLCLKS | CS_OWNDC |

CS_HREDRAW | CS_VREDRAW;

– 윈도우 크기 변경시 메시지 – 더블클릭시 메시지– 자신의 장치 콘텍스트 (Device Context) 를 가짐으로써

윈도우를 그리는 속도를 향상

Page 33: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

33

lpfnWndProc lpfnWndProc 속성 속성

• 이벤트 처리기 함수를 가리키는 함수 포인터

wndclass.lpfnWndProc = WindowProc;

LRESULT CALLBACK WindowProc(HWND hWnd, // the window

UINT msg, // the message itself

WPARAM wParam, // more info on message

LPARAM lParam);// more info on message

Page 34: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

34

cbClsExtracbClsExtra 와 와 cbWndExtra cbWndExtra

• 사용하는 사람은 별로 없는 것 같다 • 윈도우즈 클래스나 윈도우즈의 데이터를 위한 여분의 공간을 저장하는 역할

• 둘 다 0 으로

wndclass.cbClsExtra = 0;

wndclass.cbWndExtra = 0;

Page 35: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

35

hInstance hInstance

• 응용 프로그램의 인스턴스를 저장 • 그냥 WinMain() 의 hinstance 인자로 지정

wndclass.hInstance = hinstance; // from winmain

Page 36: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

36

hIcon, hCursorhIcon, hCursor

• hIcon– 응용 프로그램이 최소화되거나 바로가기로 표시될 때 보이게

되는 아이콘의 핸들

• hCursor– 응용 프로그램의 포인터가 되는 커서의 핸들

• 미리 만들어놓은 것들에서 리소스로 로드되거나 , 또는 내장된 기본값을 사용

wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);

Page 37: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

37

표준 아이콘과 커서표준 아이콘과 커서Constant Icon

IDI_APPLICATION Default application icon

IDI_ASTERISK Asterisk

IDI_EXCLAMATION Exclamation point

IDI_HAND Hand-shaped icon

IDI_QUESTION Question mark

Constant Cursor

IDC_ARROW Standard arrow

IDC_CROSS Crosshair

IDC_IBEAM Text I-beam

IDC_NO Slashed circle

IDC_WAIT Hourglass

Page 38: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

38

hbrBackground hbrBackground

• 배경 브러시에 대한 핸들 • 윈도우즈는 그리는 것을 위해 브러시와 펜이라는

도구를 사용 wndclass.hbrBackground= (HBRUSH)GetStockObject(BLACK_BRUSH);

Value Brush

BLACK_BRUSH Black brush

DKGRAY_BRUSH Dark gray brush

GRAY_BRUSH Gray brush

LTGRAY_BRUSH Light gray brush

WHITE_BRUSH White brush

Page 39: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

39

lpszMenuName lpszMenuName

• 윈도우즈에 추가되는 메뉴 리소스의 이름 • 지금은 메뉴 속성을 NULL 로 … (4 장에서 )

wndclass.lpszMenuName= NULL;

Page 40: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

40

lpszClassName lpszClassName

• 새로 만들어진 윈도우즈 클래스를 부르는 이름 • 보통 "WINCLASS1" 과 같은 이름을 사용

wndclass.lpszClassName = “WINCLASS1”;

Page 41: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

41

윈도우즈 클래스 등록하기윈도우즈 클래스 등록하기

• 윈도우 클래스를 생성한 다음에는 이를 등록 • 윈도우즈가 그 윈도우 클래스에 대해서 알게 되고 ,

클래스의 ASCII 이름을 통해서 윈도우를 생성할 수 있다 .

ATOM RegisterClass(CONST WNDCLASS *lpWndClass);

또는

if (RegisterClass(&wndclass)==0)

{

// error

} // end if

Page 42: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

42

윈도우 생성윈도우 생성

• CreateWindow() 함수 HWND CreateWindow( LPCTSTR lpClassName, // pointer to class name (string) LPCTSTR lpWindowName, // pointer to window title (string) DWORD dwStyle, // windows style flags int x, // horizontal position of window int y, // vertical position of window int nWidth, // width of window int nHeight, // height of window HWND hWndParent, // handle to parent (usually NULL) HMENU hMenu, // handle to menu (usually NULL) HANDLE hInstance, // handle to application instance LPVOID lpParam // pointer to startup creation data ); // don’t worry about it (NULL)

Page 43: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

43

CreateWindowCreateWindow

• lpClassName 은 CreateWindow() 를 호출하기 전에 등록한 윈도우즈 클래스의 이름이다 .

• lpWindowName 은 윈도우의 타이틀바 (title bar) 에 나오는 "My Window" 같은 문자열이다 .

• x 와 y 는 윈도우가 열리는 화면의 위치이다 .• nWindth 와 hHeight 는 윈도우의 크기가 몇 픽셀인지를 나타낸다 .• hWndParent 는 부모 윈도우의 핸들이다 . 이 경우에는 항상 NU

LL 로 한다 .• hMenu 는 윈도우 메뉴의 핸들이다 . 메뉴를 추가하는 것은

윈도우즈 클래스 등록시에 이루어지기 때문에 이 값 또한 NULL로 하면 된다 .

• lParam 은 조금 심화된 내용이다 . 일단은 NULL 이라고 하라 .

Page 44: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

44

dwStyle dwStyle

Value Action

WS_OVERLAPPED Creates an overlapped window. An overlapped window has a title bar and a border.

WS_OVERLAPPEDWINDOW Creates an overlapped window with all the controls and a system menu useful for standard Windows applications.

WS_POPUP Creates a plain pop-up window. This flag is the simplest and is what I use for all the DirectX applications in this book.

WS_POPUPWINDOW Creates a pop-up window with a border and a system menu.

WS_VISIBLE Creates a window that is initially visible; with this style a call to ShowWindow() is not needed.

WS_VSCROLL Creates a window that has a vertical scroll bar.

WS_HSCROLL Creates a window that has a horizontal scroll bar.

WS_MAXIMIZE Creates a window that is initially maximized.

WS_MINIMIZE Creates a window that is initially minimized.

Page 45: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

45

CreateWindow CreateWindow 사용의 예사용의 예

// define global to save window handle in

HWND main_window_handle = NULL;

main_window_handle =

CreateWindow(“WNDCLASS1”, // preregistered class

“My First Window”, // title of window

WS_OVERLAPPEDWINDOW | WS_VISIBLE, // flags

100,100, // position

320,200, // size

NULL, // handle to parent

NULL, // handle to menu

hinstance, // instance from WinMain

NULL);

Page 46: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

46

크기와 위치를 지정하지 않은 예크기와 위치를 지정하지 않은 예

main_window_handle =

CreateWindow(“WNDCLASS1”, // preregistered class

“My First Window”, // title of window

WS_OVERLAPPEDWINDOW | WS_VISIBLE, // flags

CW_USEDEFAULT,CW_USEDEFAULT, // position

CW_USEDEFAULT,CW_USEDEFAULT, // size

NULL, // handle to parent

NULL, // handle to menu

hinstance, // instance from WinMain

NULL);

Page 47: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

47

윈도우 출력윈도우 출력

• WS_VISIBLE 플래그를 사용했기 때문에 윈도우는 생성하고 나서 바로 보일 것이기 때문이다 .

• 이 플래그를 넣지 않는 경우나 조금 다른 방식으로 윈도우를 열고 싶다면 , ShowWindow() 을 사용

• ShowWindow() 는 윈도우를 감추는 기능도 있다 .

BOOL ShowWindow(HWND hWnd, // handle of window

int nCmdShow); // show state of window

nCmdShow: 다음의 표

Page 48: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

48

nCmdShow: Command for ShowWindonCmdShow: Command for ShowWindow()w()

Value Action

SW_SHOW Activates the window and displays it in its current size and position.

SW_HIDE Hides the window.

SW_RESTORE Activates and displays the window from either a minimized or maximized state.

SW_MAXIMIZE Maximizes the specified window.

SW_MINIMIZE Minimizes the specified window.

SW_SHOWMAXIMIZED Activates the window and displays it as a maximized window.

SW_SHOWMINIMIZED Activates the window and displays it as a minimized window.

Page 49: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

49

UpdateWindow UpdateWindow

• 윈도우를 갱신하거나 다시 그리게 할 수 있다 .

BOOL UpdateWindow(HWND hWnd);

• Example of ShowWindow() and UpdateWindow()

// register window class...

// create window...

// now show and update window

ShowWindow(main_window_handle, SW_SHOW);

UpdateWindow(main_window_handle);

Page 50: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

50

WinMain() and the event loopWinMain() and the event loop

• 메인 이벤트 루프는 메시지 큐 (message queue)로부터 메시지들을 얻어서 , 거르거나 (filter) 번역한 (translate) 뒤에 , 이벤트 처리기로 전달한다 .

• 메인 이벤트 루프가 메시지를 처리하지 않을 때에는 , 게임 로직과 같은 다른 일들을 처리한다 .

Page 51: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

51

메인 이벤트 루프 메인 이벤트 루프

Page 52: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

52

MSG MSG

typedef struct tagMSG

{HWND hwnd; // window the message was sent to

UINT message; // the message id

WPARAM wParam; // further info about the message

LPARAM lParam; // further info about the message

DWORD time; // time of the message event

POINT pt; // contains the mouse state when

} MSG; // the message occurred

Page 53: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

53

이벤트 루프를 만들기 세 개의 중요한 함수 이벤트 루프를 만들기 세 개의 중요한 함수

• GetMessage• TranslateMessage• DispatchMessage

Page 54: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

54

GetMessageGetMessage

• 메시지 큐로부터 메시지를 얻어 오는 역할을 할 뿐이다 .

• 큐가 비어있으면 , GetMessage() 는 메시지를 기다린다 .

BOOL GetMessage(LPMSG lpMsg, // ptr to message structure

HWND hWnd, // handle of window

UINT wMsgFilterMin, // first message

UINT wMsgFilterMax); // last message

Page 55: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

55

TranslateMessageTranslateMessage

• 단축키 (Accelerator; Ctrl+A 같은 것을 말함 ) 명령을 보다 기본적인 이벤트로 번역 (translate) 또는 변환한다 .

BOOL TranslateMessage(

CONST MSG *lpMsg); // ptr to message structure

Page 56: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

56

DispatchMessageDispatchMessage

• GetMessage() 가 얻어오고 , TranslateMessage() 가 변환한 MSG 구조체를 처리하기 위해 이벤트 처리기로 보낸다 .

LONG DispatchMessage(

CONST MSG *lpmsg); // ptr to message structure

Page 57: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

57

메인 이벤트 루프 메인 이벤트 루프

MSG msg; // holds the message// enter in the main event loopwhile(GetMessage(&msg,NULL,0,0)) { // translate the accelerator keys TranslateMessage(&msg); // send the message to the event handler DispatchMessage(&msg); } // end while

– 이 방법의 문제는 메시지 큐에 메시지가 나타날 때까지 GetMessage() 에서 기다린다는 것이다 .

– 이러한 지연은 게임에는 적합하지 않다 . – 왜냐하면 메인 루프는 지속적으로 게임 로직을 수행하고 다음 그래픽

프레임을 렌더링해야 하기 때문이다 . – 따라서 , 보다 실시간을 위한 방법이 필요하다 .

Page 58: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

58

PeekMessage PeekMessage

• 메시지가 큐에서 대기하고 있는지 검사하여 , 메시지가 있을 때에만 처리할 수 있다 .

• PeekMessage() 함수를 사용하여 , 메시지를 체크하여 , 있다면 처리하고 없으면 실시간에 필요한 코드를 수행하는 이벤트 루프를 만들 수 있다 .

MSG msg; // holds the message// loop until there is a WM_QUIT messagewhile(1) { // is there a message? if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { // test if this is a quit if (msg.message == WM_QUIT) break; // translate any accelerator keys TranslateMessage(&msg); // send the message to the window proc DispatchMessage(&msg); } // end if message // main game processing goes here } // end while

Page 59: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

59

이벤트 처리기이벤트 처리기

• WinProc 는 처리하고 싶은 모든 메시지들을 처리하기 위해 직접 작성해야만 하는 함수

• 윈도우즈는 수십 가지의 메시지를 보내지만 , 그 중에서 관심 있는 것들만을 처리해야 한다 .

• 윈도우의 기본 메시지 처리기인 DefWindowProc() 는 여러분이 처리하지 않는 메시지를 처리한다 .

Page 60: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

60

WinProcWinProc 의 의 PrototypePrototype

LRESULT CALLBACK WindowProc(HWND hWnd, // the window

UINT msg, // the message itself

WPARAM wParam, // more info on message

LPARAM lParam);// more info on message

• hWnd : 메시지를 보내는 윈도우의 핸들이다 . 보통은 윈도우가 하나밖에 없는 경우가 많다 . 그러나 , 많은 윈도우즈 함수들은 윈도우 핸들을 인자로 가지므로 이 값은 꼭 필요하다 .

• msg : 표준 MSG 는 아니고 , 그저 처리될 윈도우즈 메시지의 코드나 ID 를 나타낸다 . 표 3-8 에는 일반적인 윈도우즈 메시지 목록이 나와있는데 , 그저 일부에 불과하다 .

• wParam : 메시지를 보다 자세하게 표현하기 위해 필요하다 . 숫자나 ID, 분류 등이 될 수 있다 .

• lParam : 메시지를 보다 자세하게 표현하기 위해 필요하다 . 역시 숫자나 ID, 분류 등이 될 수 있다 .

Page 61: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

61

중요한 윈도우즈 메시지 중요한 윈도우즈 메시지 Value Message

WM_ACTIVATE A window is activated or becomes the focus.

WM_CLOSE A window is closed.

WM_CREATE A window is first created.

WM_DESTROY A window is about to be destroyed.

WM_MOVE A window has been moved.

WM_MOUSEMOVE The mouse has been moved.

WM_KEYUP A key is released.

WM_KEYDOWN A key is pressed.

WM_TIMER A timer event occurs.

WM_USER Enables you to send messages.

WM_PAINT A window needs repainting.

WM_QUIT A Windows application terminates.

WM_SIZE Sent when a window has changed size.

Page 62: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

62

이벤트 처리기의 예 이벤트 처리기의 예 - 1- 1

LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam){// this function will handle all messages sent to your windowHDC hdc; // device context used for graphicsPAINTSTRUCT ps; // also used for graphics// find out what the message wasswitch(msg) { case WM_CREATE: { // this message is sent when the window is first created, // so do your initialization here // return to event loop return(0); } break;

Page 63: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

63

이벤트 처리기의 예 이벤트 처리기의 예 - 2- 2

case WM_PAINT: { // this message is very important; it is sent when your window needs // repainting. Windows doesn’t know what you want in your window, so // in this example we simply tell Windows that we painted window, so // that it won’t keep sending get the graphics device context hdc = BeginPaint(hwnd,&ps); // make GDI graphics calls here release the graphics device context EndPaint(hwnd,&ps); // return to event loop return(0); } break;

Page 64: Chapter 3 Windows 9x/XP/2000  프로그래밍의 기본

64

이벤트 처리기의 예 이벤트 처리기의 예 - 3- 3

case WM_DESTROY: { // this message is sent when the window is to be destroyed; when this // happens, you must post a quit message to the event queue, which // sends a WM_QUIT to the message queue PostQuitMessage(0); // return to event loop return(0); } break; default: break; } // end switch// let windows handle anything you didn’treturn(DefWindowProc(hwnd, msg, wparam, lparam));} // end WindowProc