본문 바로가기

デベロップメント/ゲームプログラミング

2.2.4 CreateWindow 함수

2.2.4 CreateWindow 함수


윈도우 클래스를 작성했으므로, 이걸로 실제의 윈도우를 작성할 수 있습니다.

이를 위해서 CreateWindow함수를 호출합니다.

CreateWindow함수는 윈도우 클래스에 더해, 새로운 윈도우의 속성을 정의하는 파라메터도 사용합니다.

CreateWindow함수의 구문은 다음과 같습니다.


HWND CreateWindow(
	LPCTSTR	lpClassName,
	LPCTSTR	lpWindowName,
	DWORD	dsStyle,
	int	x,
	int	y,
	int	nWidth,
	int	nHeight,
	HWND	hWndParent,
	HMENU	hMenu,
	HINSTANCE hInstance,
	LPVOID	lpParam
);


CreateWindow의 파라메터를 아래에 설명합니다.

lpClassName : 윈도우 클래스명을 저장하고 있는 NULL 종단문자열에 대한 파라메터. 이 이름은 윈도우 클래스를 작성하는 함수로 lpszClassName 멤버에 사용된 이름과 일치할 필요가 있습니다.

lpWindowName : 윈도우의 타일 바에 표시되는 텍스트

dsStyle : 작성할 윈도우의 스타일. 다수의 스타일이 있습니다만, 본 책에서는 다음과 같은 스타일을 사용합니다.

WS_OVERLAPPEDWINDOW : 일반적인 컨트롤러를 가진 사이즈 변경이 가능한 윈도우를 작성합니다.

WS_OVERLAPPED : 컨트롤 없음의 고정 사이즈의 윈도우를 작성합니다. 본 책에서는 윈도우 표시의 게임에 가장 좋게 사용하는 스타일입니다.

○ WS_EX_TOPMOST | WS_VISIBLE | WS_POPUP : 이것은 3개의 스타일을 OR 연산자  「|」로 묶어 낸 것입니다. 본 책에서는 전체화면 표시의 게임에 사용하는 스타일입니다.

x, y : 윈도우의 좌상측의 좌표

nWidth : 윈도우의 너비(픽셀 단위)

nHeight : 윈도우의 높이(픽셀 단위)

hMenu : 윈도우 메뉴

hInstance : 윈도우 클래스에서의 어플리케이션 식별자

lpParam : 그 외의 윈도우 파라메터


실제의 함수 호출은 코드 2.5와 같이 되어있습니다.

코드 2.5에 관해 주의점을 아래에 설명합니다.


CLASS_NAME은 앞에서 「WinMain」으로써 선언한 문자 정수입니다 (코드 2.10을 참조)

APP_TITLE은 앞에서 「Hello World」로써 선언한 문자 정수 입니다. APP_TITLE은 타일 바에 표시되는 텍스트입니다.(코드 2.10을 참조)

WS_OVERLAPPEDWINDOW : 보통의 윈도우를 작성합니다. 게임용에는 거의 모든 경우, 다른 스타일을 사용합니다(상기의 dsStyle을 참조)

CW_USEDEFAULT : 이 데모에서는 디폴트의 사이즈와 위치를 사용합니다.

NULL, NULL : 부모 윈도우 없음, 메뉴 없음이라는 의미입니다.

hInstance : 작성하고 있는 어플리케이션에 대한 핸들. 이것은 WinMain으로 프로그램에 전달된 hInstance 파라메터입니다.

NULL : 다른 윈도우 파라메터 없음이라는 의미입니다.


#코드 2.5 CreateWindow 함수의 호출

// 윈도우를 작성
hwnd = CreateWindow(
	CLASS_NAME,		// 윈도우 클래스의 이름
	APP_NAME,		// 타이틀 바의 텍스트
	WS_OVERLAPPEDWINDOW,	// 윈도우의 스타일
	CW_USEDEFAULT,		// 윈도우의 수평위치의 디폴트
	CW_USEDEFAULT,		// 윈도우의 수직위치의 디폴트
	WINDOW_WIDTH,		// 윈도우의 너비
	WINDOW_HEIGHT,		// 윈도우의 높이
	(HWND) NULL,		// 부모 윈도우 없음
	(HMENU) NULL,		// 메뉴 없음
	hInstance,		// 어플리케이션 인스턴스에 대한 핸들
	(LPVOID) NULL);		// 윈도우 파라메터 없음

다음에 CreateWindow에서의 반환 값을 체크해서, 에러가 발생했는가를 확인합니다.

함수가 정상으로 실행될 경우, 반환 값은 새로운 윈도우에 대한 핸들입니다.

실패했을 경우, 반환 값은 NULL입니다.

에러가 발생한 경우는 진행 할 수 없으므로, FALSE를 반환 하는 것만으로 프로그램을 종료합니다.(코드 2.6)


#코드 2.6 CreateWindow에서 반환값의 체크

// 윈도우의 작성에서 에러가 발생하는 경우
if (!hwnd)
	return FALSE;	// 진행할수 없으면 종료

완성까지 조금 남았습니다!
다음의 스텝으로써, 윈도우를 표시해, 그 윈도우에 그림을 그리기를 행하는 메세지를 보냅니다.

그 코드는 코드 2.7과 같이 됩니다.


#코드 2.7 윈도우의 표시

	// 윈도우를 표시
	ShowWindow(hwnd, nCmdShow);
	// 윈도우 프로시져에 WM_PAINT 메세지를 보냄
	UpdateWindow(hwnd);
	return true;
}


이것으로 윈도우를 표시하는 코드는 완성되었습니다.

프로그램 코드를 보기 쉽게하기 위해, 윈도우 작성의 코드는, CreateMainWindow라는 이름의 함수로 넣어, 이 함수를 WinMain에서 호출합니다.(코드 2.10 참조)



서장으로