반응형

이번 프로그래밍을 하기 전 필자의 생각을 적어보겠다.

 

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->-= csbi.srWindow.Left;
            pos->-= 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)을 쓴 이유는, 마우스 한번 클릭하고 끝낼것이 아니기에 반복문을 넣어둔 것이다.

 

***************************************************

절대 이 소스코드를 해석할려 들지마라.

그냥 '이렇게 쓰는구나'라고 생각만 하고,

이 소스코드를 응용할 방법을 생각하라.

소스코드를 해석하지 못해도 응용은 충분히 할 수 있다.

필자도 해석은 하지 않았다.

***************************************************

 

 

반응형