WM_MOVE

인수

wParam : 사용되지 않는다.

LOWORD(lParam) : 윈도우의 X좌표.

HIWORD(lParam) : 윈도우의 Y 좌표. 이 좌표는 오버랩드, 팝업 윈도우의 경우 화면 좌표이며 차일드 윈도우는 부모 윈도우의 작업 영역을 기준으로 한 좌표이다.

설명

윈도우의 위치가 변경될 때마다 이 메시지가 보내진다. 일반적으로 윈도우의 위치 변경에 따른 처리는 하지 않기 때문에 이 메시지는 잘 사용되지 않지만 위치에 따라 윈도우의 모양이나 동작에 차이가 있거나 특별한 처리가 필요하다면 이 메시지를 사용한다. 이 메시지는 윈도우의 위치가 완전히 옮겨진 후에 보내지므로 인수로 전달되는 좌표는 이동 후의 좌표이다.

리턴

이 메시지를 처리했으면 0이 아닌 값을 리턴해야 한다.

예제

예제 1

다음 예제는 팝업 윈도우를 하나 생성하고 메인 윈도우의 오른쪽에 팝업 윈도우를 밀착시킨다. 그리고 메인 윈도우의 위치가 변경될 때마다 팝업 윈도우를 같이 이동시킴으로써 항상 부모 윈도우의 오른쪽에 팝업 윈도우를 배치하도록 한다. 그러나 팝업 윈도우만 따로 이동할 때는 아무런 처리도 하지 않기 때문에 팝업 윈도우를 직접 옮기는 것은 가능하다.

HWND hPopup;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rt;
	char Mes[]="팝업 윈도우의 소유자";

	switch(iMessage) {
	case WM_CREATE:
		hPopup=CreateWindow("ChildCls","팝업 윈도우",
			WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE,
			0,0,200,200,
			hWnd,(HMENU)NULL,g_hInst,NULL);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,5,5,Mes,lstrlen(Mes));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_MOVE:
		GetWindowRect(hWnd, &rt);
		SetWindowPos(hPopup, HWND_NOTOPMOST, rt.right, rt.top, 0, 0, SWP_NOSIZE);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

LRESULT CALLBACK ChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	static char Mes[128];

	switch(iMessage) {
	case WM_MOVE:
		wsprintf(Mes,"X=%d, Y=%d",LOWORD(lParam), HIWORD(lParam));
		InvalidateRect(hWnd,NULL,TRUE);
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,5,5,Mes,lstrlen(Mes));
		EndPaint(hWnd, &ps);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

실행중의 모습은 다음과 같다.

부모 윈도우가 WM_MOVE 메시지를 받았을 때 팝업 윈도우를 부모 윈도우의 오른쪽으로 강제로 이동시키도록 하였다. 팝업 윈도우는 자신의 위치가 변경될 때마다 변경된 위치를 작업 영역에 문자열로 보여준다.

플랫폼

95이상

참조

 


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