MoveWindow

원형

BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint);

인수

▶ hWnd : 이동 대상 윈도우의 핸들

▶ X,Y : 이동할 좌상단 좌표를 지정한다. 이 좌표는 차일드 윈도우일 경우 부모 윈도우의 작업영역 원점을 기준으로 한 좌표이며 최상위 윈도우의 경우 화면 원점을 기준으로 한 좌표이다. 좌표의 단위는 픽셀이다.

▶ nWidth, nHeight : 윈도우의 폭과 높이를 지정한다. 단위는 픽셀이다.

▶ bRepaint : 이동 후에 윈도우를 다시 그릴 것인가 아닌가를 지정한다. 이 인수가 TRUE이면 윈도우를 이동한 후 WM_PAINT 메시지를 보내 윈도우를 다시 그리도록 한다. 이때 다시 그려지는 영역은 작업영역, 비작업영역은 물론이고 윈도우 이동 후에 다시 드러나는 부분까지 포함된다.

리턴

성공하면 0이 아닌 값을 리턴하며 에러 발생시 0을 리턴한다.

설명

윈도우의 위치와 크기를 변경하는 가장 일반적인 함수이다. X,Y 인수로 윈도우의 위치를 지정하며 nWidth, nHeight 인수로 윈도우의 폭과 높이를 지정하므로 이 함수로 위치와 크기를 한꺼번에 변경할 수 있다. 단 위치만 변경하거나 크기만 변경하고자 할 경우는 GetWindowRect 등의 함수로 영역을 먼저 구한 후 원하는 값만 변경하거나 아니면 SetWindowPos 함수를 사용해야 한다.

이 함수는 일반적으로 부모 윈도우내에서 차일드 컨트롤을 정렬하기 위한 용도로 많이 사용하며 최상위 윈도우의 크기나 위치를 변경할 때는 이 함수 대신 SetWindowPos 함수를 사용하는 것이 바람직하다.

예제 1

다음 예제는 부모 윈도우의 작업역에 버튼, 에디트, 리스트 박스를 각각 배치하고 이 컨트롤들을 작업영역의 특정한 위치에 정렬하는 예를 보여준다.

HWND hEdit,hList,hBtn;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	switch(iMessage) {
	case WM_CREATE:
		hList=CreateWindow("listbox",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER |
			LBS_NOINTEGRALHEIGHT,0,0,0,0,hWnd,(HMENU)0,g_hInst,NULL);
		hEdit=CreateWindow("edit",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER |
			ES_MULTILINE,0,0,0,0,hWnd,(HMENU)1,g_hInst,NULL);
		hBtn=CreateWindow("button","버튼이다",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
			0,0,0,0,hWnd,(HMENU)2,g_hInst,NULL);
		SendMessage(hList,LB_ADDSTRING,0,(LPARAM)"리스트박스");
		SetWindowText(hEdit,"요건 에디트 박스입니다");
		MoveWindow(hWnd,100,100,400,300,FALSE);
		return 0;
	case WM_SIZE:
		MoveWindow(hList,0,0,200,HIWORD(lParam)-50,TRUE);
		MoveWindow(hEdit,200,0,LOWORD(lParam)-200,HIWORD(lParam)-50,TRUE);
		MoveWindow(hBtn,0,HIWORD(lParam)-50,LOWORD(lParam),50,TRUE);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

MoveWindow 함수가 4번 사용되었다. WM_CREATE에서 사용한 MoveWindow 함수는 메인 윈도우의 위치와 크기를 강제로 조장하는 용도로 사용되었으며 이 경우 윈도우가 아직 보이기 전이므로 bRepaint 인수는 FALSE로 지정하는 것이 좋다. WM_SIZE에서 각 차일드 컨트롤에 대해 MoveWindow를 호출하여 차일드 컨트롤을 재배치하도록 했다. 재배치의 기준은 현재 부모 윈도우의 작업영역 폭과 높이인데 이 값은 WM_SIZE의 lParam의 하위, 상위 워드로 각각 전달된다.

리스트 박스는 작업 영역의 원점에서부터 폭은 200픽셀을 가지며 높이는 작업영역 높이에서 버튼의 폭 50픽셀을 뺀만큼을 주었다. 에디트 컨트롤은 리스트 박스의 바로 오른쪽에 배치되며 폭은 리스트 박스의 폭인 200을 뺀만큼, 그리고 높이는 버튼의 높이 50을 뺀만큼이다. 버튼은 두 컨트롤이 차지한 나머지 영역을 채운다. 이때 각 컨트롤은 변경된 위치에 다시 그려져야 하므로 bRepaint 인수는 TRUE로 주어야 한다. 참고로 이런 식으로 차일드가 작업영역을 채우는 경우 메인 윈도우는 반드시 WS_CLIPCHILDREN 스타일을 가져야 깜박임을 줄일 수 있다.

참고함수

SetWindowPos : 이 함수와 유사하되 여러 가지 옵션을 줄 수 있다.

GetWindowRect : 윈도우의 현재 영역을 조사한다.

플렛폼

95이상

본문참조

 


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