지난 시간 마우스 위치 값을 실시간으로 출력하는 실습을 간단히 했었습니다. 실습한 내용 중 설명이 좀 빠진 부분이 있어서 오늘 추가 post를 만들었습니다. 그러면 빠진 내용을 살펴 봅시다.
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;
지난시간에 말했던 것처럼 기본 콘솔창에서의 입력 정보를 다음과 같은 이벤트 정보를 읽어오게 됩니다. 실습은 바로 MOUSE_EVENT_RECORD 입니다. 이 MOUSE_EVENT_RECORD은 또 들어가 보면 다음과 같은 정보로 구성되어 있습니다.
typedef struct _MOUSE_EVENT_RECORD {
COORD dwMousePosition;
DWORD dwButtonState;
DWORD dwControlKeyState;
DWORD dwEventFlags;
} MOUSE_EVENT_RECORD;
총 4개의 정보를 가지고 있습니다. 지난 시간의 마우스 위치값을 얻기 위해서 dwMousePosition변수에 저장된 정보를 사용하였죠. 보시면 COORD라는 형태가 있는 이건 또 다음과 같은 정보를 가지고 있습니다.
typedef struct _COORD {
SHORT X;
SHORT Y;
} COORD, *PCOORD;
short 형으로 x, y라는 변수로 선언된 구조체이죠.
dwMousePosition.x
dwMousePosition.y
이렇게 두개의 x,y라는 변수를 사용하고 외부에의 마우스 위치 x,y값이 dwMousePosition변수에 저장되는 원리인 것이죠. 지난시간에 보면 읽어오는 것은 COORD를 사용했는데 출력 하는 것은 int형의 배열을 사용했습니다. 그 이유는 코딩을 표현 할 때 동일한 자료형의 여러개의 값을 사용할 때 배열을 사용하기도 하고 아니면 COORD와 같은 구조체 형태를 이용하기도 한다는 점을 두개의 형태로 표현할 수 있다는 점을 보이기 위해 입력은 COORD, 출력 int형으로 표현 했었네요. 코딩 표현 여러분들의 몫입니다. 결과는 둘 다 동일한 결과를 얻습니다.
INPUT_RECORD rc;
DWORD dw;
int mouse_XY[2];
COORD pos={0,0};
SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT);
mousePos.X = rc.Event.MouseEvent.dwMousePosition.X; //X좌표
mousePos.Y = rc.Event.MouseEvent.dwMousePosition.Y; //Y좌표
이 표현을 다음과 같이 해도 됩니다.
COORD mousePos; //int mouse_XY[2];
mousePos.X = rc.Event.MouseEvent.dwMousePosition.X; //X좌표
mousePos.Y = rc.Event.MouseEvent.dwMousePosition.Y; //Y좌표
이렇게 말이죠.
INPUT_RECORD rc;
MOUSE_EVENT_RECORD mouseEvent;
...
mouseEvent=rc.Event.MouseEvent;
...
mousePos.X = mouseEvent.dwMousePosition.X; //X좌표
mousePos.Y = mouseEvent.dwMousePosition.Y; //Y좌표
중간 코딩은 다 생략하고 핵심 코딩만 보면 위 코딩과 같습니다. 따로 mouseEvent 변수로 선언하여 마우스 정보만 저장할 수 있습니다. 이렇게 간단히 코딩을 x,y 접근을 줄일 수 있죠. 그냥 한주로 쭉 표현하기도 하지만 이렇게 나눠서 표현하기도 합니다. 나누어 표현하는 경우는 대개 다음과 같은 표현에서 자주 활용 됩니다.
int main(){
MouseEventProc(rc.Event.MouseEvent);
}
void MouseEventProc(MOUSE_EVENT_RECORD mouseEvent){
mousePos.X = mouseEvent.dwMousePosition.X; //X좌표
mousePos.Y = mouseEvent.dwMousePosition.Y; //Y좌표
}
이렇게 말이죠. 코딩은 상황에 맞게 표현하시면 됩니다.
오늘은 어제 설명했어야 했던 부분들을 그냥 넘어가기 애매해서 추가 post를 작성했네요.