마우스 이벤트에서 dwMousePosition 값을 이용하여 마우스의 현재 위치를 알아내어 콘솔창에 출력하는 방법을 실습했습니다. 여기서 마우스 이벤트에는 dwMousePosition만 있는 것이 아나리 dwButtonState, dwControlKeyState, dwEventFlags 값도 가지고 있는데 이 부분을 그냥 넘어가기 그래서 오늘 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;
[마우스 이벤트 레코드]
typedef struct _MOUSE_EVENT_RECORD {
COORD dwMousePosition;
DWORD dwButtonState;
DWORD dwControlKeyState;
DWORD dwEventFlags;
} MOUSE_EVENT_RECORD;
dwMousePosition는 다음과 같다고 했죠.
mousePos.X = mouseEvent.dwMousePosition.X; //X좌표
mousePos.Y = mouseEvent.dwMousePosition.Y; //Y좌표
이렇게 실습을 했었고 오늘 실습 내용으로 dwButtonState, dwControlKeyState, dwEventFlags을 살펴봅시다.
dwButtonState의 값은 다음과 같습니다.
dwButtonState변수에 들어 있는 값이 총 5개의 값이고 해당 값은 여러분이 사용하는 마우스 형태에 따라 사용할 수 있는 버턴이 제한됩니다. 제 경우는 왼쪽 버턴이 FROM_LEFT_1ST_BUTTON_PRESSED 이고 가운데 마우스 휠버턴이 FROM_LEFT_2ND_BUTTON_PRESSED 이고 오른쪽 버턴이 RIGHTMOST_BUTTON_PRESSED 이더군요. 3번과 4번은 제 마우스에서는 버턴이 없어서 사용할 수 없었네요.
이 키값을 코딩화 하여 실습 해볼까요.
switch(rc.Event.MouseEvent.dwButtonState){
case FROM_LEFT_1ST_BUTTON_PRESSED : printf("마우스 왼쪽 1번\n"); break;
case FROM_LEFT_2ND_BUTTON_PRESSED : printf("마우스 왼쪽 2번\n"); break;
case FROM_LEFT_3RD_BUTTON_PRESSED : printf("마우스 왼쪽 3번\n"); break;
case FROM_LEFT_4TH_BUTTON_PRESSED : printf("마우스 왼쪽 4번\n"); break;
case RIGHTMOST_BUTTON_PRESSED : printf("마우스 오른쪽 끝버턴\n"); break;
}
간단히 선택문인 switch문으로 해당 마우스 키값을 테스트 할 수 있습니다.
대충 이런 키값들을 가지고 있네요. 이 역시 눌렀을 때 dwControlKeyState변수의 해당 키 값을 가지게 됩니다. 마우스 순수 이벤트를 해야 하기 때문에 이부분은 복합 코딩으로 해야 함으로 생략 합니다. 선택문으로 위에서 했던 것처럼 표현이 가능하고 이 상태의 값이 case문으로 선택한 후 다른 키를 선택하는 형식으로 2중 선택문으로 표현 하면 좋을 듯 싶네요. 꼭 테스트 하고 싶다면 dwControlKeyState변수값의 선택문 안에 dwButtonState 변수값의 선택문을 넣어 표현 해 보세요.
이렇게 4가지 키값을 가지고 있습니다. 이건 실습을 해봐야겠죠.
switch(rc.Event.MouseEvent.dwEventFlags){
case DOUBLE_CLICK : printf("더블 클릭\n"); break;
case MOUSE_MOVED : printf("마우스 이동\n"); break;
case MOUSE_WHEELED : printf("수직 마우스 휠 동작\n"); break;
}
위와 같은 코딩으로 간단히 마우스 조작을 테스트 할 수 있습니다.
이제 위 내용을 실제 코딩해보고 그 결과를 테스트 해 볼 시간입니다.
[전체소스]
#include
#include
int main(int argc, char *argv[]){
INPUT_RECORD rc;
DWORD dw;
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); //핸들정보
FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), ' ', 100 , pos, &dw); //화면 지우기
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); //콘솔좌표이동
switch(rc.Event.MouseEvent.dwButtonState){
case FROM_LEFT_1ST_BUTTON_PRESSED : printf("마우스 왼쪽 1번\n"); break;
case FROM_LEFT_2ND_BUTTON_PRESSED : printf("마우스 왼쪽 2번\n"); break;
case FROM_LEFT_3RD_BUTTON_PRESSED : printf("마우스 왼쪽 3번\n"); break;
case FROM_LEFT_4TH_BUTTON_PRESSED : printf("마우스 왼쪽 4번\n"); break;
case RIGHTMOST_BUTTON_PRESSED : printf("마우스 오른쪽 끝버턴\n"); break;
}
switch(rc.Event.MouseEvent.dwEventFlags){
case DOUBLE_CLICK : printf("더블 클릭\n"); break;
case MOUSE_MOVED : printf("마우스 이동\n"); break;
case MOUSE_WHEELED : printf("수직 마우스 휠 동작\n"); break;
}
}
return 0;
}
[결과]
마우스 관련 post를 3일에 걸쳐 진행하고 있네요. 왜! 이렇게 이야기를 할까요. 3일의 post를 잘 살펴보세요. 첫날은 간단히 마우스 위치값을 출력하는 코딩만 딸랑 소개했습니다. 대개 C언어 입문자분들은 뭔가를 표현할 때 인터넷에서 필요한 내용만 달랑 퍼와서 그 소스만 인용하여 씁니다. 해당 코딩의 자세한 내용은 상관없이 필요한 부분만 사용하고 끝납니다. 첫날 post처럼요. 두번째 날 post를 보시면 뭔가 하나의 원리를 찾아서 코딩을 하면 그 원리를 자세히 어떤식으로 코딩을 하는지 그 과정을 공부하게 됩니다. 입문자의 수준을 벗어난 단계입니다. 하나의 원리를 찾고 그 원만 자세히 습득하는 것이죠. 세번째 날 오늘 post는 이제 중급단계에 들어 선 내용입니다. 하나의 원리를 찾고 그 원리를 습득하는데에만 멈추지 않고 그 원리 외 다른 내용을 추가적으로 찾아내어 그 내용까지 자신의 것으로 습득하는 단계입니다. 그 과정을 보여주면서 마우스 이벤트라는 하나의 주제를 깊게 파고 드는 시간을 갖고자 3일에 걸쳐 post를 작성했네요.