내 머릿속 데이터베이스

윈도우의 생성 루틴 본문

Programming/C/C++

윈도우의 생성 루틴

파도소리 2006. 12. 5. 05:28

윈도우 프로그래밍을 할때 윈도우를 생성 하는 루틴을 설명 해 드리겠습니다.
먼저 WinMain 에서 HWND  를 선언 하고 WNDCLASS 를 선언 합니다.
HWND는 윈도우 핸들을 선언 하는것입니다. HWND  라는 구조체가 있는데 여기의  멤버를 채워놓고 윈도우의 정보를 저장 합니다.
WNDCLASS는 윈도우 클래스를 선언 하는것입니다.
윈도우 클래스라는 구조체와 윈도우 핸들이라는 구조체 두개가 있습니다.
이 두개가 왜 있어야만 하냐면 윈도우 개발자 측면을 강조 하기 위해 만들어 진것 같습니다.

WinMain()이라는 메인 즉 첫 진입 함수 에서는 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;
이런식으로 백그라운드 색깔이나 커서 아이콘 인스턴스 콜백 함수 포인터 주소
클래스 이름 스타일 등등 의 멤버의 값을 넣고
RegisterClass()함수를 이용해서 클래스를 등록 합니다.
이때 RegisterClass()함수는 내부적으로 지금까지 등록 되어 있는 윈도우 들의 링크들 즉 링크드 리스트와 같이 클래스를 연결 시켜 놓은 링크를 따라 여러 윈도우 클래스를 검색 하면서 지금 등록 하려는 윈도우 클래스와 같은것이 있는지 검사 하고 없으면 등록을 합니다.
여기서 RegisterClass()에서 등록을 못하게 되면 윈도우는 생성이 되지 않습니다.
왜냐면 CreateWindow()함수에서는 RegisterClass()에서 등록을 한 윈도우 클래스만 윈도우 핸들로서 윈도우를 만들어 주기 때문입니다.
CreateWindow()함수의 인자는 CreateWindow(lpszClassName, lpszWindowName, dwStyle, x, y, nWidth, nHeight, hwndParent, hmenu, hinst, lpvParam) 이렇게 많습니다.
이런것들을 인자로 받은 CreateWindow()함수는 내부적으로 HWND 구조체의 멤버에 값을 넣겠죠.
이때 RegisterClass()에서 등록을 실패 했으면 윈도우는 생성 되지 않습니다.
핸들을 리턴 하지 않는 것이죠..
이때 WM_CREATE 메시지는 CreateWindow()함수가 발생을 시킵니다.
CreateWindow()함수가 리턴을 하게 되면 이제 윈도우의 생성 준비는 이미 마친것입니다.
윈도우는 등록 되었고 모든 설정값은 저장 되었습니다.
이제 ShowWindow()라는 함수가 호출 됨으로서 윈도우가 화면상에 나오게 됩니다.
이제 어떠한 사용자의 동작에 따라 메시지 햔들러에게 메시지를 보내는 그런 동작을 할 준비가 끝나고 이미 윈도우는 화면상에 나타난것입니다.

Comments