×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 1,499,763명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)

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

 

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

 

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

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

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

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

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

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

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

 

 

  1. 천재일까 2016.04.13 13:10

    이 함수가 system("mode con : lines= cols= "); 로 콘솔창 크기 조절했을때는 먹히지가 않네요..
    해결방법이 없으려나...

    • 가누 2016.04.13 17:36 신고

      system함수로 창 크기 조절하는데는 아무 문제가 없었습니다.

      하지만 마우스 이벤트를 하니 화면이 아래로 내려가는 현상이있었습니다. 아마 이것에 대해서 질문하신것같으신데

      http://www.crocus.co.kr/7
      를 참조하시고 범위를 지정하셔서 사용하시면 쉽게 해결되실 것 같습니다.

  2. 천재일까 2016.04.13 21:21

    제가 콘솔창크기변경 하고나서 정상작동하지 않길래
    디버깅해봤더니 (get_input(&key,&pos) 에서 마우스이벤트를 반환을 안해요.
    저만 이런건가요?

    • 가누 2016.04.13 22:07 신고

      코드를 메일로 보내줄수 있나요?
      보내줄 수 있으시다면 메일주소 남겨드리겠습니다.

  3. 천재일까 2016.04.15 22:05

    네 보내드리겠습니다.

  4. 천재일까 2016.04.24 04:54

    이거 마우스 떼는것도 인식할수 있나요?
    마우스 클릭한것이 버퍼에 계속 남아있어서 다음 이벤트에 영향을 주는 문제가 발생한것같거든요..
    버퍼삭제하는것이라도...

    • 가누 2016.04.24 13:00 신고

      클릭하면 누르고 떼지는 이벤트인데 어떤방식에 이용하려고그러시나요?

  5. Leenima 2018.03.19 11:32

    하나만 여쭤볼게 있는데....는 아래 천재일까님이 먼저 질문했네요
    여기서 공부해갑니다(해석하려 들지 말라 하셨지만 역시 전 해석하는 게 좋더라고요)

  6. Leenima 2018.03.19 11:41

    천재일까님이 질문한 부분에 대해서 조금 해석해보자면
    system();을 사용한 후에 마우스를 활성화 시키면 아무런 상관이 없지만
    마우스를 활성화 시킨 이후에 system();을 사용하면
    마우스 이벤트를 반환하지 않는다는것을 질문한거에요
    저도 이것에 대해 질문하려 했습니다

    • 가누 2018.03.21 14:16 신고

      음 저도 예전에 그 현상을 겪은것같은데 그 부분에 대해서는 저도 잘 모르겠네요.

  7. ㅇㅇ 2018.05.23 07:26

    음....클릭해도 *가 뜨질않네요..
    그대로해보니 [Error] '::main' must return 'int' 에러가떠서 int main으로 바꾸고 해주었는데 이게 문제가 되는걸까요?

    • 가누 2018.05.23 11:31 신고

      윈10 부터는 콘솔이 바뀌어서 적용이 안되네요 저도

  8. 의미불명 2019.06.06 15:38

    코드 공유는 감사합니다. 저도 모르는 부분이 있었네요.
    하지만 설명이 너무 없어서 너무 마음에 안 드는게 한 두가지가 아닙니다.

    물론 콘솔 관련 함수는 쓸데없이 복잡하고 긴 내용이 많아서 굳이 다 설명할 필요는 없습니다.
    하지만 복잡하더라도 대충 응용하는 방법을 설명하긴 해야됩니다.
    아니면 주석도 많이 넣고 가독성 좋게 코드를 쓰면 상관이 없습니다. 그러면 어떻게 쓰는 지 이해가 가능하거든요.

    근데 이건 쓰라고 만든 강좌인지 모르겠네요.
    가독성이 좋다면 모를까, 그것도 아닌데 설명은 아예 없고 초보자들 입장에서 어떻게 쓰라는 건지 하나도 모르겠습니다.
    그것보다 필자 신념이 굉장히 잘못되었습니다.
    저건 해석이 불가능한 코드도 아닙니다. 의미만 알면 말이죠
    근데 설명하기 귀찮다고 아예 해석도 하지 말고 응용하라는건 무슨 어불성설이죠?


    그건 프로그래머가 가져야 될 생각은 절대로 아니라고 생각합니다.

    더욱이 C언어는 객체지향 언어가 아니라 독립적으로 응용할 수 있는 언어가 아닙니다.
    그런데 그걸 완전히 간과하셨네요.
    그러니까 댓글 단 사람들도 어떻게 할 지 몰라서 질문 많이 하죠..

    • 가누 2019.06.06 17:32 신고

      제가 코딩을 처음할 때 관심을 가지며 만든 코드라서 그때 코딩에 대한 지식이 많이 부족하여 저렇게 했던것같네요

      하지만 제가 저때만해도 생각했던건

      제가 코드의 의미를 일부러 안남긴 것이 아닌 저도 아에 모르는상태로 그냥 이리저리 시도해보다가 되는 방법들을 알아내기 시작했고 그래서 저때만 해도 제 신념이 다 몰라도된다, 응용할줄만 알면된다였습니다.

      물론 저코드가 지금 초보자 입장에서 어떻게 쓰라는건지 하나도모를 수 있고 지금의 저도 저 코드는 어떤의미인지 정확히 와닿지는 않습니다.

      하지만 저 코드를 그대로 복붙해서 이리저리 만지다보면 어떻게 동작시키는지 가늠이 될 것일수있습니다.

      제가 저때는 잘못 작성한 건 맞지만 지금 이걸 동작시키는 방법을 모른다거나 응용하는 방법을 설명해야한다는 듯한 글을 제게 남겨주신건 덜 응용해보셔서 그렇게 말씀하시는거고 코드를 더 뜯어보시는게 좋을 듯 합니다.

      제가 대학교 2학년때(코딩을 처음 하던 날) 저 코드를 접했고(코딩 1년차죠) 그때
      https://www.crocus.co.kr/31
      https://www.crocus.co.kr/7
      그림판을 만들어 이를 통해

      https://www.crocus.co.kr/32
      다양한 게임에도 적용시켜내봤습니다.

      저는 뭘 알았기에 이렇게까지 다해볼 수 있었을까요?

      댓글은 감사히 받고 다음 코딩에서도 잘 반영하겠으나 제가 이런 생각을 가지고 코딩했다는것도 알아주시면 감사하겠습니다.