2012-07-13 5 views
1

저는 C++로 자체 텍스트 편집기를 구현하고 있습니다. 그럴거야 ... 좋아. ; P스캔 코드를 ASCII로 변환

키 코드 (특히 Allegro, 스캔 코드라고 부름)를 ASCII-char로 변환하는 방법이 필요합니다. 나는 A-Z를 쉽게 할 수 있고, A-Z로 변환하는 것은 쉽다. 현재 내가하는 일은 Allegro에서 scancode (al_keycode_to_name)에서 이름을 반환하는 함수를 사용하는 것입니다. 즉, 눌려진 키가 A-Z이면 "A"를 "Z"로 반환합니다. 그건 쉬운 말이지 만 ",", ";"와 같은 특수 문자를 읽을 수는 없습니다. 그게 내가 힘든 시간을 보내고있는 곳이야.

자동으로이 작업을 수행 할 수있는 방법이 있습니까? 아마도 이것을하는 도서관일까요? 실제 트릭은 다른 레이아웃을 고려하고 있습니다.

다음은 내가 지금까지 가지고있는 것입니다.

void AllegroInput::TextInput(const InputState &inputState, int &currentCharacter, int &currentRow, std::string &textString) 
    { 
     static int keyTimer = 0; 
     static const int KEY_TIMER_LIMIT = 15; 
     for (int i = 0; i < 255; i++) 
     { 
      if (inputState.key[i].keyDown) 
      { 
       keyTimer++; 
      } 
      if (inputState.key[i].keyPress) 
      { 
       keyTimer = 0; 
      } 

      if ((inputState.key[i].keyPress) || ((inputState.key[i].keyDown) && (keyTimer >= KEY_TIMER_LIMIT))) 
      { 
       std::string ASCII = al_keycode_to_name(i); 

       if ((ASCII.c_str()[0] >= 32) && (ASCII.c_str()[0] <= 126) && (ASCII.length() == 1)) 
       { 
        textString = textString.substr(0, currentCharacter) + ASCII + textString.substr(currentCharacter, textString.length()); 
        currentCharacter++; 
       } 
       else 
       { 
        switch(i) 
        { 
         case ALLEGRO_KEY_DELETE: 
          if (currentCharacter >= 0) 
          { 
           textString.erase(currentCharacter, 1); 
          } 
          break; 

         case ALLEGRO_KEY_BACKSPACE: 
          if (currentCharacter > 0) 
          { 
           currentCharacter--; 
           textString.erase(currentCharacter, 1); 
          } 
          break; 

         case ALLEGRO_KEY_RIGHT: 
          if (currentCharacter < textString.length()) 
          { 
           currentCharacter++; 
          } 
          break; 

         case ALLEGRO_KEY_LEFT: 
          if (currentCharacter > 0) 
          { 
           currentCharacter--; 
          } 
          break; 
         case ALLEGRO_KEY_SPACE: 
          if (currentCharacter > 0) 
          { 

           textString = textString.substr(0, currentCharacter) + " " + textString.substr(currentCharacter, textString.length()); 
           currentCharacter++; 
          } 
          break; 


        } 
       } 
      } 
     } 
    } 
+0

내가 할 수 있다는 것을 깨닫지 못했습니다, 감사합니다! –

답변

1

당신은 event.keyboard.unichar 값으로 ALLEGRO_EVENT_KEY_CHAR 이벤트를 사용한다 텍스트 입력을 읽을 수 : 클래스 InputState는 기본적으로 추가 기능 (예를 keyDown, keyUp 등, 키 누름)와 알레그로 inputstate의 사본입니다. ALLEGRO_EVENT_KEY_DOWNALLEGRO_EVENT_KEY_UP은 물리적 키가 눌러 진 것에 해당합니다. 그 (것)들과 인쇄 가능한 특성 사이 1 : 1 대응이 없다.

두 키 e'é으로 변환하는 데 사용되지 않는 키가 있다고 가정 해보십시오. e'에 대한 두 가지 핵심 작동 중지 이벤트 (적절한 입력 캡처에는 유용하지 않음)가 있지만 é 인 키 문자 이벤트가 발생합니다. 또는 반대로 누군가가 F4을 텍스트의 전체 단락을 유발하는 매크로에 매핑했을 수도 있습니다. 이 경우 하나의 키에 대해 여러 개의 문자를 사용할 수 있습니다.

단순한 테스트 : OS의 키보드 드라이버가 반복 이벤트를 보내면 5 초 동안 키를 누르고 있으면 ALLEGRO_EVENT_KEY_DOWN이되지만 복수는 ALLEGRO_EVENT_KEY_CHAR이됩니다.

ALLEGRO_USTR을 사용하면 이러한 유니 코드 문자열을 쉽게 저장할 수 있습니다. 백 스페이스를 누르면

ALLEGRO_USTR *input = al_ustr_new(""); 

// in the event loop 
al_ustr_append_chr(input, event.keyboard.unichar); 

당신은 부가 직접 al_draw_ustr(font, color, x, y, flags, input)을 통해 글꼴로 미국 무역 대표부 데이터 유형을 사용하거나이에 대한 읽기 전용 포인터를 얻을 수 al_cstr(input)을 사용할 수있는 등, 또한 문자를 삭제하는 방법을있다 UTF-8 문자열

관련 문제