컴퓨터/Win32-API
지난 실습 프로그래밍을 하던 과정 중 도형, 문자, 컨트롤 등을 Window 좌표상에 표시하기 위해서 상당 부분 불편한 점이 많았습니다.
생각한 좌표를 구하기가 힘들기 때문이었습니다.
본문에서는 간단하게 마우스 커서가 위치한 좌표를 얻어올 수 있는 프로그램을 만들어 보도록 하겠습니다.
마우스가 응용프로그램위에서 커서의 형태로 움직이고, 클릭하는 등 다양한 동작에 대해서 이벤트 메시지가 발생하게 됩니다. 본문에서는 그중 마우스가 움직이는 과정에서 생기는 이벤트와 좌표를 얻어 출력하는 프로그램을 만드려고 합니다.
자세한 내용은 아래 링크를 참조하세요.
마우스 입력(키보드 및 마우스 입력) - Win32 apps
이 섹션에서는 시스템에서 애플리케이션에 마우스 입력을 제공하는 방법과 애플리케이션이 해당 입력을 수신하고 처리하는 방법을 설명합니다.
docs.microsoft.com
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 에 포함되어있어 추가해 주어야 합니다.
#include <windowsx.h> //포지션을 구하는 함수를 사용하기 위해서 추가되어야 함.
case WM_MOUSEMOVE:
int x, y;
x = GET_X_LPARAM(lParam);
y = GET_Y_LPARAM(lParam);
break;
위처럼 WM_MOUSEMOVE 메시지 안에서 좌표값 x와 y값을 받아줍니다.
이제 얻은 좌표값을 통해서 마우스 커서 위에 값을 표시해 보도록 합시다.
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;
이렇게 해서 간단하게 마우스 커서를 통해 좌표를 얻어 보는 프로그램을 만들어 봤습니다.
Win32_API - 막대바 컨트롤(Scroll Bar) (0) | 2022.03.07 |
---|---|
Win32_API - WM_PAINT 재호출(InvalidateRect,UpdateWindow) (0) | 2022.03.02 |
Win32_API - 실습 - 색상표 만들기 (0) | 2022.03.01 |
Win32_API - Edit Control 값 사용하기 (inputbox) (0) | 2022.02.28 |
Win32_API - Edit Control (인풋박스,입력창) (0) | 2022.02.25 |
91년생 공학엔지니어의 개발일지
TODAY :
YESTER DAY :
TOTAL :
Commnet