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

Wczytywanie polskich znaków w allegro 4.x... readkey();

Ostatnio zmodyfikowano 2013-03-06 02:02
Autor Wiadomość
adikab
Temat założony przez niniejszego użytkownika
Wczytywanie polskich znaków w allegro 4.x... readkey();
» 2013-03-05 15:37:15
Witam,

Proszę o pomoc, być może ktoś ma jakiś pomysł. Przeszukałem kilkadziesiąt tematów, kombinowałem jak koń pod górę i bez efektu.


Sprawa wygląda tak. Potrzebuje wczytać dane od użytkownika (np. imię) w Allegro 4.x. Aplikacja pracuje pod Windowsem, używam CodeBlocks, formatowanie ustawione na UTF-8, wczytana własna czcionka. Wyświetlanie pl znaków działa bezproblemowo. Problem pojawia się przy wczytywaniu ich z klawiatury (powiedzmy, że z tym sobie jakoś poradziłem). Jak na razie osiągnąłem tyle, że wczytuje sobie te polskie znaki i wszystko było by ok gdyby nie to, że przecież jesteśmy tylko ludźmi i każdy się może pomylić. Trzeba więc umożliwić skasowanie źle wpisanej literki. O ile przy "normalnych" znakach jest ok, to w przypadku polskich liter zaczynają się dziać istne jaja.... Co więc robię nie tak... jeszcze chwila i pozostanie mi strzelić sobie baranka w ścianę.

Kod który podam pewnie będzie pod wieloma względami do bani. Modyfikowałem go na różne sposoby aby uzyskać pożądany efekt.

C/C++
#include <allegro.h>
#include <iostream>

int main()
{
    set_uformat( U_UTF8 );
    allegro_init();
    install_keyboard();
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 1024, 768, 0, 0 );
    clear_to_color( screen, makecol( 128, 128, 128 ) );
   
   
    BITMAP * bufor = NULL;
    BITMAP * obrazek = NULL;
   
    int klawisz = 0;
   
    bufor = create_bitmap( 800, 600 );
    clear_to_color( bufor, makecol( 128, 128, 128 ) );
    obrazek = create_bitmap( 800, 600 );
    clear_to_color( obrazek, makecol( 128, 128, 128 ) );
   
   
    // sprawdzanie czy udalo sie utworzyc bufor
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora !" );
        allegro_exit();
        return 0;
    }
   
    masked_blit( obrazek, bufor, 0, 0, 0, 0, 800, 600 );
    blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
   
    FONT * czcionka;
   
    czcionka = load_font( "font/cambria_18_b.pcx", NULL, NULL );
    if( !czcionka )
    {
        allegro_message( "Nie moge otworzyc czcionki !" );
        allegro_exit();
    }
   
   
   
    std::string imgra;
    std::string tymczas1;
    std::string tymczas2;
    int licznik = 0;
   
    do
    {
        clear_keybuf();
        klawisz = readkey();
       
        if(( klawisz != 17165 ) )
        {
            if( klawisz != 16136 &&( licznik < 20 ) )
            {
               
                switch( klawisz )
                {
                case 350:
                    imgra += "ą";
                    licznik++;
                    break;
                case 862:
                    imgra.append( "ć" );
                    licznik++;
                    break;
                case 1374:
                    imgra += "ę";
                    licznik++;
                    break;
                case 3166:
                    imgra += "ł";
                    licznik++;
                    break;
                case 3678:
                    imgra += "ń";
                    licznik++;
                    break;
                case 4083:
                    imgra += "ó";
                    licznik++;
                    break;
                case 4958:
                    imgra += "ś";
                    licznik++;
                    break;
                case 6238:
                    imgra += "ż";
                    licznik++;
                    break;
                case 6750:
                    imgra += "ź";
                    licznik++;
                    break;
                   
                default:
                    imgra += klawisz;
                    licznik++;
                    break;
                }
               
               
               
                if( licznik > 0 )
                {
                    tymczas1.clear();
                    tymczas2.clear();
                    tymczas1.insert( 0, imgra,( licznik - 1 ), 1 );
                    tymczas2.insert( 0, imgra, 0,( licznik ) );
                }
               
            }
           
            if(( klawisz == 16136 ) &&( licznik >= 0 ) ) //jezeli nacisnieto backspace
            {
               
                tymczas1.clear();
                tymczas2.clear();
                if( licznik > 0 ) tymczas1.insert( 0, imgra,( licznik - 1 ), 1 );
               
                tymczas2.insert( 0, imgra, 0,( licznik ) );
                imgra = imgra.erase(( licznik ) );
               
                licznik--;
                if( licznik <= 0 )
                {
                    licznik = 0;
                }
               
            }
           
            masked_blit( obrazek, bufor, 0, 0, 0, 0, 1024, 768 );
            textout_ex( bufor, czcionka, "Wpisywany tekst :", 60, 300, makecol( 255, 0, 255 ), - 1 );
            textout_ex( bufor, czcionka, imgra.c_str(), 300, 300, makecol( 255, 0, 255 ), - 1 );
            textout_ex( bufor, czcionka, "Ostatni twoj znak :", 53, 330, makecol( 255, 0, 255 ), - 1 );
            textout_ex( bufor, czcionka, tymczas1.c_str(), 300, 330, makecol( 255, 0, 255 ), - 1 );
            textout_ex( bufor, czcionka, "Kopia wpisu :", 118, 390, makecol( 255, 0, 255 ), - 1 );
            textout_ex( bufor, czcionka, tymczas2.c_str(), 300, 390, makecol( 255, 0, 255 ), - 1 );
            textprintf_ex( bufor, czcionka, 300, 190, makecol( 0, 0, 0 ), - 1, "zmienna klawisz = %d", klawisz );
            textprintf_ex( bufor, czcionka, 300, 220, makecol( 0, 0, 0 ), - 1, "(char) klawisz = %d",( char ) klawisz );
            textprintf_ex( bufor, czcionka, 300, 250, makecol( 0, 0, 0 ), - 1, "Licznik (max 20 znaków) = %d", licznik );
           
            textout_ex( bufor, czcionka, "Enter - koniec", 300, 500, makecol( 255, 0, 255 ), - 1 );
           
           
           
            blit( bufor, screen, 0, 0, 0, 0, 1024, 768 );
           
        }
       
       
       
    } while(( klawisz != 17165 ) );
   
    masked_blit( obrazek, bufor, 0, 0, 0, 0, 1024, 768 );
    textout_ex( bufor, czcionka, "Wpisany tekst :", 60, 300, makecol( 255, 0, 255 ), - 1 );
    textout_ex( bufor, czcionka, imgra.c_str(), 320, 300, makecol( 255, 0, 255 ), - 1 );
    blit( bufor, screen, 0, 0, 0, 0, 1024, 768 );
   
   
   
    klawisz = readkey();
    while( !key[ KEY_SPACE ] );
   
    clear_keybuf();
   
    destroy_bitmap( bufor );
    destroy_bitmap( obrazek );
    allegro_exit();
   
    return 0;
}
END_OF_MAIN();

Edit:

Gabes Trzeba by wtedy pamiętać pozycje polskich liter w stringu.... Myślałem ogólnie czy jakoś to można obejść... Jeszcze jedna sprawa do tego tematu.

Wciśniecie alt+a daje ten sam efekt co shift+alt+a czyli brak rozróżniania małych/wielkich liter. Też można niby obejść ustalając z góry, że pierwsza litera imienia czy nazwiska jest duża i wstawiać od razu dużą. Ale to wszystko na około idzie...

Edit2:

Idąc twoim tropem...można by machnąć do tego tablice odpowiadającą maksymalnej ilości znaków, wypełnioną zerami i wstawiać jedynkę w pozycję na której w stringu jest polski znak i przy kasowaniu sprawdzać czy pozycji licznika odpowiada 1 czy 0, wtedy odpowiednio odejmować jeden lub dwa znaki....
P-77729
Gabes
» 2013-03-05 15:50:46
Każdy polski znak zajmuje dwa bajty w UTF8, może dodawaj do licznika dwa gdy wczytujesz i odejmuj gdy usuwasz.
P-77732
adikab
Temat założony przez niniejszego użytkownika
» 2013-03-06 02:02:11
C/C++
#include <allegro.h>
#include <iostream>

int main()
{
    set_uformat( U_UTF8 );
   
    allegro_init();
    install_keyboard();
   
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 1024, 768, 0, 0 );
    clear_to_color( screen, makecol( 128, 128, 128 ) );
   
    BITMAP * bufor = NULL;
    BITMAP * obrazek = NULL;
   
    bufor = create_bitmap( 800, 600 );
    clear_to_color( bufor, makecol( 128, 128, 128 ) );
    obrazek = create_bitmap( 800, 600 );
    clear_to_color( obrazek, makecol( 128, 128, 128 ) );
   
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora !" );
        allegro_exit();
        return 0;
    }
   
    if( !obrazek )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora !" );
        allegro_exit();
        return 0;
    }
   
    FONT * czcionka;
   
    czcionka = load_font( "font/cambria_18_b.pcx", NULL, NULL );
    if( !czcionka )
    {
        allegro_message( "Nie moge otworzyc czcionki !" );
        allegro_exit();
    }
   
    masked_blit( obrazek, bufor, 0, 0, 0, 0, 800, 600 );
    blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
   
    std::string imgra;
    int licznik = 0;
    int klawisz = 0;
    bool tabpom[ 20 ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
   
    do
    {
        clear_keybuf();
        klawisz = readkey();
       
        masked_blit( obrazek, bufor, 0, 0, 0, 0, 1024, 768 );
       
        if( klawisz != 16136 &&( licznik < 20 ) )
        {
           
            switch( klawisz )
            {
            case 350:
                imgra.append( "ą" );
                tabpom[ licznik ] = 1;
                licznik++;
                break;
            case 862:
                imgra.append( "ć" );
                tabpom[ licznik ] = 1;
                licznik++;
                break;
            case 1374:
                imgra.append( "ę" );
                tabpom[ licznik ] = 1;
                licznik++;
                break;
            case 3166:
                imgra.append( "ł" );
                tabpom[ licznik ] = 1;
                licznik++;
                break;
            case 3678:
                imgra.append( "ń" );
                tabpom[ licznik ] = 1;
                licznik++;
                break;
            case 4083:
                imgra.append( "ó" );
                tabpom[ licznik ] = 1;
                licznik++;
                break;
            case 4958:
                imgra.append( "ś" );
                tabpom[ licznik ] = 1;
                licznik++;
                break;
            case 6238:
                imgra.append( "ź" );
                tabpom[ licznik ] = 1;
                licznik++;
                break;
            case 6750:
                imgra.append( "ż" );
                tabpom[ licznik ] = 1;
                licznik++;
                break;
               
                default:
                if((( char ) klawisz <= 90 &&( char ) klawisz >= 65 ) ||(( char ) klawisz <= 122 &&( char ) klawisz >= 97 ) )
                {
                    imgra += klawisz;
                    licznik++;
                }
                break;
            }
           
        }
       
        if(( klawisz == 16136 ) &&( imgra.length() > 0 ) ) //jezeli nacisnieto backspace
        {
            int apom = imgra.length();
           
            if( tabpom[ licznik - 1 ] == 0 )
            {
                imgra = imgra.erase(( apom - 1 ), 1 );
            }
           
            if( tabpom[ licznik - 1 ] == 1 )
            {
                imgra = imgra.erase(( apom - 2 ), 2 );
                tabpom[ licznik - 1 ] = 0;
            }
           
            licznik--;
           
            if( licznik < 0 ) licznik = 0;
           
        }
       
        textout_ex( bufor, czcionka, "Enter - koniec", 300, 500, makecol( 255, 0, 255 ), - 1 );
        textout_ex( bufor, czcionka, "Wpisywany tekst :", 60, 300, makecol( 255, 0, 255 ), - 1 );
        textout_ex( bufor, czcionka, imgra.c_str(), 300, 300, makecol( 255, 0, 255 ), - 1 );
       
        blit( bufor, screen, 0, 0, 0, 0, 1024, 768 );
       
    } while(( klawisz != 17165 ) );
   
    masked_blit( obrazek, bufor, 0, 0, 0, 0, 1024, 768 );
    textout_ex( bufor, czcionka, "Wpisales tekst :", 60, 300, makecol( 255, 0, 255 ), - 1 );
    textout_ex( bufor, czcionka, imgra.c_str(), 320, 300, makecol( 255, 0, 255 ), - 1 );
    blit( bufor, screen, 0, 0, 0, 0, 1024, 768 );
   
   
    klawisz = readkey();
    while( !key[ KEY_SPACE ] );
   
    clear_keybuf();
   
    destroy_bitmap( bufor );
    destroy_bitmap( obrazek );
    allegro_exit();
   
    return 0;
}
END_OF_MAIN();

Zamieszczam działający kodzik. Może się komuś przyda. Jeżeli chodzi o duże polskie litery, myślę że to nie będzie problem i zainteresowani sobie już z tym poradzą.

Zostawię jeszcze chwile otwarty temat, może ktoś będzie miał jakieś sugestie, może jakiś lepszy pomysł.
P-77788
« 1 »
  Strona 1 z 1