함께 만드는 별빛 세상, 천문노트 · Since 2001

[자작세상] Win32API에서 조이스틱제어 성공~!

정재원 2009-07-23 (목) 19:19 9390
목록
이전글 다음글

웹 아카이브(2020-05-25 기록)에서 복원한 글입니다. 일부 이미지나 첨부파일이 빠져 있을 수 있습니다.

 

 

 

win32API에서 조이스틱값을 입력 받아 보았다

 

 

소스에서 아래와 같이  mmsystem헤더와 더불어 winmm.lib를 link에 연결해줘야 한다.

 

  #include <mmsystem.h> 

  #pragma comment(lib, "winmm.lib")

 

 

 

 BOOL JoyInit(HWND hwnd)
 {
         JOYINFOEX  joyinfo;
         UINT       nValid = 0;

         // 시스템에 어떤 조이스틱이 달렸는지 체크한다.
         // 없으면 0을 주므로 FALSE리턴

         if( joyGetNumDevs() == 0 )
                 return FALSE;

         memset( &joyinfo,0,sizeof( JOYINFOEX));
         joyinfo.dwSize = sizeof( JOYINFOEX );
         joyinfo.dwFlags = JOY_RETURNBUTTONS | JOY_RETURNX | JOY_RETURNY;

         // 1번 조이스틱이 연결되었나 알아본다.
         if( joyGetPosEx( JOYSTICKID1 , & joyinfo ) != JOYERR_UNPLUGGED )
                 nValid = JOYSTICKID1; // 설정되었다면 1번 조이스틱이라고 명시
         // 2번 조이스틱이 연결되었나 알아본다.
         else if( joyGetPosEx( JOYSTICKID2 , & joyinfo ) != JOYERR_UNPLUGGED )
                 nValid = JOYSTICKID2;
         else
                 return FALSE;  // 이도 저도 아니면 에러

         // 해당된 조이스틱 ID와 조이스틱이 움직일 거리를 설정
         // 움직일 거리값이 작을수록 미세한 움직임에도 반응한다.
         // 적당한 값을 넣어주면 됨 너무 커도 잘 안움직임. ^^; 푸하하하하~

         joySetThreshold( nValid,100);
         // 조이스틱의 메시지를 보낼 윈도우 핸들 설정
         joySetCapture( hwnd, nValid,100,TRUE );  

         return TRUE;
 }

 

/* 위의 함수는 조이스틱이  시스템에서 감지되면  TRUE를 리턴하고, 감지되지  않으면 FALSE를 리턴한다.

여기에 나와 있는 함수들이나 메시지들은 일반적인 윈도우즈 C의 Help에 자세히 나와 있으므로 더 이상 언급하지 않겠다. 

이제 조이스틱의 마지막으로 얘기할 것은 조이스틱이 시스템으로 보내주는 메시지들이다.

위에서의 키보드와 같이 조이스틱도 어떠한 키나 방향핸들을 움직이면 해당된  윈도우 핸들에 메시지를 보내주는데,

바로 아래와 같은 메시지들을 보내준다. */

 

아래는 조이스틱 제어시 발생하는 메시지들이다.

MM_JOYnBUTTONDOWN       //설정된 조이스틱의 n번째 버튼을 눌렀을때
MM_JOYnBUTTONUP         //설정된 조이스틱의 n번째 버튼을 때었을때
MM_JOYnMOVE             //설정된 n번째 조이스틱이 움직였을 때

 

소스에서 사용할때
CALLBACK WndProc 함수 안에 JoyInit(HWND hwnd)함수를 넣어준다

그리고

메시지처리는 아래와 같이 하면 된다.

 

 

 case MM_JOY1BUTTONDOWN : //1번 버튼 눌렀을때의 처리..
         break;
 case MM_JOY2BUTTONUP : //2번 버튼이 때어졌을때의 처리..
         break;
 case MM_JOY1MOVE : 
   //LONG형 lParam에 하위 WORD엔 X좌표 값이, 상위 WORD엔  Y 좌표값이 들어간다.
         x = LOWORD(lParam) ;

         y = HIWORD(lParam); 
   //1번 스틱이 움직였을때의 처리
         break;

 

 

 

 

 

 

 

http://blog.naver.com/6k5tvb

댓글 0

로그인하면 댓글을 쓸 수 있습니다.

자작 게시판

총 111건
글쓰기