MOUSE
윈도우즈와 같은 GUI운영체제에서는 키보드보다 마우스가 더 많이 사용된다.
키보드 입력 처리를 메시지로 하는 것과 마찬가지로 마우스 입력 처리도 메시지를 받아 처리한다.
마우스 입력에 관한 메시지는 다음과 같은 종류가 있다.
|
마우스 메시지는 lParam의 상위 워드에 마우스 버튼이 눌러진 y좌표, 하위 워드에 x좌표를 가지며
좌표값을 검출해 내기 위해 HIWORD, LOWORD 등의 매크로 함수를 사용한다.
즉 마우스 메시지가 발생한 위치의 좌표는 (LOWORD(lParam),HIWORD(lParam))이 된다.
|
단, 좌표값은 당연히 영수지만 음수가 되는 특별한 경우도 있음을 주의해야 한다.
음수 좌표가 전달되는 경우에는 (int)(short)형으로 다시 한번 더 캐스팅하여 부호를 제대로 변환해야 한다.
wParam에는 마우스 버튼의 상태와 키보드 조합 키(Shift,, Ctrl)의 상태가 전달된다.
조합키 상태는 다음 값들과 비트 연산을 해보면 알 수 있다.
이 값을 참조하면 쉬프트 클릭, 좌우 동시 누름 등의 조건을 검출할 수 있다.
|
마우스 버튼의 누름 메시지 외에 마우스가 이동할 때마다 전달되는 WM_MOUSEMOVE 메시지와
휠 마우스가 등장함으로써 추가된 WM_MOUSEWHEEL이라는 메시지도 있다.
더블클릭(Double Click)
중요한 마우스의 동작 중에 하나가 더블클릭이 잇다.
더블클릭이란 짧은 시간 안에 마우스 버튼을 두 번 빠르게 누르는 동작인데 프로그램 실행, 확정적인 선택 등에 많이 사용된다.
일반적으로 우스 왼쪽 버튼을 두번 누르면 WM_LBUTTONDOWN 메시지와 WM_LBUTTONUP 메시지가 교대로 두 번 발생할 뿐이며
아무리 마우스 버튼을 잽싸게 눌러도 더블클릭 메시지는 발생하지 않는다.
더블 클릭 메시지를 받고자 하면 윈도우 클래스의 스타일에
"이 윈도우는 더블클릭 메시지를 원한다."라는 의사 표시를 해줘야 한다.
WndClass.lpszClassName = lpszClass; |
더블클릭이란 마우스 버튼을 두번 누르기만 한다고 해서 인정되는 것이 아니라
일정한 영역안을 정해진 시간안에 연속적으로 눌러야 인정된다.
더블클릭으로 인정할 시간 간격이나 마우스 포인터의 위치 따위의 규칙을 프로그램에서 자체적으로 만들어 쓰고 싶다면
이 플래그를 주지 말고 직접 처리 해야 한다.
WM_LBUTTONDOWN과 그 일당들은 모두 작업영역 내에서 발생하는 마우스 메시지들이다.
프로그래밍 대상이 ㅈ가업영역에 국한되므로 이 메시지들만 처리하면 마우스 입력은 모두 받을 수 있다.
이런 작업 영역 마우스 메시지외에 비작업영역에서 발생하는 마우스 메시지도 있다.
여기서 비작업영역이란 타이틀 바, 경계선, 메뉴, 스크롤 바 따위를 말한다.
이런 메시지들은 모두 작업영역 메시지의 이름에 NC(Non Client)가 덧붙여진다.
비작업영역 메시지는 시스템이 내부적인 용도로 사용한다.
이런 메시지의 처리는 DefWindowProc에서 도맡아 하므로 프로그램이 직접 처리할 필요는 없다.
표준적인 윈도우만 사용한다면 이 메시지를 사용할 일은 무척 드물다.
-윈도우즈 API 정복 中 -
'Programming Study > Win32 API' 카테고리의 다른 글
입력_윈도우 관리 메시지 (0) | 2014.09.10 |
---|---|
입력_타이머 (0) | 2014.09.10 |
입력_키보드 (0) | 2014.09.10 |
출력 (0) | 2014.09.06 |
윈도우즈 프로그래밍 한번 알아보기 (0) | 2014.09.06 |