我正在用 C++ 实现我自己的文本编辑器。它会……好的。;P
我需要一种将键码(特别是 Allegro,他们称之为扫描码)转换为 ASCII 字符的方法。我可以轻松地完成 AZ,并且将它们转换为 az 也很容易。我目前所做的是在 Allegro 中使用一个函数,该函数从扫描码 (al_keycode_to_name) 中返回一个名称,这意味着如果按下的键是 AZ,它将返回“A”到“Z”。这很容易,但我不能简单地阅读特殊字符,如“,”,“;” 等等,这就是我遇到困难的地方。
有没有办法自动做到这一点?也许是一个这样做的图书馆?真正的诀窍是考虑不同的布局。
这是我到目前为止所拥有的,以防万一有人感兴趣。InputState 类基本上是 Allegro 输入状态的副本,具有附加功能(例如 keyDown、keyUp、keyPress):
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;
}
}
}
}
}