WM_CREATE

인수

wParam : 사용되지 않음

lParam : 윈도우 생성 정보인 CREATESTRUCT 구조체의 포인터이다. 이 구조체는 CreateWindow(Ex) 함수의 인수에 대한 정보를 가진다.

설명

CreateWindow(Ex) 함수에 의해 윈도우가 생성될 때 보내진다. 메모리에 윈도우를 생성한 후 화면에 보이기 전에 보내지며 주로 윈도우에 관련된 초기화 작업을 할 때 사용된다. 윈도우 동작을 위한 메모리 할당, 리소스 생성, 차일드 컨트롤 생성, 윈도우 속성 초기화 작업에 이 메시지가 사용된다.

CreateWindow(Ex) 함수는 이 메시지를 완전히 처리한 후에 리턴한다. 만약 이 메시지 처리중에 차일드 윈도우를 생성했다면 각 차일드 윈도우로도 WM_CREATE 메시지가 전달되어 개별적인 초기화를 한다. 인수로 전달되는 LPCREATESTRUCT 구조체는 보통 사용하지 않으며 무시하나 이 구조체의 lParam 멤버는 CreateWindow 함수의 제일 마지막 인수를 전달하며 윈도우로 사용자 정의값을 전달하고자 할 때 사용할 수 있다.

참고:대화상자는 이 메시지 대신 WM_INITDIALOG 메시지를 받는다.

리턴

윈도우를 성공적으로 생성했으면 0을 리턴해야 한다. 만약 초기화 과정에서 메모리 부족, 부속 파일 누락 등의 에러가 발생했으면 -1을 리턴하여 윈도우 생성을 즉각 중지할 수 있다. 이 메시지에서 -1을 리턴하면 이미 생성되어 있는 윈도우는 파괴되며 CreateWindow(Ex) 함수는 NULL 핸들을 리턴한다.

예제

다음 코드는 윈도우 생성시에 차일드 컨트롤을 생성하고 전역 변수를 초기화한다. 메인 윈도우가 생성될 때 WM_CREATE 메시지가 전달되며 이 메시지를 받았을 때 g_iMode 전역 변수를 원하는 값으로 초기화하였으며 에디트 컨트롤을 생성하고 에디트에 텍스트를 대입하였다. 초기화가 무사히 완료되었으면 0을 리턴하여 모든 초기화가 정상적으로 완료되었음을 알려 주어야 한다.

case WM_CREATE:
	g_iMode=0;
	hEdit=CreateWindow("edit",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER | 
		ES_AUTOHSCROLL,10,10,200,25,hWnd,(HMENU)ID_EDIT,g_hInst,NULL);
	SetWindowText(hEdit,"차일드 에디트이다.");
	return 0;

다음 코드는 윈도우의 초기 위치와 크기를 강제로 변경한다. WM_CREATE 메시지는 윈도우가 생성된 후 그리고 윈도우가 화면으로 보이기 전에 전달되므로 이 메시지에서 윈도우의 위치, 상태, 스타일 등을 변경할 수 있다. 여기서 지정하는 윈도우의 위치, 크기는 CreateWindow 함수에서 지정한 위치, 크기를 변경한다. 윈도우의 시작 위치가 레지스트리에 저장되어 있는 경우 WM_CREATE에서 레지스트리의 값을 읽어 초기화할 수도 있다.

case WM_CREATE:
	MoveWindow(hWnd,100,100,300,200,FALSE);
	return 0;

다음 코드는 윈도우 초기화중에 파일을 미리 오픈해 놓는다. 만약 파일을 정상적으로 오픈할 수 없을 경우 -1을 리턴하여 메인 윈도우를 파괴하도록 한다. 이 메시지에서 -1을 리턴하면 이 윈도우가 파괴되며 이 윈도우가 메인 윈도우일 경우 WM_DESTROY의 PostQuitMessage 호출에 의해 프로그램이 종료된다. 파일 오픈, 메모리 할당, 레지스트리 점검, 네트웍 연결, DB 초기화 등의 실패할 가능성이 있는 초기화를 할 경우 이 함수에서 윈도우 생성을 즉시 중지할 수 있다.

case WM_CREATE:
	hFile=CreateFile("c:\\NoExist.Api",GENERIC_READ,0,NULL,
		OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if (hFile==INVALID_HANDLE_VALUE) {
		return -1;
	} else {
		return 0;
	}

예제 1

다음 예제는 WM_CREATE의 lParam으로 윈도우의 초기위치를 전달하는 방법을 보여준다. CreateWindow를 호출하기 전에 RECT 구조체를 선언한 후 이 구조체의 포인터를 CreateWindow 함수의 마지막 인수로 전달하였다. 이 인수는 WM_CREATE의 lParam으로 전달되는 CREATESTRUCT 구조체의 lpCreateParams 멤버로 전달된다.

	RECT rt={123,123,456,456};
	hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
		NULL,(HMENU)NULL,hInstance,&rt);
	ShowWindow(hWnd,nCmdShow);
	hWndMain=hWnd;
	
	while(GetMessage(&Message,0,0,0)) {
		TranslateMessage(&Message);
		DispatchMessage(&Message);
	}
	return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	RECT *prt;

	switch(iMessage) {
	case WM_CREATE:
		prt=(RECT *)((LPCREATESTRUCT)lParam)->lpCreateParams;
		MoveWindow(hWnd,prt->left,prt->top,
			prt->right-prt->left,prt->bottom-prt->top,FALSE);
		return 0;

WM_CREATE에서는 lParam으로 전달되는 RECT 구조체를 참조하여 자신의 초기 위치를 설정하였다. 물론 초기값은 CreateWindow 함수에서도 지정할 수 있으므로 굳이 이런 방법을 쓰지 않아도 되지만 윈도우 생성 정보를 이런 식으로 전달할 수 있다는 것을 보여준다. lpCreateParams는 포인터이기 때문에 얼마든지 복잡한 형태의 구조체를 정의한 후 이 구조체의 포인터를 전달함으로써 윈도우 생성에 필요한 데이터를 넘길 수 있다. 실전에서 이런 방법은 거의 사용되지 않는다.

플랫폼

95이상

참조

10-7-가


written by http://www.winapi.co.kr