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

[SFML] Text Box i pisanie w nim

Ostatnio zmodyfikowano 2012-10-07 10:26
Autor Wiadomość
ridic14
Temat założony przez niniejszego użytkownika
[SFML] Text Box i pisanie w nim
» 2012-10-06 18:59:26
Tworzę tekstboxa i chcę żeby można było w nim pisać ...

pierwsza myśl to:

C/C++
if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::A )
     inActive += "a";

if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::B )
     inActive += "b";

if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::C )
     inActive += "c";

............

ale taki kod to jakaś bzdura i za długo będzie trwać pisanie tego irp...

więc pomyślałem o getch() wydaje się że to świetny pomysł... lecz niestety bo ta metoda czeka na naciśnięcie przycisku(czyt. zatrzymuje program do naciśnięcia przycisku co jest kolejną bzdurą....)

...

Czy ma ktoś jakiś pomysł?
P-66192
SeaMonster131
» 2012-10-06 19:05:28
Ja spojrzałem na tabelkę ASCII oraz na kod klawiszy: powiedzmy że sf::Keyboard::A to 1, a ..::Z to 10.
Lecę pętlą for od tej 1 do 10. Teraz, 'A' w ASCII to 41, więc muszę dodać 40 (1+x=41; x=40):
C/C++
string text;

for( int i = 1; i <= 10; i++ ) {
    if( event.type == sf::Event::KeyPressed && event.key.code == i )
         text += i + 40;
   
}

Ja to zrobiłem mniej więcej w ten sposób, choć pewnie są też inne. :)
P-66193
ridic14
Temat założony przez niniejszego użytkownika
» 2012-10-06 19:12:04
key.code ma tylko literowe nazwy tj. nie ma liczbowych zamienników
P-66194
Admixior
» 2012-10-06 19:14:06
A nie ma czegoś takiego jak event "TextEntered"?
Tam masz od razu zamienione na odpowiednią wielkość lub znak specjalny ;]
C/C++
else if( zdarzenie.Type == zdarzenie.TextEntered )
{
    chgnm.AddChar( zdarzenie.Text.Unicode );
}
P-66195
ridic14
Temat założony przez niniejszego użytkownika
» 2012-10-06 19:29:20
Dzięki za pomoc działa
P-66196
Admixior
» 2012-10-06 19:33:23
A co chcesz tej zmiennej ustaawić (co to jest to inActive) i wydaje  mi się że jak to jest czysty "..." to L powinno być bez nawiasów.
P-66197
ridic14
Temat założony przez niniejszego użytkownika
» 2012-10-06 19:35:28
ale jest inny problem a mianowicie przycisk backspace i enter powoduje pojawienie się kwadracika... jak to zwalczyć?

lub jaki kod/nazwę ma to zdarzenie to za pomocą if/a się to wyeliminyje

Mają one kod 8 i 13 więc teraz zobaczę co da się zrobić
P-66199
Admixior
» 2012-10-06 19:41:57
po prostu sprawdzasz:
C/C++
bool is_text( wchar_t c )
{
    if(( c >= L'A' && c <= L'Z' ) ||( c >= L'a' && c <= L'z' ) ) //jeżeli jest to litera
         return true;
   
    wstring pol = L"ęóąśłżźćńĘÓĄŚŁŻŹĆŃ"; //polskie znaki tutaj też możesz dodać własne znaki specjalne
    if( pol.find_first_of( c ) != string::npos ) return true; //jeżeli znaki specjalne zagadzają się
   
    return false; //nie jest to litera
}
int ChangeName::AddChar( wchar_t c )
{
    if( !wid ) return - 1;
   
    if( !is_text( c ) )
    {
        if( c != 0x08 && c != 0x0d ) //jeżeli jest to backspace lub enter
            ::MessageBeep( MB_ICONINFORMATION );
        //piszczenie jeżeli znak jest nie poprawny - nietypowy przycisk na klawiaturze (możesz to usunąć jeżeli nie chcesz)
        return - 2;
    }

i obsługa enter i backspace
C/C++
else if( zdarzenie.Type == zdarzenie.KeyPressed )
{
    if( zdarzenie.Key.Code == sf::Key::Return ||
    zdarzenie.Key.Code == sf::Key::Tab ) chgnm.TabOrEnterPressed();
   
    if( zdarzenie.Key.Code == sf::Key::Back ) chgnm.DeleteChar();
   
P-66200
« 1 » 2
  Strona 1 z 2 Następna strona