마우스 입력 개요
마우스는 애플리케이션에 중요하지만 선택적인 사용자 입력 디바이스입니다. 잘 작성된 애플리케이션은 마우스 인터페이스를 포함해야 하지만 사용자 입력을 얻기 위해 마우스만 사용하면 안 됩니다. 애플리케이션은 전체 키보드 지원도 제공해야 합니다.
애플리케이션은 마우스 입력을 해당 창에 보내거나 게시하는 메시지 형식으로 받습니다.
이 섹션에서는 다음 항목을 다룹니다.
마우스 커서
사용자가 마우스를 움직이면 시스템의 화면에서 마우스 커서라는 비트맵이 움직입니다. 마우스 커서에는 핫 스폿이라는 단일 픽셀 포인트가 포함되며 시스템에서 커서 위치를 추적하고 인식하는 포인트입니다. 마우스 이벤트가 발생하면 일반적으로 핫 스폿이 포함된 창에서 이벤트에 따른 마우스 메시지를 받습니다. 창이 활성 상태이거나 키보드 포커스가 없어도 마우스 메시지를 받을 수 있습니다.
시스템은 마우스 속도, 즉 사용자가 마우스를 움직일 때 커서가 움직이는 거리를 제어하는 변수를 유지 관리합니다. SPI_GETMOUSE 또는 SPI_SETMOUSE 플래그가 있는 SystemParametersInfo 함수를 사용하여 마우스 속도를 검색하거나 설정할 수 있습니다. 마우스 커서에 대한 자세한 내용은 커서를 참조하세요.
마우스 캡처
마우스 이벤트가 발생하면 일반적으로 시스템에서 마우스 메시지를 커서 핫 스폿이 포함된 창에 게시합니다. 애플리케이션은 마우스 메시지를 특정 창으로 라우팅하기 위해 SetCapture 함수를 사용하여 이 동작을 변경할 수 있습니다. 애플리케이션에서 ReleaseCapture 함수를 호출하거나 다른 캡처 창을 지정하거나 사용자가 다른 스레드에서 만든 창을 클릭할 때까지 창에서 모든 마우스 메시지를 받습니다.
마우스 캡처가 변경되면 시스템에서 WM_CAPTURECHANGED 메시지를 마우스 캡처가 손실되는 창에 보냅니다. 메시지의 lParam 매개 변수는 마우스 캡처를 가져오는 창에 대한 핸들을 지정합니다.
전경 창만 마우스 입력을 캡처할 수 있습니다. 배경 창에서 마우스 입력을 캡처하려고 하면 커서 핫 스폿이 창의 표시되는 부분 내에 있을 때 발생하는 마우스 이벤트에 대해서만 메시지를 받습니다.
마우스 입력 캡처는 커서가 창 밖으로 이동하더라도 창에서 모든 마우스 입력을 받아야 하는 경우에 유용합니다. 예를 들어 애플리케이션은 일반적으로 마우스 단추 위로 이벤트가 발생한 후 커서 위치를 추적하여 마우스 단추 아래로 이벤트가 발생할 때까지 커서를 따라갑니다. 애플리케이션에서 마우스 입력을 캡처하지 않고 사용자가 마우스 단추를 창 밖에 놓으면 단추 아래로 메시지가 창에 표시되지 않습니다.
스레드는 GetCapture 함수를 사용하여 창 중 하나에서 마우스를 캡처했는지 여부를 확인할 수 있습니다. 스레드의 창 중 하나에서 마우스를 캡처한 경우 GetCapture는 창에 대한 핸들을 검색합니다.
마우스 클릭 잠금
마우스 클릭 잠금 접근성 기능을 사용하면 사용자가 한 번의 클릭으로 기본 마우스 단추를 잠글 수 있습니다. 애플리케이션에는 단추가 여전히 눌려 있는 것처럼 표시됩니다. 단추 잠금을 해제하려면 애플리케이션에서 마우스 메시지를 보내거나 사용자가 마우스 단추를 클릭하면 됩니다. 이 기능을 사용하면 사용자가 복잡한 마우스 조합을 더 간단하게 수행할 수 있습니다. 예를 들어 특정 물리적 제한이 있는 사용자는 텍스트를 강조 표시하거나 개체를 끌거나 메뉴를 더 쉽게 열 수 있습니다. 자세한 내용은 SystemParametersInfo에서 다음 플래그 및 설명을 참조하세요.
- SPI_GETMOUSECLICKLOCK
- SPI_SETMOUSECLICKLOCK
- SPI_GETMOUSECLICKLOCKTIME
- SPI_SETMOUSECLICKLOCKTIME
마우스 구성
마우스는 애플리케이션에 중요한 입력 디바이스이지만 모든 사용자가 반드시 마우스를 가지고 있는 것은 아닙니다. 애플리케이션은 SM_MOUSEPRESENT 값을 GetSystemMetrics 함수에 전달하여 시스템에 마우스가 포함되어 있는지 확인할 수 있습니다.
Windows는 최대 3개의 단추가 있는 마우스를 지원합니다. 3개 단추 마우스에서 단추는 왼쪽, 가운데 및 오른쪽 단추로 지정됩니다. 마우스 단추와 관련된 메시지 및 명명된 상수는 L, M 및 R 문자를 사용하여 단추를 식별합니다. 단일 단추 마우스의 단추는 왼쪽 단추로 간주됩니다. Windows에서 여러 단추가 있는 마우스를 지원하지만 대부분의 애플리케이션은 왼쪽 단추를 주로 사용하고 나머지 단추는 최소한으로 사용합니다.
또한 애플리케이션에서 마우스 휠을 지원할 수 있습니다. 마우스 휠을 누르거나 회전할 수 있습니다. 마우스 휠을 누르면 가운데(세 번째) 단추로 작동하여 일반 가운데 단추 메시지를 애플리케이션에 보냅니다. 회전하면 휠 메시지를 애플리케이션에 보냅니다. 자세한 내용은 마우스 휠 섹션을 참조하세요.
애플리케이션은 애플리케이션 명령 단추를 지원할 수 있습니다. X 단추라고 하는 이러한 단추는 인터넷 브라우저, 이메일 및 미디어 서비스에 더 쉽게 액세스할 수 있도록 설계되었습니다. X 단추를 누르면 WM_APPCOMMAND 메시지를 애플리케이션에 보냅니다. 자세한 내용은 WM_APPCOMMAND 메시지의 설명을 참조하세요.
애플리케이션은 SM_CMOUSEBUTTONS 값을 GetSystemMetrics 함수에 전달하여 마우스의 단추 수를 확인할 수 있습니다. 왼손 사용자에 대한 마우스를 구성하려면 애플리케이션에서 SwapMouseButton 함수를 사용하여 마우스 왼쪽 및 오른쪽 단추의 의미를 반대로 바꿀 수 있습니다. SPI_SETMOUSEBUTTONSWAP 값을 SystemParametersInfo 함수에 전달하는 것은 단추의 의미를 반대로 바꾸는 또 다른 방법입니다. 그러나 마우스는 공유 리소스이므로 단추의 의미를 반대로 바꾸면 모든 애플리케이션에 영향을 줍니다.
XBUTTON
Windows는 5개 단추가 있는 마우스를 지원합니다. 왼쪽, 가운데, 오른쪽 단추 외에도 브라우저를 사용할 때 뒤로 및 앞으로 탐색을 제공하는 XBUTTON1 및 XBUTTON2가 있습니다.
창 관리자는 WM_XBUTTON* 및 WM_NCXBUTTON* 메시지를 통해 XBUTTON1 및 XBUTTON2를 지원합니다. 이러한 메시지에서 WPARAM의 HIWORD에는 누른 X 단추를 나타내는 플래그가 포함되어 있습니다. 이러한 마우스 메시지는 WM_MOUSEFIRST와 WM_MOUSELAST 상수 간에도 적합하므로 애플리케이션에서 GetMessage 또는 PeekMessage를 사용하여 모든 마우스 메시지를 필터링할 수 있습니다.
XBUTTON1 및 XBUTTON2를 지원하는 마우스 메시지는 다음과 같습니다.
- WM_APPCOMMAND
- WM_NCXBUTTONDBLCLK
- WM_NCXBUTTONDOWN
- WM_NCXBUTTONUP
- WM_XBUTTONDBLCLK
- WM_XBUTTONDOWN
- WM_XBUTTONUP
- MOUSEHOOKSTRUCTEX
이러한 단추를 지원하도록 수정된 API는 다음과 같습니다.
구성 요소 애플리케이션의 자식 창에서 XBUTTON1 및 XBUTTON2에 대한 명령을 직접 구현할 가능성은 거의 없습니다. 따라서 DefWindowProc는 X 단추를 클릭할 때 WM_APPCOMMAND 메시지를 창에 보냅니다. DefWindowProc도 WM_APPCOMMAND 메시지를 부모 창에 보냅니다. 이는 마우스 오른쪽 단추를 클릭하여 바로 가기 메뉴가 호출되는 방식과 비슷합니다. 즉, DefWindowProc에서 WM_CONTEXTMENU 메시지를 메뉴에 보내고 해당 부모 메뉴에도 보냅니다. 또한 DefWindowProc에서 최상위 창에 대한 WM_APPCOMMAND 메시지를 받으면 HSHELL_APPCOMMAND 코드를 사용하여 셸 후크를 호출합니다.
브라우저 기능, 미디어 기능, 애플리케이션 시작 및 전원 관리에 대한 추가 키가 있는 키보드를 지원합니다. 자세한 내용은 검색 및 기타 기능에 대한 키보드 키를 참조하세요.
마우스 메시지
사용자가 마우스를 움직이거나 마우스 단추를 누르거나 놓으면 마우스에서 입력 이벤트를 생성합니다. 시스템은 마우스 입력 이벤트를 메시지로 변환하고 적절한 스레드의 메시지 큐에 게시합니다. 스레드가 처리할 수 있는 것보다 더 빠르게 마우스 메시지가 게시되면 시스템에서 가장 최근의 마우스 메시지를 제외한 모든 메시지를 삭제합니다.
커서가 창의 테두리 내에 있는 동안 마우스 이벤트가 발생하거나 창에서 마우스를 캡처한 경우 창은 마우스 메시지를 받습니다. 마우스 메시지는 클라이언트 영역 메시지와 비 클라이언트 영역 메시지의 두 그룹으로 나뉩니다. 일반적으로 애플리케이션은 클라이언트 영역 메시지를 처리하고 비 클라이언트 영역 메시지를 무시합니다.
이 섹션에서는 다음 항목을 다룹니다.
클라이언트 영역 마우스 메시지
마우스 이벤트가 창의 클라이언트 영역 내에서 발생하면 창에서 클라이언트 영역 마우스 메시지를 받습니다. 사용자가 클라이언트 영역 내에서 커서를 이동하면 시스템에서 WM_MOUSEMOVE 메시지를 창에 게시합니다. 커서가 클라이언트 영역 내에 있는 동안 사용자가 마우스 단추를 누르거나 놓으면 다음 메시지 중 하나를 게시합니다.
메시지 | 의미 |
---|---|
WM_LBUTTONDBLCLK | 마우스 왼쪽 단추를 두 번 클릭했습니다. |
WM_LBUTTONDOWN | 마우스 왼쪽 단추를 눌렀습니다. |
WM_LBUTTONUP | 마우스 왼쪽 단추를 놓았습니다. |
WM_MBUTTONDBLCLK | 마우스 가운데 단추를 두 번 클릭했습니다. |
WM_MBUTTONDOWN | 마우스 가운데 단추를 눌렀습니다. |
WM_MBUTTONUP | 마우스 가운데 단추를 놓았습니다. |
WM_RBUTTONDBLCLK | 마우스 오른쪽 단추를 두 번 클릭했습니다. |
WM_RBUTTONDOWN | 마우스 오른쪽 단추를 눌렀습니다. |
WM_RBUTTONUP | 마우스 오른쪽 단추를 놓았습니다. |
WM_XBUTTONDBLCLK | X 마우스 단추를 두 번 클릭했습니다. |
WM_XBUTTONDOWN | X 마우스 단추를 눌렀습니다. |
WM_XBUTTONUP | X 마우스 단추를 놓았습니다. |
또한 애플리케이션은 TrackMouseEvent 함수를 호출하여 시스템에서 두 개의 다른 메시지를 보내도록 할 수 있습니다. 커서가 특정 시간 동안 클라이언트 영역 위를 가리키면 WM_MOUSEHOVER 메시지를 게시합니다. 커서가 클라이언트 영역을 벗어나면 WM_MOUSELEAVE 메시지를 게시합니다.
메시지 매개 변수
클라이언트 영역 마우스 메시지의 lParam 매개 변수는 커서 핫 스폿의 위치를 나타냅니다. 하위 단어는 핫 스폿의 x 좌표를 나타내고, 상위 단어는 y 좌표를 나타냅니다. 좌표는 클라이언트 좌표로 지정됩니다. 클라이언트 좌표계에서 화면의 모든 포인트는 클라이언트 영역의 왼쪽 위쪽 모서리 좌표(0,0)를 기준으로 지정됩니다.
wParam 매개 변수에는 마우스 이벤트가 발생할 때 다른 마우스 단추와 Ctrl 및 Shift 키의 상태를 나타내는 플래그가 포함됩니다. 마우스 메시지 처리가 다른 마우스 단추의 상태 또는 Ctrl 또는 Shift 키의 상태에 따라 달라지는 경우 이러한 플래그를 확인할 수 있습니다. wParam 매개 변수는 다음 값의 조합일 수 있습니다.
값 | 설명 |
---|---|
MK_CONTROL | Ctrl 키가 눌려져 있습니다. |
MK_LBUTTON | 마우스 왼쪽 단추가 눌려져 있습니다. |
MK_MBUTTON | 마우스 가운데 단추가 눌려져 있습니다. |
MK_RBUTTON | 마우스 오른쪽 단추가 눌려져 있습니다. |
MK_SHIFT | Shift 키가 눌려져 있습니다. |
MK_XBUTTON1 | 첫 번째 X 단추가 눌려 있습니다. |
MK_XBUTTON2 | 두 번째 X 단추가 눌려 있습니다. |
두 번 클릭 메시지
사용자가 마우스 단추를 연속으로 빠르게 두 번 클릭하면 시스템에서 두 번 클릭 메시지를 생성합니다. 사용자가 단추를 클릭하면 시스템에서 커서 핫 스폿을 중심으로 사각형을 설정합니다. 클릭이 발생한 시간도 표시합니다. 사용자가 동일한 단추를 두 번 클릭하면 시스템에서 핫 스폿이 여전히 사각형 내에 있는지 여부를 확인하고 첫 번째 클릭 이후 경과된 시간을 계산합니다. 핫 스폿이 여전히 사각형 내에 있고 경과된 시간이 두 번 클릭 제한 시간 값을 초과하지 않으면 시스템에서 두 번 클릭 메시지를 생성합니다.
애플리케이션은 GetDoubleClickTime 및 SetDoubleClickTime 함수를 각각 사용하여 두 번 클릭 시간 초과 값을 가져오고 설정할 수 있습니다. 또는 애플리케이션에서 SystemParametersInfo 함수와 함께 SPI_SETDOUBLECLICKTIME 플래그를 사용하여 두 번 클릭 시간 초과 값을 설정할 수 있습니다. 또한 SPI_SETDOUBLECLKWIDTH 및 SPI_SETDOUBLECLKHEIGHT 플래그를 SystemParametersInfo에 전달하여 시스템에서 두 번 클릭을 감지하는 데 사용하는 사각형의 크기를 설정할 수 있습니다. 그러나 두 번 클릭 시간 초과 값 및 사각형을 설정하면 모든 애플리케이션에 영향을 줍니다.
애플리케이션 정의 창은 기본적으로 두 번 클릭 메시지를 받지 않습니다. 두 번 클릭 메시지 생성하는 데 관련된 시스템 오버헤드로 인해 이러한 메시지는 CS_DBLCLKS 클래스 스타일이 있는 클래스에 속하는 창에 대해서만 생성됩니다. 이 스타일은 창 클래스를 등록할 때 애플리케이션에서 설정해야 합니다. 자세한 내용은 Window 클래스를 참조하세요.
두 번 클릭 메시지는 항상 4개의 메시지 시리즈에서 세 번째 메시지입니다. 처음 두 메시지는 첫 번째 클릭으로 생성된 단추 아래로 및 단추 위로 메시지입니다. 두 번째 클릭은 두 번 클릭 메시지 및 다른 단추 아래로 메시지를 차례로 생성합니다. 예를 들어 마우스 왼쪽 단추를 두 번 클릭하면 다음 메시지 시퀀스가 생성됩니다.
창은 항상 두 번 클릭 메시지를 받기 전에 단추 아래로 메시지를 받으므로 애플리케이션은 일반적으로 두 번 클릭 메시지를 사용하여 단추 아래로 메시지 동안 시작된 작업을 확장합니다. 예를 들어 사용자가 Microsoft 그림판의 색상표에서 색을 클릭하면 그림판에서 색상표 옆에 선택한 색을 표시합니다. 사용자가 색을 두 번 클릭하면 그림판에서 해당 색을 표시하고 색 편집 대화 상자를 엽니다.
비 클라이언트 영역 마우스 메시지
클라이언트 영역을 제외한 창의 일부에서 마우스 이벤트가 발생하면 창에서 비 클라이언트 영역 마우스 메시지를 받습니다. 창의 비 클라이언트 영역은 테두리, 메뉴 모음, 제목 표시줄, 스크롤 막대, 창 메뉴, 최소화 단추 및 최대화 단추로 구성됩니다.
시스템은 주로 자체 용도를 위해 비 클라이언트 영역 메시지를 생성합니다. 예를 들어 커서 핫 스폿이 창 테두리로 이동할 때 시스템에서 비 클라이언트 영역 메시지를 사용하여 커서를 양방향 화살표로 변경합니다. 기본 제공 마우스 인터페이스를 활용하려면 창에서 비 클라이언트 영역 마우스 메시지를 DefWindowProc 함수에 전달해야 합니다.
각 클라이언트 영역 마우스 메시지에 해당하는 비 클라이언트 영역 마우스 메시지가 있습니다. 이러한 메시지의 이름은 비 클라이언트 영역 메시지에 대한 명명된 상수에 NC 문자가 포함된다는 점을 제외하고 비슷합니다. 예를 들어 비 클라이언트 영역에서 커서를 이동하면 WM_NCMOUSEMOVE 메시지가 생성되고, 커서가 비 클라이언트 영역에 있는 동안 마우스 왼쪽 단추를 누르면 WM_NCLBUTTONDOWN 메시지가 생성됩니다.
비 클라이언트 영역 마우스 메시지의 lParam 매개 변수는 커서 핫 스폿의 x 및 y 좌표를 포함하는 구조체입니다. 클라이언트 영역 마우스 메시지의 좌표와 달리 좌표는 클라이언트 좌표가 아닌 화면 좌표로 지정됩니다. 화면 좌표계에서 화면의 모든 포인트는 화면의 왼쪽 위 모서리 좌표(0,0)를 기준으로 합니다.
wParam 매개 변수에는 비 클라이언트 영역에서 마우스 이벤트가 발생한 위치를 나타내는 값인 적중 테스트 값이 포함됩니다. 다음 섹션에서는 적중 테스트 값의 용도를 설명합니다.
WM_NCHITTEST 메시지
마우스 이벤트가 발생할 때마다 시스템은 WM_NCHITTEST 메시지를 커서 핫 스폿이 포함된 창 또는 마우스를 캡처한 창에 보냅니다. 시스템은 이 메시지를 사용하여 클라이언트 영역 또는 비 클라이언트 영역 마우스 메시지를 보낼지 여부를 결정합니다. 마우스 이동 및 마우스 단추 메시지를 받아야 하는 애플리케이션은 WM_NCHITTEST 메시지를 DefWindowProc 함수에 전달해야 합니다.
WM_NCHITTEST 메시지의 lParam 매개 변수에는 커서 핫 스폿의 화면 좌표가 포함되어 있습니다. DefWindowProc 함수는 좌표를 검사하고 핫 스폿의 위치를 나타내는 적중 테스트 값을 반환합니다. 적중 테스트 값은 다음 값 중 하나일 수 있습니다.
값 | 핫 스폿의 위치 |
---|---|
HTBORDER | 크기 조정 테두리가 없는 창의 테두리에 있습니다. |
HTBOTTOM | 창의 아래쪽 가로 테두리에 있습니다. |
HTBOTTOMLEFT | 창 테두리의 왼쪽 아래 모서리에 있습니다. |
HTBOTTOMRIGHT | 창 테두리의 오른쪽 아래 모서리에 있습니다. |
HTCAPTION | 제목 표시줄에 있습니다. |
HTCLIENT | 클라이언트 영역에 있습니다. |
HTCLOSE | 닫기 단추에 있습니다. |
HTERROR | 화면 배경 또는 창 간 구분선에 있습니다(DefWindowProc 함수에서 오류를 나타내는 시스템 경고음을 생성한다는 점을 제외하고 HTNOWHERE와 동일). |
HTGROWBOX | 크기 상자에 있습니다(HTSIZE와 동일). |
HTHELP | 도움말 단추에 있습니다. |
HTHSCROLL | 가로 스크롤 막대에 있습니다. |
HTLEFT | 창의 왼쪽 테두리에 있습니다. |
HTMENU | 메뉴에 있습니다. |
HTMAXBUTTON | 최대화 단추에 있습니다. |
HTMINBUTTON | 최소화 단추에 있습니다. |
HTNOWHERE | 화면 배경 또는 창 간 구분선에 있습니다. |
HTREDUCE | 최소화 단추에 있습니다. |
HTRIGHT | 창의 오른쪽 테두리에 있습니다. |
HTSIZE | 크기 상자에 있습니다(HTGROWBOX와 동일). |
HTSYSMENU | 시스템 메뉴 또는 자식 창의 닫기 단추에 있습니다. |
HTTOP | 창의 위쪽 가로 테두리에 있습니다. |
HTTOPLEFT | 창 테두리의 왼쪽 위 모서리에 있습니다. |
HTTOPRIGHT | 창 테두리의 오른쪽 위 모서리에 있습니다. |
HTTRANSPARENT | 현재 동일한 스레드의 다른 창으로 가려진 창에 있습니다. |
HTVSCROLL | 세로 스크롤 막대에 있습니다. |
HTZOOM | 최대화 단추에 있습니다. |
커서가 창의 클라이언트 영역에 있으면 DefWindowProc에서 HTCLIENT 적중 테스트 값을 창 프로시저에 반환합니다. 창 프로시저에서 이 코드를 시스템에 반환하면 시스템은 커서 핫 스폿의 화면 좌표를 클라이언트 좌표로 변환한 다음, 적절한 클라이언트 영역 마우스 메시지를 게시합니다.
커서 핫 스폿이 창의 비 클라이언트 영역에 있으면 DefWindowProc 함수에서 다른 적중 테스트 값 중 하나를 반환합니다. 창 프로시저에서 이러한 적중 테스트 값 중 하나를 반환하면 시스템은 비 클라이언트 영역 마우스 메시지를 게시하여 적중 테스트 값을 메시지의 wParam 매개 변수에 배치하고 커서 좌표를 lParam 매개 변수에 배치합니다.
마우스 음파
마우스 음파 접근성 기능은 사용자가 Ctrl 키를 눌렀다가 놓으면 여러 동심원을 포인터 주위에 간략하게 표시합니다. 이 기능을 사용하면 사용자가 복잡하거나 높은 해상도가 설정된 화면이나 품질이 좋지 않은 모니터에서 또는 시각 장애가 있는 사용자를 위해 마우스 포인터를 찾을 수 있습니다. 자세한 내용은 SystemParametersInfo에서 다음 플래그를 참조하세요.
SPI_GETMOUSESONAR
SPI_SETMOUSESONAR
마우스 소실
마우스 소실 접근성 기능은 사용자가 입력할 때 포인터를 숨깁니다. 사용자가 마우스를 움직이면 마우스 포인터가 다시 나타납니다. 예를 들어 이 기능은 이메일 또는 기타 문서에서 입력되는 텍스트를 가리지 않도록 포인터를 유지합니다. 자세한 내용은 SystemParametersInfo에서 다음 플래그를 참조하세요.
SPI_GETMOUSEVANISH
SPI_SETMOUSEVANISH
마우스 휠
마우스 휠은 휠과 마우스 단추의 기능을 결합한 것입니다. 휠에는 불연속적이고 균등한 간격의 노치가 있습니다. 휠을 회전하면 각 노치가 발생할 때마다 휠 메시지를 애플리케이션에 보냅니다. 또한 휠 단추는 일반 Windows 가운데(세 번째) 단추로 작동할 수 있습니다. 마우스 휠을 눌렀다가 놓으면 표준 WM_MBUTTONUP 및 WM_MBUTTONDOWN 메시지를 보냅니다. 세 번째 단추를 두 번 클릭하면 표준 WM_MBUTTONDBLCLK 메시지를 보냅니다.
마우스 휠은 WM_MOUSEWHEEL 메시지를 통해 지원됩니다.
마우스를 회전하면 WM_MOUSEWHEEL 메시지를 포커스 창에 보냅니다. DefWindowProc 함수는 메시지를 창의 부모에 전파합니다. 메시지를 처리하는 창이 검색될 때까지 DefWindowProc에서 해당 메시지를 부모 체인 위로 전파하므로 메시지의 내부 전달이 없어야 합니다.
스크롤 줄 수 결정
애플리케이션은 SystemParametersInfo 함수를 사용하여 각 스크롤 작업(휠 노치)에 대해 문서가 스크롤하는 줄 수를 검색해야 합니다. 줄 수를 검색하기 위해 애플리케이션에서 다음을 호출합니다.
SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, pulScrollLines, 0)
한정자 키 없이 마우스 휠을 회전하는 경우 "pulScrollLines" 변수는 스크롤할 제안된 줄 수를 받는 부호 없는 정수 값을 가리킵니다.
- 이 숫자가 0인 경우 스크롤이 수행되지 않습니다.
- 이 숫자가 WHEEL_PAGESCROLL인 경우 휠 롤은 스크롤 막대의 페이지 아래로 또는 페이지 위로 영역을 한 번 클릭하는 것으로 해석해야 합니다.
- 스크롤할 줄 수가 볼 수 있는 줄 수보다 큰 경우 스크롤 작업도 페이지 아래로 또는 페이지 위로 작업으로 해석해야 합니다.
스크롤 줄 수의 기본값은 3입니다. 사용자가 제어판의 마우스 속성 시트를 사용하여 스크롤 줄 수를 변경하면 운영 체제에서 WM_SETTINGCHANGE 메시지를 SPI_SETWHEELSCROLLLINES가 지정된 모든 최상위 창에 브로드캐스트합니다. 애플리케이션에서 WM_SETTINGCHANGE 메시지를 받으면 다음을 호출하여 새 스크롤 줄 수를 가져올 수 있습니다.
SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, pulScrollLines, 0)
스크롤 컨트롤
아래 표에는 스크롤 기능이 있는 컨트롤이 나와 있습니다(사용자가 설정한 스크롤 줄 포함).
컨트롤 | 스크롤 |
---|---|
편집 컨트롤 | 가로 및 세로 |
목록 상자 컨트롤 | 가로 및 세로 |
콤보 상자 | 드롭다운되지 않으면 각 스크롤에서 다음 또는 이전 항목을 검색합니다. 드롭다운되면 각 스크롤에서 메시지를 그에 따라 스크롤하는 목록 상자에 전달합니다. |
CMD(명령줄) | 세로 방향입니다. |
트리 보기 | 가로 및 세로 |
목록 뷰 | 가로 및 세로 |
위로/아래로 스크롤 | 한 번에 하나의 항목 |
트랙바 스크롤 | 한 번에 하나의 항목 |
Microsoft Rich Edit 1.0 | 세로 방향입니다. Exchange 클라이언트에는 휠을 지원하지 않는 자체 버전의 목록 보기 및 트리 보기 컨트롤이 있습니다. |
Microsoft Rich Edit 2.0 | 세로 방향입니다. |
휠이 있는 마우스 감지
휠이 있는 마우스가 연결되어 있는지 확인하려면 SM_MOUSEWHEELPRESENT를 사용하여 GetSystemMetrics를 호출합니다. TRUE 반환 값은 마우스가 연결되어 있음을 나타냅니다.
다음 예제는 여러 줄 편집 컨트롤에 대한 창 프로시저에서 가져온 것입니다.
BOOL ScrollLines(
PWNDDATA pwndData, //scrolls the window indicated
int cLinesToScroll); //number of times
short gcWheelDelta; //wheel delta from roll
PWNDDATA pWndData; //pointer to structure containing info about the window
UINT gucWheelScrollLines=0;//number of lines to scroll on a wheel rotation
gucWheelScrollLines = SystemParametersInfo(SPI_GETWHEELSCROLLLINES,
0,
pulScrollLines,
0);
case WM_MOUSEWHEEL:
/*
* Do not handle zoom and datazoom.
*/
if (wParam & (MK_SHIFT | MK_CONTROL)) {
goto PassToDefaultWindowProc;
}
gcWheelDelta -= (short) HIWORD(wParam);
if (abs(gcWheelDelta) >= WHEEL_DELTA && gucWheelScrollLines > 0)
{
int cLineScroll;
/*
* Limit a roll of one (1) WHEEL_DELTA to
* scroll one (1) page.
*/
cLineScroll = (int) min(
(UINT) pWndData->ichLinesOnScreen - 1,
gucWheelScrollLines);
if (cLineScroll == 0) {
cLineScroll++;
}
cLineScroll *= (gcWheelDelta / WHEEL_DELTA);
assert(cLineScroll != 0);
gcWheelDelta = gcWheelDelta % WHEEL_DELTA;
return ScrollLines(pWndData, cLineScroll);
}
break;
창 활성화
사용자가 비활성 최상위 창 또는 비활성 최상위 창의 자식 창을 클릭하면 시스템에서 WM_MOUSEACTIVATE 메시지를 최상위 또는 자식 창에 보냅니다. 시스템에서 이 메시지는 WM_NCHITTEST 메시지를 창에 게시한 후 단추 아래로 메시지를 게시하기 전에 보냅니다. WM_MOUSEACTIVATE가 DefWindowProc 함수에 전달되면 시스템에서 최상위 창을 활성화한 다음, 단추 아래로 메시지를 최상위 또는 자식 창에 게시합니다.
WM_MOUSEACTIVATE를 처리하면 창에서 마우스 클릭의 결과로 최상위 창이 활성 창이 되는지 여부와 클릭된 창에서 후속 단추 아래로 메시지를 받는지 여부를 제어할 수 있습니다. WM_MOUSEACTIVATE가 처리되면 다음 값 중 하나를 반환하여 이 작업을 수행합니다.
값 | 의미 |
---|---|
MA_ACTIVATE | 창을 활성화하고 마우스 메시지를 삭제하지 않습니다. |
MA_NOACTIVATE | 창을 활성화하지 않고 마우스 메시지를 삭제하지 않습니다. |
MA_ACTIVATEANDEAT | 창을 활성화하고 마우스 메시지를 삭제합니다. |
MA_NOACTIVATEANDEAT | 창을 활성화하지 않고 마우스 메시지를 삭제합니다. |