我正在C++中實現我自己的文本編輯器。它會......好的。 ; P將掃描碼轉換爲ASCII
我需要一種方法來將一個鍵碼(特別是Allegro,他們稱之爲掃描碼)轉換成一個ASCII字符。我可以輕鬆完成A-Z,並且將它們轉換爲a-z也很容易。我目前所做的是在Allegro中使用一個函數,它從掃描碼(al_keycode_to_name)返回一個名稱,這意味着如果按下的鍵是A-Z,它將「A」返回到「Z」。這很容易,但我不能簡單地閱讀特殊字符,如「,」,「;」等等,那是我很難過的地方。
有沒有辦法自動做到這一點?也許一個這樣做的圖書館?真正的技巧是考慮到不同的佈局。
這是我到目前爲止,以防萬一誰感興趣。類InputState基本上是快板inputstate的副本,添加了功能(的keyDown,使用keyUp,按鍵爲例):
void AllegroInput::TextInput(const InputState &inputState, int ¤tCharacter, int ¤tRow, 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;
}
}
}
}
}
沒有意識到我可以,謝謝! – 2012-07-14 14:42:54