Win32_API - 실습 - 마우스 좌표값 받아오기

컴퓨터/Win32-API

728x90
반응형

서론

지난 실습 프로그래밍을 하던 과정 중 도형, 문자, 컨트롤 등을 Window 좌표상에 표시하기 위해서 상당 부분 불편한 점이 많았습니다.

생각한 좌표를 구하기가 힘들기 때문이었습니다.

본문에서는 간단하게 마우스 커서가 위치한 좌표를 얻어올 수 있는 프로그램을 만들어 보도록 하겠습니다.

 

0. 준비 과정 - 마우스 입력에 대한 이벤트

마우스가 응용프로그램위에서 커서의 형태로 움직이고, 클릭하는 등 다양한 동작에 대해서 이벤트 메시지가 발생하게 됩니다. 본문에서는 그중 마우스가 움직이는 과정에서 생기는 이벤트와 좌표를 얻어 출력하는 프로그램을 만드려고 합니다. 

자세한 내용은 아래 링크를 참조하세요.

 

 

마우스 입력(키보드 및 마우스 입력) - Win32 apps

이 섹션에서는 시스템에서 애플리케이션에 마우스 입력을 제공하는 방법과 애플리케이션이 해당 입력을 수신하고 처리하는 방법을 설명합니다.

docs.microsoft.com

 

1.준비과정 - WM_MOUSEMOVE와 파라미터들

WM_MOUSEMOVE를 통해서 마우스 커서가 움직이는 과정을 통해 마우스의 프로그램상의 좌표를 얻어보겠습니다.

 

 

WM_MOUSEMOVE 메시지(Winuser.h) - Win32 apps

커서가 이동할 때 창에 게시됩니다. 마우스가 캡처되지 않으면 커서가 포함된 창에 메시지가 게시됩니다. 그렇지 않으면 메시지가 마우스를 캡처한 창에 게시됩니다.

docs.microsoft.com

 

위 링크를 보시면 WM_MOUSEMOVE 메시지와 lParam으로 x, y의 좌표를 얻을 수 있다고 나와있습니다.

다만 주의할 점은 lParam으로 마우스의 좌표를 안전하게 얻기 위해서는 LOWORD와 HIWORD가 아닌, 좌표를 얻어오기 위한 함수를 사용해 주어야 합니다.

xPos = GET_X_LPARAM(lParam); 
yPos = GET_Y_LPARAM(lParam);

이 함수는 windowsx.h 에 포함되어있어 추가해 주어야 합니다.

2. 콜백함수에 WM_MOUSEMOVE 처리

#include <windowsx.h> //포지션을 구하는 함수를 사용하기 위해서 추가되어야 함.

    case WM_MOUSEMOVE:

        int x, y;
        x = GET_X_LPARAM(lParam);
        y = GET_Y_LPARAM(lParam);

        break;

위처럼 WM_MOUSEMOVE 메시지 안에서 좌표값 x와 y값을 받아줍니다.

 

 

3. 마우스 커서 위에 좌표값 표시하기

이제 얻은 좌표값을 통해서 마우스 커서 위에 값을 표시해 보도록 합시다.

    case WM_MOUSEMOVE:
        
        int x, y;
        x = GET_X_LPARAM(lParam);
        y = GET_Y_LPARAM(lParam);

        WCHAR text[100];
        wsprintf(text, L" x : %d \t y : %d", x,y);
        hdc = GetDC(hWnd);
        TextOutW(hdc, x+5, y, text, lstrlen(text));

해당 소스코드를 구동해보니.. 기존에 출력했던 TextOut이 남아서 잔상처럼 남게 되었습니다.

 

간단하게 x,y를 전역 변수로 넣고 WM_PAINT에서 그리도록 하겠습니다.

    case WM_PAINT:
            PAINTSTRUCT ps;
            hdc = BeginPaint(hWnd, &ps);
            TextOutW(hdc, x + 10, y + 10, text, lstrlen(text));
            EndPaint(hWnd, &ps);
        break;
    case WM_MOUSEMOVE:
        x = GET_X_LPARAM(lParam);
        y = GET_Y_LPARAM(lParam);
        wsprintf(text, L" x : %d \t y : %d", x,y);
        InvalidateRect(hWnd, NULL, TRUE);
        break;

 

이렇게 해서 간단하게 마우스 커서를 통해 좌표를 얻어 보는 프로그램을 만들어 봤습니다.

 

728x90
반응형

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :