Visual C++ 3강 소스코드 살펴보기
- WinMain 함수의 본체는 윈도우 클래스(WNDCLASS) 정의 및 속성 입력, 윈도우 클래스 등록(RegisterClass), 윈도우 객체 생성(CreateWindow), 화면에 윈도우 보이기(ShowWindo) 그리고 지속적으로 윈도우를 화면에 나타내기 위한 Message Loop (while(GetMessage(&Message,0,0,0)) )등으로 구성된다.
- 윈도우 클래스 WndClass의 각 멤버 의미는 다음과 같다.
- style : 윈도우의 스타일을 정의한다.
- lpfnWndProc : 윈도우의 메시지 핸들러 함수를 지정한다.
- cbClsExtra, cbWndExtra : 일종의 예약 영역이다.
- hInstance : 이 윈도우 클래스를 사용하는 프로그램의 번호이며 매개변수로 전달된 hInstance값을 그대로 대입해주면 된다.
- hIcon, hCursor : 이 윈도우가 사용할 마우스 커서와 최소화되었을 경우 출력될 아이콘을 지정한다.
- hbrBackground : 윈도우의 배경 색상을 지정한다.
- pszMenuName : 이 프로그램이 사용할 메뉴를 지정한다.
- lpszClassName :윈도우 클래스의 이름을 정의한다.
- 윈도우를 생성할 때는 CreateWindow 함수를 사용하는데 각 매개 변수는 다음과 같다.
- lpszClassName : 윈도우의 클래스를 지정하는 문자열이다.
- lpszWindowName : 윈도우의 타이틀 바에 나타날 문자열이다.
- dwStyle : 윈도우의 형태를 지정하는 매개변수다. WS_OVERLAPPEDWINDOW를 사용하면 시스템 메뉴, 최대 최소 버튼, 타이틀 바, 경계선을 가진 윈도우를 만들어 준다.
- X, Y, nWidth, nHeight : 윈도우의 크기와 위치를 지정하며 픽셀 단위를 사용한다. x, y좌표는 화면 좌상단 좌표이며 nWidth는 넓이 nHeight는 높이이다.
- hWndParent : 부모 윈도우가 있을 경우 부모 윈도우의 핸들이다.
- hmenu : 윈도우에서 사용할 메뉴의 핸들을 지정한다.
- hinst :윈도우를 만드는 주체, 즉 프로그램의 핸들을 지정한다. 여기서는 매개변수로 전달된 hInstance이다.
- lpvParam :CREATESTRUCT라는 구조체의 번지이며 특수한 목적에 사용된다. 보통은 NULL값을 사용한다.
- 윈도우를 화면에 보이게 하기 위하여 ShowWindow 함수를 사용하는데 매크로 상수는 다음과 같다.
- SW_HIDE 윈도우를 숨긴다.
- SW_MINIMIZE 윈도우를 최소화시키고 활성화시키지 않는다.
- SW_RESTORE 윈도우를 활성화시킨다.
- SW_SHOW 윈도우를 활성화시켜 보여준다.
- SW_SHOWNORMAL 윈도우를 활성화시켜 보여준다.
- 윈도우가 계속 화면에 나타나게 하려면 다음과 같이 메시지 루프를 수행해야 한다.
while(GetMessage(&Message,0,0,0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
각 함수의 역할은 다음과 같다.
- BOOL GetMessage( ); : 이 함수는 시스템이 유지하는 메시지 큐에서 메시지를 읽어 들인다.
- BOOL TranslateMessage( CONST MSG *lpMsg); : 키보드 입력 메시지를 가공하여 프로그램에서 쉽게 쓸 수 있도록 해 준다.
- LONG DispatchMessage( CONST MSG *lpmsg); :시스템 메시지 큐에서 꺼낸 메시지를 프로그램의 메시지 핸들러 함수(WndProc)로 전달한다.
- MSG구조체 : 실제 메시지 처리는 메시지 처리 함수인 콜백함수(WndProc)에서 수행한다. 메시지는 MSG라는 구조체에 보관되며 MSG 구조체 각 멤버의 역할은 다음과 같다.
Hwnd |
메시지를 받을 윈도우 핸들이다. |
message |
어떤 종류의 메시지인가를 나타낸다. 가장 중요한 값이다. |
wParam |
전달된 메시지에 대한 부가적인 정보를 가진다. 어떤 의미를 가지는가는 메시지 별로 다르다. 32비트 값이다. |
lParam |
전달된 메시지에 대한 부가적인 정보를 가진다. 어떤 의미를 가지는가는 메시지 별로 다르다. 32비트 값이다. |
Time |
메시지가 발생한 시간이다. |
Pt |
메시지가 발생했을 때의 마우스 위치이다. |
- 윈도우 프로시저(Window Procedure)는 메시지 핸들러 함수로 메시지가 발생할 때 프로그램의 반응을 처리하는 일을 하며 WinMain 함수와는 별도로 WndProc이라는 이름으로 존재한다. WndProc은 WinMain에서 호출하는 것이 아니라 윈도우 운영체제에 의해 호출된다. WinMain내의 메시지 루프는 메시지를 메시지 핸들러 함수로 보내주기만 할 뿐이며 WndProc은 메시지가 입력되면 윈도우 운영체제에 의해 호출되어 메시지를 처리한다. 이렇게 운영체제에 의해 호출되는 응용 프로그램내의 함수를 콜백(CallBack)함수라고 한다.
- 콜백(Callback) 함수 또는 윈도우 프로시저 함수 WndProc의 구조는 대체로 다음과 같은 형태를 가진다. 메시지의 종류에 따라 다중 분기하여 메시지 별로 처리를 진행한다.
switch(iMessage)
{
case Msg1:
처리1;
return 0;
case Msg2:
처리2;
return 0;
.
.
.
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
댓글