LPARAM과 WPARAM은 메세지에 대한 추가적인 정보를 가지고 있다.
예를 들어 키보드를 눌렀을 경우 메세지가 발생하는데
무슨 키를 눌렀는지 2개의 키를 동시에 눌렀는지등등..
마우스를 클릭햇을 경우도 메세지가 발생하는데
어느 위치에 눌렀는지 등등
LPARAM은 보통 위치정보,
WPARAM은 보통 어떤키를 눌렀는지 중복키를 눌렀는지 정보, resource의 발생정보
(표1) 기본적인 마우스 메시지
메시지 |
내용 |
lParam |
wParam |
WM_LBUTTONDOWN |
좌측 마우스 버튼을 눌렀 을때 |
마우스 위치 |
키상태정보 |
WM_LBUTTONUP |
좌측 마우스 버튼을 |
마우스 위치 |
키상태정보 |
WM_RBUTTONDOWN |
우측 마우스 버튼을 |
마우스 위치 |
키상태정보 |
WM_RBUTTONUP |
우측 마우스 버튼을 |
마우스 위치 |
키상태정보 |
WM_MOUSEMOVE |
마우스가 움직일때 |
마우스 위치 |
키상태정보 |
마우스가 클릭하였을 때 마우스에 대한 메시지가 발생되는데 클라이언트 영역과 비 클라이언트 영역에 분리되어
다르게 나타난다.
클라이언트 영역이란 윈도우 타이틀바와 외곽선을 제외한 즉 실제로 WM_PAINT메시지에 의해서 그래픽을
출력하는 영역을 말한다.
마우스가 눌려졌을 경우에는 어느 부분이 눌려졌다는 정보를 보내주어야 한다.
이 정보를 lParam에 기록한다.
lParam은 32비트 LONG형이다.
이 형에 마우스 정보를 입력하여 알려주게 된다.
우리는 보통 위치 좌표를 사용할 경우 2차 평면에서는 (X,Y)를 사용한다.
즉 정보값이 최소 2개라는 의미이다. 헌데 lParam은 한 개의 정보 저장 장소이다.
이 저장장소에 두 개의 값을 저장하기 위해서 lParam을 16비트씩 잘라서 상위 16비트에는 Y좌표를 하위
16비트에는 X좌표값을 넣어서 보내준다.
lParam안에 X,Y의 자표값이 나누어져 들어가 있기 때문에 우리는 이 값을 분리해야 한다.
다행히도 윈도우 lParam의 값에서 상위 16비트를 얻고자 한다면 HIWORD함수를 사용해야 한다.
int y = HIWORD(lParam) int x = LOWORD(lParam)
좌측 마우스 버튼의 클릭 메시지 처럼 우측 마우스 버튼 클릭 메시지도 같은 방법으로 lParam에 위좌표를
넣어서 전송한다.
마우스 더블클릭메시지
더블 클릭이란 연속적으로 빠르게 마우스 버튼을 두번 클릭하는 것이다.
이 메시지를 이벤트를 받기 위해서는 WNDCLASSEX의 멤버변수 style안에 CS_DBCLKS 삽입시킴으로서 이벤트를 받을수 있다.
이 값을 대입하기전 CS_DBLKS라는 값을 대입하면 연속적으로 두번 눌렀을 경우 WM_LBUTTONDOWN이 연속적으로 들어오는 것과 동시에 WM_LBUTTONDBLCKS가 발생
이 더블 클릭 메시지는 사실 시스템에서 발생하는 메시지가 아니라 어플리케이션에서 조합하여 만든 메시지이다.
어느 일정한 시간 구간안에서 WM_LBUTTONDOWN이 발생하면 이것을 WM_BUTTONDBLCKS로 바꾸어서 메시지 큐에 삽입하기 때문이다.
이때 사용하는 함수가 GetMessageTime인데 이 함수는 현재 메시지 큐에서 가장 최근에 얻은 메시지의 시간을 얻는 함수이다.
이 함수를 통해서 어느 시간 사이에 WM_LBUTTONDOWN 메시지가 연속적으로 발생하였을때 이 메시지와 함께 WM_BLUTTONDDBLCLK로 발생하게 되는것이다.
이런 이유로 더블클릭 메시지는 WM_LBUTTONDOWN이나 WM_RBUTTONDOWN과 같이 lParam과 wParam에 저장되는 정보의 값은 같다.
어플리케이션을 만들 경우 좌측 마우스 버튼을 눌렀을때와 더블 클릭을 했을 경우 이 두개를 분리하여 처리할 경우가 있다.
그러나 메시지는 더블 클릭했을 경우 두개의 메시지가 동시적으로 발생하기 때문에 이것을 막기는 어렵다.
비클라이언트 영역
메시지 |
내용 |
lParam |
wParam |
WM_NCLBUTTONDOWN |
좌측 마우스 버튼을 |
마우스 |
Hit-test정보 |
WM_NCLBUTTONUP |
좌측 마우스 버튼을 |
마우스 |
Hit-test정보 |
WM_NCRBUTTONDOWN |
우측 마우스 버튼을 |
마우스 |
Hit-test정보 |
WM_NCRBUTTONUP |
우측 마우스 버튼을 |
마우스 |
Hit-test정보 |
WM_NCMOUSEMOVE |
마우스가 움직일때 |
마우스 |
Hit-test정보 |
[출처] WPARAM과 LPARAM의 역할
'Sunmoon_BIT > Win32API' 카테고리의 다른 글
소켓 통신 관련 함수 - Win32API (0) | 2010.01.18 |
---|---|
API사용중 콘솔창 띄우기 - Win32API (0) | 2010.01.15 |
API기본셋팅(Visual Studio 6.0) - Win32API (0) | 2010.01.08 |
원을 그리고 키보드로 이동시키기 - Win32API (0) | 2010.01.05 |
Win32API의 기본 윈도우 생성 (0) | 2010.01.05 |