CreateWindow

원형 HWND CreateWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HANDLE hInstance, LPVOID lpParam);
MFC 원형 virtual BOOL CWnd::Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
인수

▶lpClassName : 생성할 윈도우의 윈도우 클래스를 지정하는 문자열이다. 윈도우 클래스는 RegisterClass(Ex) 함수로 직접 등록할 수도 있고 또는 button, edit, listbox, static 등과 같이 미리 정의되어 있는 시스템 전역 클래스일 수도 있다. 또는 GlobalAddAtom 함수로 미리 등록해 놓은 정수형의 아톰을 사용하는 것도 가능하다.

▶lpWindowName : 윈도우의 타이틀 바에 나타날 캡션 문자열이다. 캡션이 나타날 위치는 윈도우 클래스에 따라 달라지는데 오버랩드 윈도우는 타이틀 바에 캡션이 나타나며 버튼, 스태틱 등의 컨트롤은 컨트롤 중앙에 캡션이 출력된다.

▶dwStyle : 생성될 윈도우의 스타일을 지정한다.

스타일 설명
WS_OVERLAPPED 디폴트 윈도우. 타이틀 바와 크기 조절이 안되는 경계선을 가진다. 아무런 스타일도 주지 않으면 이 스타일이 적용된다.
WS_POPUP 팝업 윈도우를 만든다. WS_CHILD와 함께 쓸 수 없다.
WS_CHILD 차일드 윈도우를 만든다. WS_POPUP과 함께 쓸 수 없다.
WS_MINIMIZE 최초 최소화된 상태로 윈도우를 만든다.
WS_VISIBLE 윈도우를 만들자 마자 화면에 출력한다.
WS_DISABLED 사용금지된 상태, 즉 입력을 받아들일 수 없는 상태로 만든다.
WS_CLIPSIBLINGS 차일드끼리 상호 겹친 영역은 그리기 영역에서 제외된다.
WS_CLIPCHILDREN 차일드가 위치한 영역은 그리기 영역에서 제외된다.
WS_MAXIMIZE 최초 최대화된 상태로 윈도우를 만든다.
WS_CAPTION 타이틀 바를 가진 윈도우를 만들며 WS_BORDER 스타일을 포함한다.
WS_BORDER 단선으로 된 경계선을 만들며 크기 조정은 할 수 없다.
WS_DLGFRAME 두꺼운 경계선을 가지며 타이틀 바를 가질 수 없다.
WS_VSCROLL 수직 스크롤 바를 가진 윈도우를 만든다.
WS_HSCROLL 수평 스크롤 바를 가진 윈도우를 만든다.
WS_SYSMENU 시스템 메뉴를 가진 윈도우를 만든다.
WS_THICKFRAME 크기 조정이 가능한 두꺼운 경계선을 가진다.
WS_GROUP 라디오 버튼 등 그룹을 이루는 컨트롤의 그룹 지정에 사용된다.
WS_TABSTOP Tab키로 포커스를 이동할 수 있도록 한다.
WS_MINIMIZEBOX 최소화 버튼을 만든다.
WS_MAXIMIZEBOX 최대화 버튼을 만든다.
WS_OVERLAPPEDWINDOW 가장 일반적인 윈도우 스타일. WS_OVERLAPPED |WS_CAPTION |WS_SYSMENU |WS_THICKFRAME |WS_MINIMIZEBOX |WS_MAXIMIZEBOX 스타일들이 조합된 스타일이다.
WS_POPUPWINDOW 일반적인 팝업 윈도우. WS_POPUP |WS_BORDER |WS_SYSMENU
WS_CHILDWINDOW WS_CHILD와 같다.

각 스타일의 비트 배치는 다음과 같다.

▶x, y : 윈도우의 좌표를 지정한다. 오버랩드, 팝업 윈도우는 화면의 원점을 기준으로 한 좌표로 지정하며 차일드 컨트롤은 부모 윈도우의 작업 영역 원점을 기준으로 한 좌표로 지정한다. CW_USEDEFAULT로 지정할 경우 시스템이 적절한 디폴트 위치에 윈도우를 생성해 주는데 이 값은 오버랩드 윈도우에만 적용되며 차일드나 팝업 윈도우에는 적용되지 않는다.

▶nWidth, nHeight : 윈도우의 수평 크기와 수직 크기를 장치 단위(픽셀)로 지정한다. 오버랩드 윈도우의 경우 nWidth에 CW_USEDEFAULT를 지정할 수 있으며 이 경우 시스템은 적절한 폭과 높이를 디폴트로 설정해 준다. nWidth가 CW_USEDEFAULT일 경우 nHeight는 무시된다.

▶hWndParent : 부모 윈도우, 또는 소유주 윈도우의 핸들을 지정한다. 차일드 윈도우는 부모 핸들을 반드시 지정해야 하며 팝업 윈도우는 부모 윈도우를 생략할 수도 있다. NT 5.0이상에서 이 인수에 HWND_MESSAGE를 지정하거나 이미 만들어져 있는 메시지 전용 윈도우 핸들을 부모로 지정하면 메시지 전용의 윈도우가 생성된다.

▶hMenu : 오버랩드 윈도우나 팝업 윈도우의 경우 메뉴의 핸들을 지정한다. 윈도우 클래스에 메뉴가 지정되지 않았을 경우 이 인수가 지정하는 핸들이 사용되며 만약 윈도우 클래스와 이 인수에 동시에 다른 메뉴가 지정되어 있으면 이 인수가 지정하는 메뉴가 우선적으로 적용된다. 차일드 윈도우의 경우 컨트롤의 ID를 지정하는데 이 ID는 차일드가 부모 윈도우(주로 대화상자)에게 통지 메시지를 보낼 때 차일드간의 구분을 위해 사용하므로 같은 부모에 속한 컨트롤끼리는 중복되는 ID를 가지지 않아야 한다.

▶hInstance : 이 윈도우를 생성하는 인스턴스 핸들을 지정한다. 이 인스턴스가 종료될 때 윈도우도 같이 파괴된다.

▶lpParam : WM_CREATE메시지의 lParam으로 전달될 CREATESTRUCT 구조체를의 포인터이다. MDI 클라이언트 윈도우를 만들 때는 CLIENTCREATESTRUCT 구조체의 포인터를 전달해야 한다.

리턴 윈도우 생성에 성공했으면 생성된 윈도우의 핸들을 리턴하며 에러 발생시 NULL을 리턴한다.
설명

윈도우 클래스와 이 함수의 인수 정보를 바탕으로 하여 윈도우를 생성한다. RegisterClass 함수로 직접 윈도우 클래스를 등록하여 메인 윈도우를 만들 수도 있으며 또는 이미 등록된 컨트롤을 생성할 수도 있다.

이 함수는 윈도우 생성 후 WM_CRETATE. WM_GETMINMAXINFO, WM_NCCREATE 메시지를 해당 윈도우로 차례대로 보내주며 WS_VISIBLE 스타일이 지정되어 있을 경우 윈도우를 보여주고 활성화시키기 위한 모든 동작을 하며 관련 메시지를 보내준다.

예제 1

다음 예제는 메인 윈도우, 차일드 윈도우, 팝업 윈도우를 각각 생성한다.

	// 팝업 윈도우의 윈도우 클래스를 등록한다.
	WndClass.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);
	WndClass.lpfnWndProc=(WNDPROC)WndProcPopup;
	WndClass.lpszClassName="mypopup";
	RegisterClass(&WndClass);

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

HWND hPopup=NULL;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;

	switch(iMessage) {
	case WM_CREATE:
		CreateWindow("button","차일드 컨트롤",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
			20,20,150,30,hWnd,(HMENU)0,g_hInst,NULL);
		return 0;
	case WM_LBUTTONDOWN:
		if (hPopup)
			return 0;
		hPopup=CreateWindow("mypopup","팝업 윈도우",WS_POPUPWINDOW | WS_CAPTION,
			100,100,320,200,hWnd,(HMENU)0,g_hInst,NULL);
		ShowWindow(hPopup,SW_SHOW);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

LRESULT CALLBACK WndProcPopup(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	char str[]="팝업 윈도우입니다";

	switch(iMessage) {
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,10,10,str,lstrlen(str));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		hPopup=NULL;
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

WinMain에서 오버랩드 윈도우와 팝업 윈도우의 윈도우 클래스를 등록하였고 메인 윈도우가 생성될 때 버튼 차일으 윈도우를 생성하였다. 마우스 왼쪽 버튼을 누르면 팝업 윈도우를 만든다.

 

참고함수

DestroyWindow : 윈도우를 파괴한다.

CreateWindowEx, ShowWindow, MoveWindow

플렛폼 95이상
참조  

+ Recent posts