####################################################
윈도우 분석
3. Win32API의 핵심인 기본구조부터 살펴보자
1) 윈도우 프로그램의 기본구조
2) 윈도우클래스 등록하기
3) 메세지루프
4) 윈도우 프로시저 작성
####################################################
1) 윈도우 프로그램의 기본구조
어떤 프로그램이든 main()함수를 가지고 있다. 모든 윈도우프로그램은 반드시 WinMain()으로
시작한다.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdLine)
파라미터 설명
-------------------------------------------------------------------
파라미터 타입 이름 설명
----------------------------------------------------------------
HINSTANCE hInstance 인스턴스 핸들 (윈도우운영체제하에서 실행되는 프로그램은 하나씩 가진다)
HINSTANCE hPrevInstance 의미없다 16비트 호환성 때문에 존재할 뿐이다
LPSTR lpszCmdParam 프로그램에 전달되는 명령행인자이다
int nCmdShow 프로그램이 처음 뜰때 메인윈도우를 화면에 표시하는 방법
--------------------------------------------------------------------
참고)LPSTR 은 long pointer 이며 16bit의 산물이다
일부 윈도우즈 응용프로그램은 프로그램이 시작될때 파일을 메모리로 불러오기위해 사용한다
윈도우프로그램을 작성하려면
1. 윈도우 클래스를 등록하고
2. 윈도우를 생성하고
3, 화면에 보여주는것이다
그 과정은 WinMain함수에서 발생한다
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=(WNDPROC)WndProc; // 윈도우프로시저의 주소
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
// 미리 정의된 아이콘에 대한 핸들을 알아내기위해 첫번째인자는 NULL로 한다
// 1. 등록
RegisterClass(&WndClass);
// 2. 생성
hWnd=CreateWindow(lpszClass, // 윈도우 클래스이름
lpszClass, // 윈도우 캡션
WS_OVERLAPPEDWINDOW, // 윈도우 유형
CW_USEDEFAULT, // 초기 x 위치
CW_USEDEFAULT, // 초기 y 위치
CW_USEDEFAULT, // 초기 x 크기
CW_USEDEFAULT, // 초기 y 크기
NULL, // 부모윈도우 핸들
(HMENU)NULL, // 윈도우메뉴 핸들
hInstance, // 프로그램 인스턴스 핸들
NULL); // 생성매개변수
// 3.화면에 show
ShowWindow(hWnd, iCmdShow);
2) 윈도우클래스 등록하기
버튼이나 콤보박스와 같이 대부분의 프로그램에서 공통적으로 사용되는 윈도우에서부터 한글에서 사용되
는것과 같은 독특한 윈도우등 각각의 윈도우는 그들만의 고유한 속성을 가지고 있다.
윈도우의 모양이 다르다는것은 바로 윈도우클래스에서 가지고 있는 공통적인 속성의 집합을 각각의
윈도우에 맞게 등록하기 때문이다. 이렇게 윈도우가 가지는 속성을 총칭해서 윈도우 클래스라고 한다
윈도우는 반드시 하나의 윈도우클래스를 기반으로 만들어져야 한다
그럼 우리가 많이 사용하는 버튼의 경우에는 어떨까? 버튼윈도우의 클래스이름은 BUTTON 이다.
모든 버튼윈도우는 "Button" 이라는 동일한 이름을 가지고 있으며, 동일하게 동작한다.
이말은 같은 윈도우클래스를 가진 윈도우는 동일하게 동작을 한다는 의미이다. 즉, 같은 "Button"
클래스를 가진 버튼윈도우는 마우스이벤트에 대해 모두 동일하게 반응을 보인다.
버튼, 콤보박스, 에디터박스 등과같은 컨트롤 윈도우들은 이미 윈도우클래스가 등록되어 있는 것들이다.
버튼과 같이 윈도우클래스가 이미 등록되어 있는 윈도우가 아닌 윈도우를 사용하려면 새로운 윈도우
클래스를 등록해야 한다.
3) 메세지루프
while(GetMessage(&Message,0,0,0)) //메세지큐로부터 메세지를 알아낸다
{
TranslateMessage(&Message); // 메세지를 번역한다. 예)키보드로부터 메세지를 받아온다
DispatchMessage(&Message); // 윈도우 프로시저에 메세지를 보낸다
}
return Message.wParam;
프로그램은 스스로 사용자로부터의 키보드와 마우스의 입력을 읽을수 있도록 해야 한다.
Windows는 현재 Windows에서 실행되고 있는 각각의 Windows 프로그램에 대해 메세지 큐를
유지한다. 입력이벤트가 발생하는 경우 Windows는 이벤트를 메세지로 번역하여 프로그램의 메세지 큐
에 저장한다 이에 따라서 메세지루프 코드를 실행하여 메세지 큐로부터 메세지를 얻어온다.
GetMessage(&msg,NULL,0,0)
메세지루프를 시작시키는 GetMessage호출은 메세지큐로부터 메세지를 얻어온다. 이 호출은 MSG구
조체에 대한 포인터를 전달한다 Windows는 메세지구조체의 필드에 메세지큐로부터의 구조체필드값을
삽입한다
hwnd 메세지가 향하는 윈도우에 대한 핸들
message 메세지식별자이다 이것은 메세지를 식별해주는 숫자이다
각각의 메세지에 대해 windows헤더파일에 식별자 WM_ 으로 시작되는 해당 식별자가
정의되어 있다
4) 윈도우 프로시저 작성
모든 윈도우는 하나의 윈도우프로시저를 갖는다
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,
WPARAM wParam,LPARAM lParam)
{
// 여기에 코드를 작성한다
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
각각의 윈도우들은 서로 독립적으로 동작하며, 운영체제가 보내는 메세지를 받는다. 운영체제는 윈도우
에 메세지를 보낼때 윈도우가 제공하는 프로시저를 호출한다.
이 말은 모든 윈도우는 자신만의 윈도우 프로시저를 갖는다는것을 의미한다.
윈도우 프로시저란 운영체제가 윈도우에게 메세지를 보낼때 호출하는 함수이다.
윈도우 프로시저는 콜백함수이다 위에서 확인할수 있듯이 함수포인터이다.
핸들은 단순히 개체를 나타내는 숫자이다.
프로그램은 거의 항상 windows함수를 호출하여 핸들을 알아낸다.
프로그램은 다른 windows함수의 핸들을 사용하여 개체를 참조한다.
화면에 출력되는 모든 글자와 그림은 GDI ( Gdi.dll)를 통해야 한다.
DC는 출력에 필요한 모든 정보를 가지고있는 구조체이다 (GDI에 의해 관리된다)
그러므로 HDC는 DC에 관한 핸들을 얻는다 핸들이란 일종의 Passport라고 생각하면 된다
LRESULT CALLBACK WndProc (
HWND hWnd, // 메세지를 받을 윈도우를 나타내는
//윈도우핸들(콜백함수이므로 반드시 필요하다
UINT iMessage, // 윈도우에 보내지는 메세지
WPARAM wParam, // 메세지와 함께 보내지는 부가정보( 명령체계메세지종류 )
LPARAM lParam) // 메세지와 함께 보내지는 부가정보( 실제크기 )
윈도우 분석
3. Win32API의 핵심인 기본구조부터 살펴보자
1) 윈도우 프로그램의 기본구조
2) 윈도우클래스 등록하기
3) 메세지루프
4) 윈도우 프로시저 작성
####################################################
1) 윈도우 프로그램의 기본구조
어떤 프로그램이든 main()함수를 가지고 있다. 모든 윈도우프로그램은 반드시 WinMain()으로
시작한다.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdLine)
파라미터 설명
-------------------------------------------------------------------
파라미터 타입 이름 설명
----------------------------------------------------------------
HINSTANCE hInstance 인스턴스 핸들 (윈도우운영체제하에서 실행되는 프로그램은 하나씩 가진다)
HINSTANCE hPrevInstance 의미없다 16비트 호환성 때문에 존재할 뿐이다
LPSTR lpszCmdParam 프로그램에 전달되는 명령행인자이다
int nCmdShow 프로그램이 처음 뜰때 메인윈도우를 화면에 표시하는 방법
--------------------------------------------------------------------
참고)LPSTR 은 long pointer 이며 16bit의 산물이다
일부 윈도우즈 응용프로그램은 프로그램이 시작될때 파일을 메모리로 불러오기위해 사용한다
윈도우프로그램을 작성하려면
1. 윈도우 클래스를 등록하고
2. 윈도우를 생성하고
3, 화면에 보여주는것이다
그 과정은 WinMain함수에서 발생한다
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=(WNDPROC)WndProc; // 윈도우프로시저의 주소
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
// 미리 정의된 아이콘에 대한 핸들을 알아내기위해 첫번째인자는 NULL로 한다
// 1. 등록
RegisterClass(&WndClass);
// 2. 생성
hWnd=CreateWindow(lpszClass, // 윈도우 클래스이름
lpszClass, // 윈도우 캡션
WS_OVERLAPPEDWINDOW, // 윈도우 유형
CW_USEDEFAULT, // 초기 x 위치
CW_USEDEFAULT, // 초기 y 위치
CW_USEDEFAULT, // 초기 x 크기
CW_USEDEFAULT, // 초기 y 크기
NULL, // 부모윈도우 핸들
(HMENU)NULL, // 윈도우메뉴 핸들
hInstance, // 프로그램 인스턴스 핸들
NULL); // 생성매개변수
// 3.화면에 show
ShowWindow(hWnd, iCmdShow);
2) 윈도우클래스 등록하기
버튼이나 콤보박스와 같이 대부분의 프로그램에서 공통적으로 사용되는 윈도우에서부터 한글에서 사용되
는것과 같은 독특한 윈도우등 각각의 윈도우는 그들만의 고유한 속성을 가지고 있다.
윈도우의 모양이 다르다는것은 바로 윈도우클래스에서 가지고 있는 공통적인 속성의 집합을 각각의
윈도우에 맞게 등록하기 때문이다. 이렇게 윈도우가 가지는 속성을 총칭해서 윈도우 클래스라고 한다
윈도우는 반드시 하나의 윈도우클래스를 기반으로 만들어져야 한다
그럼 우리가 많이 사용하는 버튼의 경우에는 어떨까? 버튼윈도우의 클래스이름은 BUTTON 이다.
모든 버튼윈도우는 "Button" 이라는 동일한 이름을 가지고 있으며, 동일하게 동작한다.
이말은 같은 윈도우클래스를 가진 윈도우는 동일하게 동작을 한다는 의미이다. 즉, 같은 "Button"
클래스를 가진 버튼윈도우는 마우스이벤트에 대해 모두 동일하게 반응을 보인다.
버튼, 콤보박스, 에디터박스 등과같은 컨트롤 윈도우들은 이미 윈도우클래스가 등록되어 있는 것들이다.
버튼과 같이 윈도우클래스가 이미 등록되어 있는 윈도우가 아닌 윈도우를 사용하려면 새로운 윈도우
클래스를 등록해야 한다.
3) 메세지루프
while(GetMessage(&Message,0,0,0)) //메세지큐로부터 메세지를 알아낸다
{
TranslateMessage(&Message); // 메세지를 번역한다. 예)키보드로부터 메세지를 받아온다
DispatchMessage(&Message); // 윈도우 프로시저에 메세지를 보낸다
}
return Message.wParam;
프로그램은 스스로 사용자로부터의 키보드와 마우스의 입력을 읽을수 있도록 해야 한다.
Windows는 현재 Windows에서 실행되고 있는 각각의 Windows 프로그램에 대해 메세지 큐를
유지한다. 입력이벤트가 발생하는 경우 Windows는 이벤트를 메세지로 번역하여 프로그램의 메세지 큐
에 저장한다 이에 따라서 메세지루프 코드를 실행하여 메세지 큐로부터 메세지를 얻어온다.
GetMessage(&msg,NULL,0,0)
메세지루프를 시작시키는 GetMessage호출은 메세지큐로부터 메세지를 얻어온다. 이 호출은 MSG구
조체에 대한 포인터를 전달한다 Windows는 메세지구조체의 필드에 메세지큐로부터의 구조체필드값을
삽입한다
hwnd 메세지가 향하는 윈도우에 대한 핸들
message 메세지식별자이다 이것은 메세지를 식별해주는 숫자이다
각각의 메세지에 대해 windows헤더파일에 식별자 WM_ 으로 시작되는 해당 식별자가
정의되어 있다
4) 윈도우 프로시저 작성
모든 윈도우는 하나의 윈도우프로시저를 갖는다
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,
WPARAM wParam,LPARAM lParam)
{
// 여기에 코드를 작성한다
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
각각의 윈도우들은 서로 독립적으로 동작하며, 운영체제가 보내는 메세지를 받는다. 운영체제는 윈도우
에 메세지를 보낼때 윈도우가 제공하는 프로시저를 호출한다.
이 말은 모든 윈도우는 자신만의 윈도우 프로시저를 갖는다는것을 의미한다.
윈도우 프로시저란 운영체제가 윈도우에게 메세지를 보낼때 호출하는 함수이다.
윈도우 프로시저는 콜백함수이다 위에서 확인할수 있듯이 함수포인터이다.
핸들은 단순히 개체를 나타내는 숫자이다.
프로그램은 거의 항상 windows함수를 호출하여 핸들을 알아낸다.
프로그램은 다른 windows함수의 핸들을 사용하여 개체를 참조한다.
화면에 출력되는 모든 글자와 그림은 GDI ( Gdi.dll)를 통해야 한다.
DC는 출력에 필요한 모든 정보를 가지고있는 구조체이다 (GDI에 의해 관리된다)
그러므로 HDC는 DC에 관한 핸들을 얻는다 핸들이란 일종의 Passport라고 생각하면 된다
LRESULT CALLBACK WndProc (
HWND hWnd, // 메세지를 받을 윈도우를 나타내는
//윈도우핸들(콜백함수이므로 반드시 필요하다
UINT iMessage, // 윈도우에 보내지는 메세지
WPARAM wParam, // 메세지와 함께 보내지는 부가정보( 명령체계메세지종류 )
LPARAM lParam) // 메세지와 함께 보내지는 부가정보( 실제크기 )
####################################################
윈도우 분석
2. 먼저 알아두어야 할 것
1).변수 명명법
2).대문자 식별자
3).데이타형
4).구조체
5).핸들
6).windows 헤더파일에 대해 살펴보자
####################################################
2. 먼저 알아두어야 할 것
아래의 내용은 어디까지나 참고 자료입니다. 절대 외우려구 하지마세요.
1).변수 명명법
------------------------------------------------------------------
접두어 원래말 의미
----------------------------------------------------------------
cb Count of Bytes 바이트수
dw double word 부호없는 long형 정수
h handle 윈도우, 비트맵, 파일등의 핸들
sz String terminated with a Zero 널종료 문자열
ch character 문자형
w Word 부호없는 정수형
i Integer 정수형
c char 8bit 캐릭터형
by BYTE(unsigned char)
n int
cx, cy x,y길이로 사용되는 int; c는 count를 나타낸다
b BOOL
f flag
l LONG
br BRUSH 그림 그릴때의 붓
s String 문자열
h HANDLE 핸들(손 ㅎㅎ)
p POINT 포인트
lp LONG POINT
sz Null Zero String 0문자로 종결되는 문자열 예)안녕하세요/0
fn function 함수
lpfn long point function
cb byte count byte의 카운트수
lpsz long point string zero long point형 문자열
-----------------------------------------------------------------
2).대문자 식별자
------------------------------------------------------------------
접두어 상수
----------------------------------------------------------------
CS 클레스 스타일 옵션
CW 윈도우생성옵션
DT 문자열그리기옵션
IDI 아이콘에대한 ID식별자
IDC 커서에대한 ID식별자
MB 메세지상자옵션
SND 사운드옵션
WM 읜도우메세지
WS 윈도우스타일
----------------------------------------------------------------
3).데이타형
-----------------------------------------------------
데이타형 의미
-----------------------------------------------------
BYTE unsigned char
WORD unsigned short
DWORD unsigned long
LONG long
LPSTR long형테인 char*
BOOL true, false
UINT 부호없는 정수
PSTR char*
WPARAM 부호없는 짧은 정수인 WORD
LPARAM singed long정수인 LONG
LRESULT LONG로 정의
------------------------------------------------------
4).구조체
-----------------------------------------------------
구조체 의미
-----------------------------------------------------
MSG 메세지구조체
WNDCLASS 윈도우 클래스 구조체
PAINTSTRUCT Paint 구조체
RECT Rectangle 구조체
-----------------------------------------------------
5).핸들
-----------------------------------------------------
식별자 의미
-----------------------------------------------------
HINSTANCE 프로그램자신의 '인스턴스'에대한 핸들
HWND 윈도우에 대한 핸들
HDC 장치 컨텍스트에 대한 핸들
-----------------------------------------------------
6).windows 헤더파일에 대해 살펴보자
대부분의 API 프로그램은 헤더파일로 windows.h 파일을 포함하고 있다. 이는 선행처리 지시어이다.
windows.h 파일에는 다른 windows헤더파일을 포함하는 마스터 include 파일이다.
이 헤더파일중에 가장 중요하고 기본적인 파일은 다음과 같다
windef.h 기본형식을 정의
winnt.h 유니코드지원을 위한 형식을 정의
winbase.h kernel함수
winuser.h 사용자 인터페이스함수
wingdi.h 그래픽장치 인터페이스함수
윈도우 분석
2. 먼저 알아두어야 할 것
1).변수 명명법
2).대문자 식별자
3).데이타형
4).구조체
5).핸들
6).windows 헤더파일에 대해 살펴보자
####################################################
2. 먼저 알아두어야 할 것
아래의 내용은 어디까지나 참고 자료입니다. 절대 외우려구 하지마세요.
1).변수 명명법
------------------------------------------------------------------
접두어 원래말 의미
----------------------------------------------------------------
cb Count of Bytes 바이트수
dw double word 부호없는 long형 정수
h handle 윈도우, 비트맵, 파일등의 핸들
sz String terminated with a Zero 널종료 문자열
ch character 문자형
w Word 부호없는 정수형
i Integer 정수형
c char 8bit 캐릭터형
by BYTE(unsigned char)
n int
cx, cy x,y길이로 사용되는 int; c는 count를 나타낸다
b BOOL
f flag
l LONG
br BRUSH 그림 그릴때의 붓
s String 문자열
h HANDLE 핸들(손 ㅎㅎ)
p POINT 포인트
lp LONG POINT
sz Null Zero String 0문자로 종결되는 문자열 예)안녕하세요/0
fn function 함수
lpfn long point function
cb byte count byte의 카운트수
lpsz long point string zero long point형 문자열
-----------------------------------------------------------------
2).대문자 식별자
------------------------------------------------------------------
접두어 상수
----------------------------------------------------------------
CS 클레스 스타일 옵션
CW 윈도우생성옵션
DT 문자열그리기옵션
IDI 아이콘에대한 ID식별자
IDC 커서에대한 ID식별자
MB 메세지상자옵션
SND 사운드옵션
WM 읜도우메세지
WS 윈도우스타일
----------------------------------------------------------------
3).데이타형
-----------------------------------------------------
데이타형 의미
-----------------------------------------------------
BYTE unsigned char
WORD unsigned short
DWORD unsigned long
LONG long
LPSTR long형테인 char*
BOOL true, false
UINT 부호없는 정수
PSTR char*
WPARAM 부호없는 짧은 정수인 WORD
LPARAM singed long정수인 LONG
LRESULT LONG로 정의
------------------------------------------------------
4).구조체
-----------------------------------------------------
구조체 의미
-----------------------------------------------------
MSG 메세지구조체
WNDCLASS 윈도우 클래스 구조체
PAINTSTRUCT Paint 구조체
RECT Rectangle 구조체
-----------------------------------------------------
5).핸들
-----------------------------------------------------
식별자 의미
-----------------------------------------------------
HINSTANCE 프로그램자신의 '인스턴스'에대한 핸들
HWND 윈도우에 대한 핸들
HDC 장치 컨텍스트에 대한 핸들
-----------------------------------------------------
6).windows 헤더파일에 대해 살펴보자
대부분의 API 프로그램은 헤더파일로 windows.h 파일을 포함하고 있다. 이는 선행처리 지시어이다.
windows.h 파일에는 다른 windows헤더파일을 포함하는 마스터 include 파일이다.
이 헤더파일중에 가장 중요하고 기본적인 파일은 다음과 같다
windef.h 기본형식을 정의
winnt.h 유니코드지원을 위한 형식을 정의
winbase.h kernel함수
winuser.h 사용자 인터페이스함수
wingdi.h 그래픽장치 인터페이스함수
####################################################
윈도우 분석
1. 윈도우란
1) 메세지기반(Message) 프로그램
2) 메세지큐
3) API를 이용한 윈도우프로그래밍
####################################################
1. 윈도우란
윈도우 분석 첫번째 시간입니다. 언어는 VC++를 사용합니다. MFC는 무겁기때문에 나중에 다루도록
하겠습니다.
일반적으로 VC++ 서적을 보시면 첫 부분에 윈도우에 대해 다루고있습니다. 그러나
설명이 부족한 부분도 있고, 너무 많아 전체적인 그림을 이해하기가 힘들때가 많져, 일단 제가
이해하구 있는 윈도우의 그림을 보여드리도록 하겠습니다. 이곳에서 자세한 설명까지 올리지는
않겠습니다. 설명이 부족한 부분은 책으로 충분히 찾아보실수 있을 겁니다. 아래 내용은
IT Education Center의 무료 강의 자료를 정리한 것입니다.
1) 메세지기반(Message) 프로그램
윈도우 어플리케이션은 OS와 어떤 특별한 상호작용을 통해 동작한다. 이러한 상호작용은 운영체제와
어플리케이션사이에 메세지라는 형식의 데이타를 주고 받음으로써 이루어진다
윈도우 어플리케이션은 OS가 보내는 메세지에 따라서 동작한다. 어플리케이션은 메세지를 통해서
OS로부터 명령이나 정보를 받아 메세제에 해당하는 적절한 행동을 수행함으로써 프로그램이 동작한다
즉, 어플리케이션이 하나의 윈도우를 만들겠다고 OS에 알리면 OS는 윈도우를 하나 만들라는 메세지를
어플리케이션이 보내고, 이 메세지를 받은 어플리케이션이 메세지를 처리함으로써 하나의 윈도우를
만든다.
사용자가 마우스로 윈도우를 클릭하면 OS는 어플리케이션에 마우스가 눌렸다는 메세지를 보내고 ,
키보드를 눌리면 어던 키보드가 눌렀는지에 대한 정보와 함께 키보드가 눌렀다는 메세지를 보낸다.
그래서 윈도우 어플리케이션을 작성한다는 것은 운영체제가 보내는 다양한 메세지를 어떻게
처리하는가에 대한 것이다
이말의 뜻은 정확히 무엇을 의미하는 것일까? 운영체제가 어플리케이션에 메세지를 보낸다는 것은
어플리케이션이 제공하는 하나의 함수를 호출한다는 것을 의미한다 이 함수를 윈도우프로시저라고
한다.
모든 윈도우는 하나의 윈도우 프로시저를 갖는다. 우리가 흔히 보는 버튼 컨트롤의 동작을 예를들어
보자. 버튼위에서 마우스를 누르면 버튼이 눌러진다 어떻게 버튼이 눌려지는 것일까? 모든 윈도우는
윈도우 프로시저를 가지고 있다 버튼에도 버튼윈도우에 해당하는 윈도우 프로시저가 있다
ㄱ) 마우스 왼쪽버튼을 누르면
ㄴ) 운영체제가 마우스가 눌린 버튼의 윈도우프로시저에게
마우스의 왼쪽 버튼이 눌렸다고 알린다
ㄷ) 버튼의 윈도우 프로시저는 이 메세지를 받고 버튼이
눌리는것처럼 버튼의 모양을 그린다 그럼으로써 버튼이 눌려지는것 처럼 보인다
그러면 화면에 떠있는 여러개의 윈도우중에서 어떻게 운영체제가 마우스를 누른 버튼윈도우의
프로시저를 호출할까? 메세지 큐 때문에 가능하다
2) 메세지큐
메세지큐에는 두종류가 있다. 운영체제가 관리하는 시스템메세지큐와 실행중인 각 프로그램마다
하나씩 가지고 있는 스레드메세지큐가 있다. 시스템메세지큐에는 발생되는 모든 이벤트가 메세지
형태로 큐에 쌓인다. 이때 운영체제는 시스템메세지큐에서 메세지를 하나씩 꺼내어 메세지가 발생한
윈도우가 가지고 있는 스레드메세지큐에 전달한다.
3) API를 이용한 윈도우프로그래밍
API(Application Programming Interface)란 프로그래밍을 위해 제공되는 함수들을 가리키는
말로 윈도우 프로그래밍을 위한 API를 Win32API라고 한다
API는 C 타입의 함수들의 집합이다 윈도우 프로그래밍을 위한 API는 약 10,000 개정도 알려져 있다
윈도우 분석
1. 윈도우란
1) 메세지기반(Message) 프로그램
2) 메세지큐
3) API를 이용한 윈도우프로그래밍
####################################################
1. 윈도우란
윈도우 분석 첫번째 시간입니다. 언어는 VC++를 사용합니다. MFC는 무겁기때문에 나중에 다루도록
하겠습니다.
일반적으로 VC++ 서적을 보시면 첫 부분에 윈도우에 대해 다루고있습니다. 그러나
설명이 부족한 부분도 있고, 너무 많아 전체적인 그림을 이해하기가 힘들때가 많져, 일단 제가
이해하구 있는 윈도우의 그림을 보여드리도록 하겠습니다. 이곳에서 자세한 설명까지 올리지는
않겠습니다. 설명이 부족한 부분은 책으로 충분히 찾아보실수 있을 겁니다. 아래 내용은
IT Education Center의 무료 강의 자료를 정리한 것입니다.
1) 메세지기반(Message) 프로그램
윈도우 어플리케이션은 OS와 어떤 특별한 상호작용을 통해 동작한다. 이러한 상호작용은 운영체제와
어플리케이션사이에 메세지라는 형식의 데이타를 주고 받음으로써 이루어진다
윈도우 어플리케이션은 OS가 보내는 메세지에 따라서 동작한다. 어플리케이션은 메세지를 통해서
OS로부터 명령이나 정보를 받아 메세제에 해당하는 적절한 행동을 수행함으로써 프로그램이 동작한다
즉, 어플리케이션이 하나의 윈도우를 만들겠다고 OS에 알리면 OS는 윈도우를 하나 만들라는 메세지를
어플리케이션이 보내고, 이 메세지를 받은 어플리케이션이 메세지를 처리함으로써 하나의 윈도우를
만든다.
사용자가 마우스로 윈도우를 클릭하면 OS는 어플리케이션에 마우스가 눌렸다는 메세지를 보내고 ,
키보드를 눌리면 어던 키보드가 눌렀는지에 대한 정보와 함께 키보드가 눌렀다는 메세지를 보낸다.
그래서 윈도우 어플리케이션을 작성한다는 것은 운영체제가 보내는 다양한 메세지를 어떻게
처리하는가에 대한 것이다
이말의 뜻은 정확히 무엇을 의미하는 것일까? 운영체제가 어플리케이션에 메세지를 보낸다는 것은
어플리케이션이 제공하는 하나의 함수를 호출한다는 것을 의미한다 이 함수를 윈도우프로시저라고
한다.
모든 윈도우는 하나의 윈도우 프로시저를 갖는다. 우리가 흔히 보는 버튼 컨트롤의 동작을 예를들어
보자. 버튼위에서 마우스를 누르면 버튼이 눌러진다 어떻게 버튼이 눌려지는 것일까? 모든 윈도우는
윈도우 프로시저를 가지고 있다 버튼에도 버튼윈도우에 해당하는 윈도우 프로시저가 있다
ㄱ) 마우스 왼쪽버튼을 누르면
ㄴ) 운영체제가 마우스가 눌린 버튼의 윈도우프로시저에게
마우스의 왼쪽 버튼이 눌렸다고 알린다
ㄷ) 버튼의 윈도우 프로시저는 이 메세지를 받고 버튼이
눌리는것처럼 버튼의 모양을 그린다 그럼으로써 버튼이 눌려지는것 처럼 보인다
그러면 화면에 떠있는 여러개의 윈도우중에서 어떻게 운영체제가 마우스를 누른 버튼윈도우의
프로시저를 호출할까? 메세지 큐 때문에 가능하다
2) 메세지큐
메세지큐에는 두종류가 있다. 운영체제가 관리하는 시스템메세지큐와 실행중인 각 프로그램마다
하나씩 가지고 있는 스레드메세지큐가 있다. 시스템메세지큐에는 발생되는 모든 이벤트가 메세지
형태로 큐에 쌓인다. 이때 운영체제는 시스템메세지큐에서 메세지를 하나씩 꺼내어 메세지가 발생한
윈도우가 가지고 있는 스레드메세지큐에 전달한다.
3) API를 이용한 윈도우프로그래밍
API(Application Programming Interface)란 프로그래밍을 위해 제공되는 함수들을 가리키는
말로 윈도우 프로그래밍을 위한 API를 Win32API라고 한다
API는 C 타입의 함수들의 집합이다 윈도우 프로그래밍을 위한 API는 약 10,000 개정도 알려져 있다
사람을 생긴 그대로
사랑하기가 얼마나 어려운지...
세상을 있는 그대로
보기가 얼마나 어려운지...
평화는 상대방이 내 뜻대로
되어지길 바라는 마음을 그만둘 때이며
행복은 그러한 마음이 위로 받을 때이며
기쁨은 비워진 두 마음이 부딪힐 때이다.
- 황대권의《야생초 편지》 중에서 -
사랑하게 되면
둘 사이의 거리가 점점 더 가까워지는 것은
두말할 나위도 없다. 여러 번 데이트를 했는데도
서로 몸을 가까이 하여 걸을 수 없다면
관계가 더 진전되지 않는다는
증거다.
- 최광선의 《몸짓을 읽으면 사람이 재미있다》중에서 -
* 몸의 거리는 마음의 거리, 믿음의 거리입니다.
아무리 멋있고, 훌륭한 사람과의 사랑이라도 믿지 못하고
마음이 닫혀 있다면 그 거리는 좁혀지기 어렵습니다.
마음을 열고 다가가되, 상대를 제대로
볼 줄 아는 눈도 필요합니다.
아무리 아름다운 여성도
청춘의 정기를 잃으면 시들어 버리는 것이다.
솔직하게 말하여 나는 사십이 넘은 여인의 아름다운 얼굴을
드물게 본다. '원숙하다' 또는 '곱게 늙어간다'라는 말은
안타까운 체념이다. 슬픈 억지다.
여성의 미를 한결같이 유지하는 약방문은 없는가 보다.
다만 착하게 살아온 과거, 진실한 마음씨, 소박한 생활
그리고 아직도 가지고 있는 희망, 그런 것들이
미의 퇴화를 상당히 막아낼
수는 있을 것이다.
- 피천득 <인연> 중에서 -
* 청춘의 정기는
나이에 따라 있거나 없거나 하지 않습니다.
새파란 나이의 젊은이도 청춘의 정기가 송두리째 메말라
늙은이가 되어 버린 사람이 있고, 얼굴은 주름 투성이에
머리는 반백이어도 청춘의 정기가 시들지 않은채
젊은 기운을 내뿜는 사람이 있습니다. 여자든
남자든 청춘의 정기를 잃으면
시든 꽃과 다름없습니다.
안녕하세요. 개태님 덕분에 겜 강좌를 시작하게 되엇습니다.
비록 실력은 없지만 나름대로 최선을 다하려구 합니다.
겜개발자로 존카맥을 좋아하는데, 많은 겜 엔진을 개발했습니다.
우리들이 알고있는 액션 3D겜의 엔진은 거의가 존카맥이 개발햇다고
생각하시면 틀림없을겁니다. 대표적인것이 언리얼이져 97년 당시
맵핑기술에 많이 놀랬습니다. 화려한 조명과 광원이 실시간으로
변한다는게 너무 신기하더라구요. 우리나라가 온라인겜 개발은
세계에서 앞었다구 하지만 중요 기술은 미국이나 일본에서 가져온것이지요.
그렇다구 미국이나 일본 겜 기술에 겁먹을 필욘없다구 생각합니다.
그들도 인간이고 우리또한 무궁한 잠재력이 있다구 생각하니가요.
차근차근 기초부너 다져 나간다면 멀지 않는 장래에 한국이 순수 기술로 개발한
겜엔진이 나올거라 믿습니다.
일단 전체적인 강좌의 흐름은 윈도우알기, 윈도우의기본함수탐구, 2D테트리스만들기, 쓰레드탐구,
파티클만들기, 인공지능개발, 맵에디터 만들기, 네트웍데아타전송, 4인테트리스 만들기,
3D테트리스 만들기, 슈팅게임만들기, 액션RPG만들기를 해보도록 하겠습니다.
기간은 저도 장담할 수 없구요. 저거 다 강의 하는데 몇년이 걸릴지 모르겟네요.. ㅎㅎ
저도 공부하면서 해야하니 초보자가 따라할수 잇게 쉽게 강의 하겟습니다.
전체적인 흐름은 저렇구여, 강의 시작하면서 세부 파트를 만들어 공부하겠습니다.
참고로 저는 인공지능개발에 관심이 많답니다. ^^;; (ps. 질문은 절대 사절입니다.)
비록 실력은 없지만 나름대로 최선을 다하려구 합니다.
겜개발자로 존카맥을 좋아하는데, 많은 겜 엔진을 개발했습니다.
우리들이 알고있는 액션 3D겜의 엔진은 거의가 존카맥이 개발햇다고
생각하시면 틀림없을겁니다. 대표적인것이 언리얼이져 97년 당시
맵핑기술에 많이 놀랬습니다. 화려한 조명과 광원이 실시간으로
변한다는게 너무 신기하더라구요. 우리나라가 온라인겜 개발은
세계에서 앞었다구 하지만 중요 기술은 미국이나 일본에서 가져온것이지요.
그렇다구 미국이나 일본 겜 기술에 겁먹을 필욘없다구 생각합니다.
그들도 인간이고 우리또한 무궁한 잠재력이 있다구 생각하니가요.
차근차근 기초부너 다져 나간다면 멀지 않는 장래에 한국이 순수 기술로 개발한
겜엔진이 나올거라 믿습니다.
일단 전체적인 강좌의 흐름은 윈도우알기, 윈도우의기본함수탐구, 2D테트리스만들기, 쓰레드탐구,
파티클만들기, 인공지능개발, 맵에디터 만들기, 네트웍데아타전송, 4인테트리스 만들기,
3D테트리스 만들기, 슈팅게임만들기, 액션RPG만들기를 해보도록 하겠습니다.
기간은 저도 장담할 수 없구요. 저거 다 강의 하는데 몇년이 걸릴지 모르겟네요.. ㅎㅎ
저도 공부하면서 해야하니 초보자가 따라할수 잇게 쉽게 강의 하겟습니다.
전체적인 흐름은 저렇구여, 강의 시작하면서 세부 파트를 만들어 공부하겠습니다.
참고로 저는 인공지능개발에 관심이 많답니다. ^^;; (ps. 질문은 절대 사절입니다.)
현재속에 존재한다는 것은
잡념을 없앤다는 뜻이다. 그것은 바로
지금 중요한 것에 관심을 쏟는다는 뜻이다.
우리가 무엇에 관심을 쏟는가에 따라
소중한 선물을 받을 수도 있고
받지 못할 수도 있다.
- 스펜서 존슨의《선물》중에서 -
* 지나간 것을 붙들고 있으면 앞으로 나아가지 못합니다.
오늘 주어진 현재의 것을 놓치면 내일의 열매를 기대할 수
없습니다. 지금 중요한 것이 무엇인지를 분별하여
잡념없이 몰두하는 것이 자기의 삶을
완성시키는 지름길입니다.