마우스 클릭에 응답
커서가 창의 클라이언트 영역 위에 있는 동안 사용자가 마우스 단추를 클릭하면 창에서 다음 메시지 중 하나를 수신합니다.
메시지 | 의미 |
---|---|
WM_LBUTTONDOWN | 왼쪽 단추 누름 |
WM_LBUTTONUP | 왼쪽 단추 놓음 |
WM_MBUTTONDOWN | 가운데 단추 누름 |
WM_MBUTTONUP | 가운데 단추 놓음 |
WM_RBUTTONDOWN | 오른쪽 단추 누름 |
WM_RBUTTONUP | 오른쪽 단추 놓음 |
WM_XBUTTONDOWN | XBUTTON1 또는 XBUTTON2 누름 |
WM_XBUTTONUP | XBUTTON1 또는 XBUTTON2 놓음 |
클라이언트 영역은 창에서 프레임을 제외한 부분입니다. 클라이언트 영역에 대한 자세한 내용은 창이란?을 참조하세요.
마우스 좌표
모든 메시지에서 lParam 매개 변수에는 마우스 포인터의 x 및 y 좌표가 포함됩니다. lParam의 최하위 16비트에는 x 좌표가 포함되고 다음 16비트에는 y 좌표가 포함됩니다. GET_X_LPARAM 및 GET_Y_LPARAM 매크로를 사용하여 lParam에서 좌표를 분석합니다.
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
이러한 매크로는 헤더 파일 WindowsX.h에 정의되어 있습니다.
64비트 Windows에서 lParam은 64비트 값입니다. lParam의 상위 32비트는 사용되지 않습니다. Windows 설명서에서 lParam의 "낮은 순서 단어" 및 "상위 단어"를 언급하는 경우 64비트 사례는 하위 32비트에서 낮은 단어와 상위 단어를 의미합니다. 매크로는 올바른 값을 추출하므로 사용하면 안전합니다.
마우스 좌표는 DIP(디바이스 독립적 픽셀)가 아닌 픽셀로 지정되며 창의 클라이언트 영역을 기준으로 측정됩니다. 좌표는 부호 있는 값입니다. 클라이언트 영역의 위쪽과 왼쪽에 있는 위치는 음수 좌표이며, 창 외부에서 마우스 위치를 추적하는 경우에 중요합니다. 이 작업을 수행하는 방법은 뒷부분에 나오는 창 외부에서 마우스 이동 캡처 항목에서 확인할 수 있습니다.
추가 플래그
wParam 매개 변수에는 다른 마우스 단추와 Shift 및 Ctrl 키의 상태를 나타내는 비트 OR 플래그가 포함되어 있습니다.
플래그 | 의미 |
---|---|
MK_CONTROL | Ctrl 키가 눌려져 있습니다. |
MK_LBUTTON | 마우스 왼쪽 단추가 눌려져 있습니다. |
MK_MBUTTON | 마우스 가운데 단추가 눌려져 있습니다. |
MK_RBUTTON | 마우스 오른쪽 단추가 눌려져 있습니다. |
MK_SHIFT | Shift 키가 눌려져 있습니다. |
MK_XBUTTON1 | XBUTTON1 단추가 눌려져 있습니다. |
MK_XBUTTON2 | XBUTTON2 단추가 눌려져 있습니다. |
플래그가 없으면 해당 단추나 키를 누르지 않았음을 의미합니다. 예를 들어 Ctrl 키가 눌려져 있는지 테스트하려면 다음을 수행합니다.
if (wParam & MK_CONTROL) { ...
Ctrl 키와 Shift 키 외에 다른 키의 상태를 찾아야 하는 경우 GetKeyState 함수를 사용합니다. 이에 대해서는 키보드 입력에서 설명합니다.
WM_XBUTTONDOWN 및 WM_XBUTTONUP 창 메시지는 XBUTTON1과 XBUTTON2 모두에 적용됩니다. wParam 매개 변수는 클릭한 단추를 나타냅니다.
UINT button = GET_XBUTTON_WPARAM(wParam);
if (button == XBUTTON1)
{
// XBUTTON1 was clicked.
}
else if (button == XBUTTON2)
{
// XBUTTON2 was clicked.
}
두 번 클릭
창은 기본적으로 두 번 클릭 알림을 수신하지 않습니다. 두 번 클릭을 수신하려면 창 클래스를 등록할 때 WNDCLASS 구조체에서 CS_DBLCLKS 플래그를 설정합니다.
WNDCLASS wc = { };
wc.style = CS_DBLCLKS;
/* Set other structure members. */
RegisterClass(&wc);
표시된 대로 CS_DBLCLKS 플래그를 설정하면 창이 두 번 클릭 알림을 수신합니다. 두 번 클릭은 이름에 “DBLCLK”가 포함된 창 메시지로 표시됩니다. 예를 들어 마우스 왼쪽 단추를 두 번 클릭하면 다음과 같은 메시지 시퀀스가 생성됩니다.
사실 일반적으로 생성되는 두 번째 WM_LBUTTONDOWN 메시지는 WM_LBUTTONDBLCLK 메시지가 됩니다. 오른쪽, 가운데 및 XBUTTON 단추에 대해 동일한 메시지가 정의됩니다.
두 번 클릭 메시지가 표시될 때까지 첫 번째 마우스 클릭이 두 번 클릭의 시작임을 알 수 있는 방법은 없습니다. 따라서 두 번 클릭 동작은 첫 번째 마우스 클릭으로 시작하는 동작을 계속해야 합니다. 예를 들어 Windows 셸에서 한 번 클릭하면 폴더가 선택되고 두 번 클릭하면 폴더가 열립니다.
비클라이언트 마우스 메시지
창의 비클라이언트 영역 내에서 발생하는 마우스 이벤트에 대해 별도의 메시지 세트가 정의됩니다. 이러한 메시지의 이름에는 “NC”라는 문자가 있습니다. 예를 들어 WM_NCLBUTTONDOWN은 WM_LBUTTONDOWN와 동일한 비클라이언트 메시지입니다. DefWindowProc 함수가 이러한 메시지를 올바르게 처리하므로 일반적인 애플리케이션은 이러한 메시지를 가로채지 않습니다. 그러나 특정 고급 함수에는 유용할 수 있습니다. 예를 들어 이러한 메시지를 사용하여 제목 표시줄에서 사용자 지정 동작을 구현할 수 있습니다. 이러한 메시지를 처리하는 경우 일반적으로 나중에 DefWindowProc에 전달해야 합니다. 그러지 않으면 애플리케이션에서 창을 끌거나 최소화하는 등의 표준 기능이 중단됩니다.
다음