2013-10-23 12 views
0

화살표 키를 사용하여 와이드 문자로 변환 할 수 있는지 판단하려고합니다. conio.h를 getch() 함수로 사용하고 있는데, 비슷한 함수와 비교하여 작동하는 방식이 마음에 들었으며 두 번 호출하여 화살표 키를 검색해야합니다.와이드 문자로 된 화살표 키

화살표 키 때 첫 번째 문자로 누르면 반환 0xE0 (-32), 다음 {왼쪽 = 'K', 업 = 'H', 오른쪽 = 'M', 아래 = 'P'}

그래서 나는 두 문자를 하나로 병합하는 방법을 찾으려고 노력해 왔습니다. 이것은 내가 생각해 낸 가장 가까운 것입니다. 기능 키는 작동하지 않지만 항상 눌러 진 기능 키와 상관없이 동일한 값을 반환합니다. {F1-12 = 0, Arrows = 224} 저는 신뢰할 수있는 창 계산기를 꺼 냈고 224가 이진수로 -32와 동일하다는 것을 알 수있었습니다. 난 그냥 바이트 내려 놓고 10 진수 시스템을 사용하고 100 + 124 가서 = - 32했다.

누군가가 왜 변환이 배열의 첫 번째 문자만을 고려하고 있는지 파악할 수 있습니다. 나는 틀린 일을 분명히했다. 충분한 이야기, 죄송합니다. 너무 길어서 그런 경우라면 지금 여기에 코드가 있습니다.

#include <iostream> 
#include <stdio.h> 
#include <windows.h> 
#include <wincon.h> 
#include <conio.h> 
#include <cwchar> 

/**int main() 
{ 
    int N; 
    char C; 
    wchar_t R; 

    while(true) 
    { 
     while(!kbhit()){} 
     //C = getch(); 

     //if((R == 0) || (R == 224)) 

     std::cout << R << std::endl; 
     N = R; 
     std::cout << R << " = " << N << std::endl; 
    } 
}*/ 



int main() 
{ 
    int N = 0; 
    char C[2]; 
    wchar_t R; 
    mbstate_t mbst; 

    while(true) 
    { 
     mbrlen(NULL,0,&mbst); 
     memset(&mbst,0,sizeof(mbst)); 

     for(int i = 0; i < 2; ++i) 
     { 
      while(!kbhit()){} 
      C[i] = getch(); 
      N = C[i]; 
      switch(N) 
      { 
       case 0: 
        break; 
       case -32: 
        break; 
       default: 
        //input needs to be converted 
        mbrtowc(&R,C,2,&mbst); 
        N = R; 
        std::cout << R << " = " << N << std::endl; 
        i = 3; 
        break; 
      } 
     } 
    } 
} 

편집 :

나는 노동 조합을 사용하여 2 바이트를 결합 할 수있는 방법을 발견했다. 나는 이것을 게시했을 때 노동 조합이 무엇인지 몰랐다. 공용체를 사용하면 두 개의 서로 다른 데이터 유형에 동일한 메모리 공간을 사용할 수 있습니다. 작동 방식은 다음과 같습니다. - http://www.cplusplus.com/doc/tutorial/other_data_types/

답변

0

나는 내 자신의 문제를 해결할 수 있었지만 시도했던 방식대로 진행되지 않았습니다. 누군가 내가 뭘 잘못하고 있었는지 알아 내고자한다면 위대 할 것입니다.

그러나 각각의 키를 고유 한 2 바이트 변수로 읽을 때까지는 해결할 수있었습니다. 비트 이동에 대한 질문을 발견하고 그것을 사용하여 두 개의 문자를 결합했습니다. 그런 다음 숫자가 제대로 결합되지 않았다는 것을 알아 냈습니다. 서명되지 않은 문자 대신 서명 된 문자를 사용했기 때문입니다. 나는 부호없는 문자를 사용하고 싶지 않았기 때문에, 유니온을 사용하는 새로운 솔루션을 발견했습니다.

이것은 내 연합 솔루션입니다. 그것은 매우 간단합니다.

#include <iostream> 
#include <conio.h> //getch() & kbhit() 
#include "rndgen.h" 
#define FN_ESCAPE 27 
#define FN_UP_ARROW 18656 
#define FN_DOWN_ARROW 20704 
#define FN_LEFT_ARROW 19424 
#define FN_RIGHT_ARROW 19936 
                    //This union allows for two 8-bit values to be read as one 16-bit value 
union wide_char 
{ 
    short wide_C; 
    char C[2]; 
}; 
                    //Function waits for a key to be pressed 
inline short key_wait() 
{ 
    wchar_t R; 
    wide_char user_input; 
    user_input.wide_C = 0; 
                //Loop twice, or until code causes the loop to exit 
                 //Two times are neccessary for function keys unfortunately 
    for(int i = 0; i < 2; ++i) 
    { 
               //While there isn't a key pressed, loop doing nothing 
     while(!kbhit()){} 
               //Grab the next key from the buffer 
                //Since the loop is done, there must be at least one 
     user_input.C[i] = getch(); 
     switch(user_input.C[i]) 
     { 
      case 0: 
      case -32: 
               //The key pressed is a Function key because it matches one of these two cases 
                //This means getch() must be called twice 
                //Break switch, run the for loop again ++i 
       break; 
      default: 
       R = user_input.wide_C; 
       return R; 
       break; 
     } 
    } 
    return -1; 
} 

는 wide_C는 C [2]이 순서는 F1-12 고유 판독 될 수 있다는 것을 의미하기 때문에 {C [1], C [0]}이 큰 것이다 (제 숯 반환 비트를 반환 F1-12의 경우 0입니다.) 아마도 wchar_t로 바꿔 줄 수는 있지만, 왜 깨지지 않은 것을 고쳐야하는지 알게되었습니다. 다른 프로그램을위한 새로운 솔루션으로 코드를 다시 구현하기로 결정할 때 그렇게 할 수 있습니다.

이것은 또한 a-Z & 0-9를 모두 일반 char 값으로 읽을 수 있음을 의미합니다.