WM_MOUSEMOVE

인수

wParam : 키보드와 다른 마우스 버튼의 현재 상태를 나타내는 값이며 다음 플레그들의 조합값이다.

설명
MK_CONTROL Ctrl 키가 눌러져 있다.
MK_LBUTTON 마우스 왼쪽 버튼이 눌러져 있다.
MK_MBUTTON 마우스 가운데 버튼이 눌러져 있다.
MK_RBUTTON 마우스 오른쪽 버튼이 눌러져 있다.
MK_SHIFT Shift키가 눌러져 있다.

LOWORD(lParam), HIWORD(lParam) : 마우스의 현재 X, Y좌표이다. 이 좌표는 작업 영역의 원점을 기준으로 한 좌표이다. 대부분의 경우 좌표는 양수값이지만 캡처된 특수한 상황에서는 음수일 수도 있는데 이 경우 반드시 (int)형으로 다시 한번 더 캐스팅해 주어야 부호를 제대로 얻을 수 있다.

설명

마우스가 움직일 때 이 메시지가 메시지 큐에 붙여진다. 마우스가 캡처되어 있으면 캡처한 윈도우로 이 메시지가 전달되며 그렇지 않을 경우 커서 아래쪽에 있는 윈도우가 이 메시지를 받는다. 마우스가 계속 작업 영역 위에서 움직이고 있으면 이 메시지는 반복적으로 계속 전달된다.

리턴

메시지를 처리했으면 0을 리턴한다.

예제

예제 1

다음 예제는 마우스로 자유 곡선을 그린다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	static int x;
	static int y;
	static BOOL bnowDraw=FALSE;

	switch(iMessage) {
	case WM_LBUTTONDOWN:
		x=(int)(short)LOWORD(lParam);
		y=(int)(short)HIWORD(lParam);
		bnowDraw=TRUE;
		SetCapture(hWnd);
		return 0;
	case WM_MOUSEMOVE:
		if (bnowDraw==TRUE) {
			hdc=GetDC(hWnd);
			MoveToEx(hdc,x,y,NULL);
			x=(int)(short)LOWORD(lParam);
			y=(int)(short)HIWORD(lParam);
			LineTo(hdc,x,y);
			ReleaseDC(hWnd,hdc);
			}
		return 0;
	case WM_LBUTTONUP:
		bnowDraw=FALSE;
		ReleaseCapture();
		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));
}

마우스 버튼을 누를 때의 좌표를 x,y에 기억시켜 놓고 마우스를 캡처한다. 이 상태에서 마우스를 움직이면 마우스가 이동한 거리만큼 직선을 반복적으로 그림으로써 자유 곡선을 긋는다. WM_MOUSEMOVE 메시지는 캡처 여부에 상관없이 항상 전달되므로 bnowDraw 변수로 곡선을 그리고 있는 중인지 아닌지를 먼저 확인해야 한다.

마우스 메시지에서 곡선을 그리기만 할 뿐이며 곡선 정보를 저장하지 않기 때문에 이 예제는 화면을 다시 그리지 못한다.

플랫폼

95이상

참조

그리기 정보의 저장에 대해서는 12장을 참고하기 바란다.


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