c언어 마우스의 위치를 소수점단위로 구할 수 있나요?

c언어 마우스의 위치를 소수점단위로 구할 수 있나요?

작성일 2024.03.04댓글 1건
    게시물 수정 , 삭제는 로그인 필요

이전 질문에서 누군가가 그냥 ChatGPT로 답변해버려서
다시 질문 작성합니다

가장 아래에 올라온 소스가 제가 만든 마우스 관련 소스인데
여기서 좌클릭 유지가 같은 위치에서 꾹 누르고 있을 때를 말하는 것입니다.

쓰레드와 시간관련 함수를 사용 하지 않고 만들었습니다.(stdio.h 와 windows.h만 사용)
마우스를 꾹 누르면 입력이 한번 눌렸다가 다시 입력될 때 까지의 그 텀을 이용해서 만들었죠

추가로 마우스를 이동하면 그 즉시 값이 도출되기 때문에
마우스가 다른 좌표로 이동하지 않으면 드래그가 아닌 그 키가 유지된다고 보는걸로 해결하려 했습니다

근데 아주 살짝 움직이면 좌표가 처음 누른곳과 같은곳으로 입력이 되어버려서 
드래그를 하려 해도 키다운 -> 키유지 -> 드래그 가 되어버리더군요

추가로유지하지 않아도 그냥 곧바로 살짝 움직이면 키유지가 되어버립니다

마우스를 살짝 움직여도 드래그가 되게 하고 싶은데 그러려면 마우스 좌표를 정확히 따는법이 필요한것 같아서.. 혹시 그 정확한 좌표를 따는법을 알 수 있을까요??

  1. #include<Windows.h>
  2. #include<stdio.h>
  3. INPUT_RECORD rec;//?★ INPUT_RECORD 는 입력을 기억하는 자료형이다(?)
  4. DWORD        dwNOER;//★ 참고로 DWORD는 unsigned long 을 뜻한다 0~4294967295 (0 ~ 2^32-1)
  5. void BasicSetting();//기존 main에 있던 설정들을 여기로 옮겨두었다.
  6. void gotoxy(int x, int y);//커서위치
  7. int CheckMouse(int* x, int* y);//마우스 위치
  8. void remove_scrollbar();//스크롤바 삭제 
  9. void textcolor(int colorNum);//글자색
  10. int mouse;
  11. int x_ = 0;
  12. int y_ = 0;
  13. int mouse_ = 0;
  14. //글자 색 코드
  15. #define Black 0         // textcolor(0); Black
  16. #define Dark_Blue 1     // textcolor(0); Dark Blue
  17. #define Dark_Green 2    // textcolor(0); Dark Green
  18. #define Dark_Sky_Blue 3 // textcolor(0); Dark Sky Blue
  19. #define Dark_Red 4      // textcolor(0); Dark Red
  20. #define Dark_Purple 5   // textcolor(0); Dark Purple
  21. #define Dark_Yellow 6   // textcolor(0); Dark Yellow
  22. #define Gray 7          // textcolor(0); Gray
  23. #define Dark_Gray 8     // textcolor(0); Dark Gray
  24. #define Blue 9          // textcolor(0); Blue
  25. #define Green 10        // textcolor(0); Green
  26. #define Sky_Blue 11     // textcolor(0); Sky Blue
  27. #define Red 12          // textcolor(0); Red
  28. #define Purple 13       // textcolor(0); Purple
  29. #define Yellow 14       // textcolor(0); Yellow
  30. #define White 15        // textcolor(0); White
  31. void main()
  32. {
  33.     mouse = 0;
  34.     int select = 0;
  35.     BasicSetting();//초기 세팅
  36.     int mousex = 0, mousey = 0;//마우스 좌표
  37.     while (1) {
  38.           int m = CheckMouse(&mousex, &mousey);
  39.           if (m == 1) {
  40.                 gotoxy(0, 0);
  41.                 printf("마우스 키 다운                     ");
  42.          }
  43.          else if (m == 4) {
  44.                gotoxy(0, 0);
  45.                printf("마우스 드래그                     ");
  46.         }
  47.         else if (m == 2) {
  48.               gotoxy(0, 0);
  49.               printf("마우스 움직임                     ");
  50.        }
  51.        else if (m == 3) {
  52.              gotoxy(0, 0);
  53.              printf("키보드 타이핑 (E키를 눌렀습니다)");
  54.       }
  55.       else if (m == 0) {
  56.             gotoxy(0, 0);
  57.             printf("키보드 타이핑                     ");
  58.       }
  59.       else if (m == 5) {
  60.             gotoxy(0, 0);
  61.             printf("마우스 키 업                     ");
  62.       }
  63.       else if (m == 6) {
  64.             gotoxy(0, 0);
  65.             printf("마우스 키 유지                    ");
  66.       }
  67.   }
  68. }
  69. void BasicSetting() {
  70.     textcolor(7);//Gray 색(기존 오리지널보다 살짝 밝음)
  71.     HANDLE CIN, COUT;
  72.     CIN = GetStdHandle(STD_INPUT_HANDLE);
  73.     COUT = GetStdHandle(STD_OUTPUT_HANDLE);
  74.     remove_scrollbar(); //스크롤바 삭제
  75.     //SetWindowLong(GetConsoleWindow(), GWL_STYLE, WS_CAPTION); //창스타일변경
  76.     system("mode con cols=120 lines=31");
  77.     //입력 커서 숨기기
  78.     CONSOLE_CURSOR_INFO curInfo = { 1 };
  79.     SetConsoleCursorInfo(COUT, &curInfo);
  80.     //마우스 편집 막기
  81.     DWORD prevMode;
  82.     GetConsoleMode(CIN, &prevMode);
  83.     SetConsoleMode(CIN, prevMode & ~ENABLE_QUICK_EDIT_MODE);
  84.     SetConsoleMode(COUT, ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT);// ?★ 마우스 입력모드로 변경
  85. }
  86. void gotoxy(int x, int y)
  87. {
  88.     COORD Pos;
  89.     Pos.X = x;
  90.     Pos.Y = y;
  91.     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
  92. }
  93. int CheckMouse(int* x, int* y)
  94. {
  95.     HANDLE CIN, COUT;
  96.     CIN = GetStdHandle(STD_INPUT_HANDLE);
  97.     COUT = GetStdHandle(STD_OUTPUT_HANDLE);
  98.     DWORD mode;
  99.     GetConsoleMode(CIN, &mode); // 마우스 재활성화 ?★여기서 DWORD 값을 받는다
  100.     SetConsoleMode(CIN, mode | ENABLE_MOUSE_INPUT);// 마우스 재활성화
  101.     FlushConsoleInputBuffer(CIN);
  102.     ReadConsoleInput(CIN, &rec, 1, &dwNOER); // 콘솔창 입력을 받아들임. 
  103.     FlushConsoleInputBuffer(CIN);
  104.     if (rec.EventType == MOUSE_EVENT) // 마우스 이벤트일 경우
  105.     {
  106.           int mouse_x = rec.Event.MouseEvent.dwMousePosition.X; // X값 받아옴 
  107.           int mouse_y = rec.Event.MouseEvent.dwMousePosition.Y; // Y값 받아옴 
  108.           *x = mouse_x;
  109.           *y = mouse_y;
  110.           if (rec.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED) { // 좌측 버튼이 클릭되었을 경우
  111.                 if (mouse != 1) {
  112.                       x_ = mouse_x;//현재 위치 저장
  113.                       y_ = mouse_y;//현재 위치 저장
  114.                       mouse = 1;
  115.                       return 1;
  116.                }
  117.                else {
  118.                      if (x_ == mouse_x && y_ == mouse_y && mouse_ == 0) {
  119.                            return 6;// 좌클릭 유지
  120.                     }
  121.                     else {
  122.                           mouse_ = 1;
  123.                           return 4;// 드래그
  124.                    }
  125.             }
  126.       }
  127.       else {
  128.             if (mouse != 2) {
  129.                   mouse = 2;
  130.                   mouse_ = 0;
  131.                   return 5;// 좌클릭 업
  132.            }
  133.            return 2;// 마우스 움직임
  134.       }
  135.   }
  136.   else if (rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown) {
  137.         if (rec.Event.KeyEvent.wVirtualKeyCode == 'e' || rec.Event.KeyEvent.wVirtualKeyCode == 'E') {
  138.               return 3;
  139.        }
  140.        return 0;//키보드 입력일 시
  141.   }
  142.   return 0;
  143. }
  144. void remove_scrollbar()
  145. {
  146.     HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  147.     CONSOLE_SCREEN_BUFFER_INFO info;
  148.     GetConsoleScreenBufferInfo(handle, &info);
  149.     COORD new_size =
  150.     {
  151.           info.srWindow.Right - info.srWindow.Left + 1,
  152.           info.srWindow.Bottom - info.srWindow.Top + 1
  153.    };
  154.    SetConsoleScreenBufferSize(handle, new_size);
  155. }
  156. void textcolor(int colorNum) {
  157.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colorNum);//색을 바꾼다
  158. }



profile_image 익명 작성일 -

안녕하세요~ 게임의 모든 것에 게모입니다~!!!

주신 질문을 토대로 제가 아는 선에서 답변을 드리도록 하겠습니다~!!!

C를 사용하여 Windows에서 마우스 위치를 정확하게 추적하려면 다음을 사용할 수 가 있는데요GetCursorPos Windows API에서 기능하는데, 코드를 수정할 수 있는 방법을 알려드리겠습니다~!!

#include <Windows.h>

#include <stdio.h>

void GetMousePosition(int* x, int* y);

void main()

{

int mousex = 0, mousey = 0;

while (1) {

GetMousePosition(&mousex, &mousey);

gotoxy(0, 0);

printf("Mouse Position: (%d, %d) ", mousex, mousey);

// Your other logic here

}

}

void GetMousePosition(int* x, int* y)

{

POINT cursorPos;

GetCursorPos(&cursorPos);

*x = cursorPos.x;

*y = cursorPos.y;

}

// Other functions remain unchanged...

이 수정된 코드에서

  • GetMousePosition 함수는 다음을 사용하며, GetCursorPos 현재 커서 위치를 검색하는 기능입니다~!

  • mousex 그리고. mousey 변수는 현재 마우스 좌표를 저장하고 논리에 사용할 수 있고, 이렇게 하면 콘솔 입력 이벤트에 의존하지 않고 마우스 위치를 정확하게 추적할 수 있습니다~!!!

1:1 게임 입시 / 취업 / 진로 상담 무료 진행

↓↓↓↓↓↓

https://open.kakao.com/o/sT9GJd8f

단순한 C언어문제입니다 단위변환...

... int = double/double 로 해서 일부러 소수점 이하 버리고 int형의 몫을... 아님 정확하게 warning안뜨게 어떻게 구할 수 있나요? #include <stdio.h> int main(void)...

c언어 프로그래밍 문제 몇가지

... -평균을 구할소수점 3자리까지 제한하는건 대충... // b값을 복사하고 난후 공백 삽입 } else{ c[i]=a[a_index]; // c에 a값을 복사 a_index++; // a에 복사한 위치값...

게임 그래픽 제작(2D,3D)

... 움직일수 있나요? 애니메이션처럼 한장한장 그려서... 내가 마우스를 눌렀을때하고 점프키를 눌렀을때등... 혹은 C++언어입니다 그럼 이 언어가 뭔지 먼저 알아야겠죠 먼저...

베트남조사

... 학교 수행평가예요 문화,위치,전통 옷, 집, 기후 등... 화폐단위 : 동(Dong) 언어 : 베트남어 종교 : 불교... 이 외에도 베트남은 55종에 달하는 이른바 소수민족의 언어가...

한글2002에도있나요?

... 끝부분에 마우스를 가져가면 " ┼ " 모양이 생기고 그걸 밑으로 쭉 끄집어 내리면,, A B C 1 10 11 -1 2 20 22 -2 3 30... 커서 위치에 계산하고자 하는 셀 이름인 “B2”를 먼저...

어느 민족이며 누구인지 알수 있나요..?

바벨탑을 건설한 민족이 어느 민족 누구이지 나와 있나요?... 단위로 흩으셨음을 추측할 있다. 3. 성경속의 언어... 가질 있다는 것이 증명되는 것이다. 5. 발음의 위치에...

소비에 소수는 개발에 치중할 ...

... 우리는 지금까지 에디터 명령어를 Lisp 언어로 작성할 ... 것이며, 소수의 호흡이 잘 맞는 집단이 적당할 것이다.)... '' ``무료로 구할 수 있는 프로그램을 광고하는 것은...