[C언어-기초실습-14] 마우스의 현재 위치를 구하시오

in #kr-dev7 years ago (edited)

[C언어-기초실습-14] 마우스의 현재 위치를 구하시오



오늘 실험 내용은 콘솔창에서 마우스위 위치 정보를 구하는 문제입니다. ReadConsoleInput()함수를 통해 콘솔창에 정보를 읽어오는데 여기서 읽어 온 정보 중 마우스 이벤트 정보를 이용하여 현재 마우스의 위치를 알아보도록 하겠습니다.

1. 문제의 이해



마우스 이벤트를 사용하기 위해서는 위 참조 사이트에 가시면 INPUT_RECORD에 대해 알아야 합니다.

typedef struct _INPUT_RECORD {
  WORD  EventType;
  union {
    KEY_EVENT_RECORD          KeyEvent;
    MOUSE_EVENT_RECORD        MouseEvent;
    WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
    MENU_EVENT_RECORD         MenuEvent;
    FOCUS_EVENT_RECORD        FocusEvent;
  } Event;
} INPUT_RECORD;

typedef struct _MOUSE_EVENT_RECORD {
  COORD dwMousePosition;
  DWORD dwButtonState;
  DWORD dwControlKeyState;
  DWORD dwEventFlags;
} MOUSE_EVENT_RECORD;

보시면 다양한 이벤트 정보를 관리하는데 여기서 실습에 필요 한 정보는 마우스 이벤트 정보이겠죠. 자세한 내용은 위 참조 사이트에 가셔서 한번 읽어보시기 바랍니다.

콘솔창에서 정보를 읽기


INPUT_RECORD rc;
DWORD        dw;
ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &rc, 1, &dw);

ReadConsoleInput(입력버퍼핸들,읽어올정보,사이즈,읽을레코드수)로 구성되어 있습니다. INPUT_RECORD 인 rc 객체 변수에 입력핸들정보가 저장됩니다.

이 rc객체 변수안에 들어 있는 마우스정보를 통해 마우스 이벤트를 실행하면 됩니다.

마우스 위치값 얻기


X  = rc.Event.MouseEvent.dwMousePosition.X
Y = rc.Event.MouseEvent.dwMousePosition.Y

INPUT_RECORD인 rc안에 위 코딩으로 마우스의 위치 정보를 좌표(X,Y)정보를 얻게 됩니다.

이 정보를 화면에 특정 위치에 출력하기


COORD pos={0,0}; //0,0의 위치
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
printf("%d, %d\n", mouse_XY[0], mouse_XY[1]);   

SetConsoleCursorPosition() 함수는 콘솔창에 커서의 위치를 이동시키는 함수입니다. 여기서 콘솔창으로 반대로 출력이니깐 GetStdHandle(STD_OUTPUT_HANDLE)함수에서 출력핸들를 사용 하겠죠. pos인자는 해당 콘솔창의 고정 좌표로 커서가 위치하게 됩니다. 이렇게 하면 커서가 특정 위치로 이동하고 그 위치를 기준으로 printf()함수 안에 정보가 출력되게 됩니다.

코딩


간단히 마우스 위치 정보만 추출하여 콘솔창에 출력하는 실습을 해보죠.

[전체소스]

#include<Windows.h>
#include<stdio.h>
 
int main(int argc, char *argv[]){
    INPUT_RECORD rc;
    DWORD        dw;
    int mouse_XY[2];
    COORD pos={0,0};
    
    SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT);
    while(1){
        
        ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &rc, 1, &dw); //핸들정보 
        mouse_XY[0] = rc.Event.MouseEvent.dwMousePosition.X; //X좌표 
        mouse_XY[1] = rc.Event.MouseEvent.dwMousePosition.Y; //Y좌표 

        FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), ' ', 100 , pos, &dw); //화면 지우기         
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); //콘솔좌표이동 
        printf("%d, %d\n", mouse_XY[0], mouse_XY[1]);       
        
    }
    return 0;
}

무한 루프로 while(1)문을 사용했기 때문에 정상적인 종료를 이루어 지지 않습니다. 그냥 콘솔창의 우측 상단에 강제 종료 버턴을 눌러서 제거해야 합니다.
[결과]

a1.jpg

마무리


마우스 이벤트에 대해 저 자세히 배우거나 또는 키보드 이벤트와 같은 다른 이벤트에 대해서 알고자 한다면 위에 참조 링크된 사이트에 가시면 레퍼런스 문서를 한번 읽어보시기 바랍니다. 그리고 글 중간에 예제가 링크 되어 있어서 예제에 가셔서 소스를 분석하시면 어느정도 다양한 이벤트 실습을 할 수 있을 거에요.


Sponsored ( Powered by dclick )

dclick-imagead

Coin Marketplace

STEEM 0.04
TRX 0.33
JST 0.083
BTC 63747.40
ETH 1717.89
USDT 1.00
SBD 0.42