Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[sfml]Wpisywanie z klawiatury polskich znaków

Ostatnio zmodyfikowano 2012-06-12 20:59
Autor Wiadomość
mar3
Temat założony przez niniejszego użytkownika
[sfml]Wpisywanie z klawiatury polskich znaków
» 2012-06-12 17:50:01
Piszę aplikację w której można będzie za pomocą klawiatury wpisywać tekst. Problem jest w tym, że jak ktoś chce wpisać ą wciśnie alt+a to pojawiają się dwie litery a. Gdy ktoś wciśnie alt+e to pojawia się ea.

Oto mój kod:
C/C++
sf::String nDoZgadniecia;
nDoZgadniecia.SetPosition( oknoAplikacji.GetWidth() / 2 - 200, 450 );
nDoZgadniecia.SetSize( 24 );
nDoZgadniecia.SetColor( sf::Color::White );
nDoZgadniecia.SetText( "" );
sf::Font mojaCzcionka;
mojaCzcionka.LoadFromFile( "arial.ttf", 30 * 5, L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ąćęłńóśźżĄĆĘŁŃÓŚŹŻ" );
nDoZgadniecia.SetFont( mojaCzcionka );
//...
sf::Event zdarzenie;
while( oknoAplikacji.GetEvent( zdarzenie ) )
{
    if( zdarzenie.Type == sf::Event::Closed )
         oknoAplikacji.Close();
   
    if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code == sf::Key::Escape )
         oknoAplikacji.Close();
   
    if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code >= 97 && zdarzenie.Key.Code <= 122 )
    {
        std::string aktualny = nDoZgadniecia.GetText(); //aktualny tekst - ten który jest teraz wyświetlany
        if( aktualny.size() / 14 < 5 ) // /14 ponieważ jedna litera zajmuje 14 elementów tablicy std::string
        {
            sf::String tmp2( & zdarzenie.Text.Unicode ); //tekst do dodania
            std::string tmp3 = tmp2.GetText(); //tekst do dodania w std::string
            nDoZgadniecia.SetText( aktualny + tmp3 );
        }
    }
}
oknoAplikacji.Clear( sf::Color::Black );
oknoAplikacji.Draw( nDoZgadniecia );
oknoAplikacji.Display();
Bardzo proszę o pomoc w rozwiązaniu tego problemu.
Z góry dziękuję.
P-58317
DejaVu
» 2012-06-12 19:25:11
sprawdź czy alt wciśnięty jest w trakcie wciskania klawisza i jeżeli tak to wstaw odpowiedni znak.
P-58326
mar3
Temat założony przez niniejszego użytkownika
» 2012-06-12 20:59:05
Dzięki DejaVu.
Podczas pisania dodatkowych if'ów zauważyłem, że wystarczy dodać
oknoAplikacji.GetEvent( zdarzenie );
 w if'ie sprawdzającym literkę, która została wciśnięta. Teraz mój kod wygląda tak:
C/C++
if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code >= 97 && zdarzenie.Key.Code <= 122 )
{
    std::string aktualny = nDoZgadniecia.GetText(); //aktualny tekst - ten który jest teraz wyświetlany
   
    oknoAplikacji.GetEvent( zdarzenie ); //to teraz dopisałem
   
    if( aktualny.size() / 14 < 5 ) // /14 ponieważ jedna litera zajmuje 14 elementów tablicy std::string
    {
        sf::String tmp2( & zdarzenie.Text.Unicode ); //tekst do dodania
        std::string tmp3 = tmp2.GetText(); //tekst do dodania w std::string
        nDoZgadniecia.SetText( aktualny + tmp3 );
    }
}
Teraz wszystkie: ą, ę, ó... działają dobrze. Tylko jak się wciśnie np. alt+k to pojawia się ka. Próbowałem dopisać if, ale mi nie wyszło. Jak temu zaradzić?

Edit:Przypadkiem odkryłem, że wystarczy dopisać
C/C++
if( zdarzenie.Key.Alt == true )
     continue;
Teraz kod wygląda tak:
C/C++
if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code >= 97 && zdarzenie.Key.Code <= 122 )
{
    std::string aktualny = nDoZgadniecia.GetText(); //aktualny tekst - ten który jest teraz wyświetlany
   
    oknoAplikacji.GetEvent( zdarzenie );
    if( zdarzenie.Key.Alt == true )
         continue;
   
    if( aktualny.size() / 14 < 10 ) // /14 ponieważ jedna litera zajmuje 14 elementów tablicy std::string
    {
        sf::String tmp2( & zdarzenie.Text.Unicode ); //tekst do dodania
        std::string tmp3 = tmp2.GetText(); //tekst do dodania w std::string
        nDoZgadniecia.SetText( aktualny + tmp3 );
    }
}
Teraz wszystko działa ok. Nie rozumiem dlaczego? Czy ktoś może mi to wytłumaczyć?
P-58331
« 1 »
  Strona 1 z 1