반응형
이번 프로그래밍을 하기 전 필자의 생각을 적어보겠다.
1. Console에서 항상 키보드만 입력받고 마우스는 입력받을수 없는것인가?
2. 마우스 입력에 관하여 검색을 해보자.
3. 그렇다면 fprintf를 통하여 그래픽을 제작할 수 있겠구나?
4. 일단 그래픽 구현에 도움이 되도록 그림판 프로그램을 만들어보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | #include <stdio.h> #include <Windows.h> HANDLE COUT = 0; // 콘솔 출력 장치 HANDLE CIN = 0; // 콘솔 입력 장치 int be_input() { INPUT_RECORD input_record; DWORD input_count; PeekConsoleInput(CIN, &input_record, 1, &input_count); return input_count; } int get_input(WORD *vkey, COORD *pos) { INPUT_RECORD input_record; DWORD input_count; ReadConsoleInput(CIN, &input_record, 1, &input_count); switch(input_record.EventType) { case MOUSE_EVENT: if(pos && (input_record.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED)) { CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo(COUT,&csbi); *pos = input_record.Event.MouseEvent.dwMousePosition; pos->X -= csbi.srWindow.Left; pos->Y -= csbi.srWindow.Top; return MOUSE_EVENT; } break; } // FlushConsoleInputBuffer(CIN); return 0; } void gotoxy(int x, int y) // 좌표 보내기 gotoxy { COORD Cur; Cur.X=x; Cur.Y=y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Cur); } void main() { DWORD mode; WORD key; COORD pos; int event; // 마우스 이벤트에 이용 int x; // 마우스의 x좌표 저장소 int y; // 마우스의 y좌표 저장소 CIN = GetStdHandle(STD_INPUT_HANDLE); COUT = GetStdHandle(STD_OUTPUT_HANDLE); // 마우스 활성화 GetConsoleMode(CIN,&mode); SetConsoleMode(CIN, mode | ENABLE_MOUSE_INPUT); while(1) { if(be_input()) { if(get_input(&key,&pos) != 0 ) { MOUSE_EVENT; x = pos.X; // 마우스클릭값이 x,y변수에 저장되도록함 y = pos.Y; gotoxy(x,y); printf("*"); } } } } | Crocus |
이 소스코드는 콘솔에서 마우스클릭시 아래 그림과 같이 *을 출력해 주는 코드이다.
필자는 아직 C만 배운 상태이기에 DWORD나 COORD따위를 잘 모른다.
하지만 프로그래밍에 있어서 자신이 모른다고 자신의 프로그램에 못 쓰는것은 아니다.
여러번의 디버깅을 해보면서 그 의미를 정확하게는 파악 할 순 없어도 어떻게 쓰이는지는 이해할 수 있을 것이다.
gotoxy(x,y) 함수는 그 좌표점으로 커서를 옮겨줄 때 이용한다. 흔한 함수이기에 설명은 여기까지만 하겠다.
여기서 while(1)을 쓴 이유는, 마우스 한번 클릭하고 끝낼것이 아니기에 반복문을 넣어둔 것이다.
***************************************************
절대 이 소스코드를 해석할려 들지마라.
그냥 '이렇게 쓰는구나'라고 생각만 하고,
이 소스코드를 응용할 방법을 생각하라.
소스코드를 해석하지 못해도 응용은 충분히 할 수 있다.
필자도 해석은 하지 않았다.
***************************************************
반응형
'Basic > C++' 카테고리의 다른 글
bgm 및 효과음 동시구현 (26) | 2014.01.15 |
---|---|
Console 2차원 그래픽 구현 - 4. 그래픽 구현 및 응용 (0) | 2014.01.14 |
Console 2차원 그래픽 구현 - 3. Console 그림판 소스코드 (2) | 2014.01.14 |
Console 2차원 그래픽 구현 - 2. 마우스함수 응용 (0) | 2014.01.14 |
system함수를 응용한 시스템 종료 (0) | 2014.01.14 |