godurum/일반
윈도우 분석 3. Win32API의 핵심인 기본구조를 살펴보자
민성아빠
2004. 4. 25. 09:01
####################################################
윈도우 분석
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) // 메세지와 함께 보내지는 부가정보( 실제크기 )