Language/WinAPI2011.08.30 14:55
마우스 입력에 대해 알아보자.

마우스 메시지 lParam 의 상위 워드와 하위 워드로 나눠서 좌표를 가진다. lParam 은 4 byte 이다.



lParam 을 상위 워드와 하위 워드로 검출하는 방법

Y 좌표 - 상위 워드

int y;
y = HIWORD(lParam);

X 좌표 - 하위 워드

int x;
x = LOWORD(lParam);

좌표값은 기본적으로 양수지만 음수가 되는 경우도 있다. 모니터를 2 개 이상 사용될 때 오른쪽 모니터의 입자에서는 좌표값이 음수가 될 수 도있다. 캐스팅을 이용하여 부호를 제대로 변환해야 한다.

마우스 관련 메시지

WM_LBUTTONDOWN -  왼쪽 버튼 누름
WM_RBUTTONDOWN - 오른쪽 버튼 누름
WM_MBUTTONDOWN - 중앙 버튼 누름

WM_LBUTTONUP - 왼쪽 버튼 놓음
WM_RBUTTONUP - 오른쪽 버튼 놓음
WM_MBUTTONUP - 중앙 버튼 놓음

WM_LBUTTONDBLCLK - 왼쪽 버튼 더블 클릭
WM_RBUTTONDBLCLK - 오른쪽 버튼 더블 클릭
WM_MBUTTONDBLCLK - 중앙 버튼 더블 클릭

WM_MOUSEMOVE - 마우스가 이동할 때마다 전달되는 메시지
WM_MOUSEWHEEL - 휠 을 사용할 때마다 전달되는 메시지


더블 클릭 메시지를 사용하기 위해서는 WinMain 함수에 WndClass 를 정의할 때 윈도우 클래스 스타일 부분에 반드시 더블클릭 메시지를 사용할 것이라고 알려줘야한다. CS_DBLCLKS 를 OR 연산자로 추가 해줘야한다. 

WndClass.style = CS_DBLCLKS;

wParam 는 마우스 버튼의 상태와 키보드 조합 키의 상태가 전달된다.

MK_CONTROL - 컨트롤 키가 눌러져 있다.
MK_LBUTTON - 마우스 왼쪽 버튼이 눌러져 있다.
MK_RBUTTON - 마우스 오른쪽 버튼이 눌러져 있다.
MK_MBUTTON - 마우스 중간 버튼이 눌러져 있다.
MK_SHIFT -  쉬프트 키가 눌러져 있다.


lParam 과 wParam 은 32 비트의 크기를 가진다. 이를 분할해서 사용하기 위해 매크로 함수로 정의되어 있다.

#define LOWORD(l)           ((WORD)(l))
#define HIWORD(l)           ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
#define LOBYTE(w)           ((BYTE)(w))
#define HIBYTE(w)           ((BYTE)(((WORD)(w) >> 8) & 0xFF))


분할을 했다면 다시 조합을 해야한다. 조합을 하기 위해 다음과 같이 매크로 함수로 정의되어 있다.

#define MAKEWORD(a, b)      ((WORD)(((BYTE)(a)) | ((WORD)((BYTE)(b))) << 8))
#define MAKELONG(a, b)      ((LONG)(((WORD)(a)) | ((DWORD)((WORD)(b))) << 16))

메시지를 직접 보내고자 할 때 파라미터 조립에 사용된다. 예를 들면 (129, 98) 좌표를 lParam 에 실어 보낸다면 다음과 같다.

MAKELONG(129, 98);




'Language > WinAPI' 카테고리의 다른 글

RegisterClass 함수 - 20110904  (0) 2011.09.04
WinMain 함수 - 20110902  (0) 2011.09.02
SendMessage 함수 - 20110902  (0) 2011.08.30
Timer (타이머) - 20110830  (0) 2011.08.30
mouse (마우스) - 20110830  (0) 2011.08.30
WinAPI 의 윈도우를 만드는 과정  (0) 2011.08.22
Posted by 꿈을모아서

댓글을 달아 주세요