C++ で独自のテキスト エディターを実装しています。進んでいます...わかりました。;P
キーコード (具体的には Allegro、彼らはそれをスキャンコードと呼んでいます) を ASCII 文字に変換する方法が必要です。AZ を簡単に実行でき、それらを az に変換するのも簡単です。私が現在行っていることは、スキャンコード (al_keycode_to_name) から名前を返す Allegro の関数を使用することです。つまり、押されたキーが AZ の場合、「A」から「Z」を返します。それは簡単ですが、「、」、「;」などの特殊文字を単純に読み取ることはできません。など、そこが苦労しています。
これを自動的に行う方法はありますか?多分これを行うライブラリ?本当の秘訣は、さまざまなレイアウトを考慮することです。
誰かが興味を持っている場合に備えて、これまでのところ私が持っているものがあります。クラス InputState は、基本的に Allegro の inputstate のコピーで、機能が追加されています (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;
}
}
}
}
}