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. #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 ) ); 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 ) ) { 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.... |
adikab Temat założony przez niniejszego użytkownika |
» 2013-03-06 02:02:11 #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 ) ) { 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ł. |