Na PW dostałem prośbę o opisanie sposobu na symulację powtarzania naciśniętego klawisza. Postanowiłem opisać to tu aby wszyscy mogli to obejrzeć.
Jak wiemy, system informuje masz dispatcher o naciśnięciach klawiszy poprzez kilka wiadomości (eventów).
MSG_KEYPRESS - przychodzi, gdy klawisz wciśnięto
MSG_KEYRELEASE - przychodzi, gdy klawisz puszczono
MSG_KEYPRESS_CHAR - informuje o kodzie Ascii wciśniętego klawisza
Do symulacji powtarzania ostatnia wiadomość nie jest nam potrzebna ale jest ważna z innego powodu. Oprócz infomowania o kodzie Ascii, powoduje ona także zamknięcie wszystkich dispatcherów (a więc naszego a potem dispatchera od menu) i wyświetlenie znaku na "blacie". Jest to celowe działanie Nokii, aby w aplikacjach, w których nie potrzebne są klawisze numeryczne, ich naciśnięcie powodowało wyjście na blat. Dzięki temu można szybko wpisać np. numer telefonu "112".
Skoro piszemy o symulacji powtarzania a więc pewnie nie chcemy żeby nam zamykało dispatcher. Rozwiązanie jest proste, musimy zaNOPować tę wiadomość.
Kod:
case MSG_KEYPRESS_ASCII:
msg=MSG_NOP;
break;
Ok, wróćmy jednak do powtarzania. Pomysł jest dość prosty. Po wykryciu naciśnięcia klawisza (MSG_KEYPRESS) oprócz wywołania jego obsługi tworzymy timer, ktory po krotkim czasie spowoduje powtorzenie ostatniego klawisza. W razie odebrania wiadomości MSG_KEYRELEASE po prostu przerywamy timer. To wszystko.
Potrzebne nam będzie miejsce w którym zapamiętamy kod wciśniętego klawisza podczas gdy timer będzie odliczał czas. W tym celu stworzymy nowe pole w strukturze application w pliku main.h (zakładam, że stworzyliśmy projekt w VisualHAMie).
Po dodaniu pola możemy przystąpić do głównej części. Po pierwsze musimy stworzyć timer wysyłający wiadomość. Załatwią to dwie następujące linie umieszczone na początku pliku .c z dispatcherem.
Kod z zadadzie sam się objaśnia. Główną częścią, w której znajduje się obsługa samych klawiszy, jest wiadomość OMSG_KEYREPEAT. Tutaj przy każdym klawiszu, który ma być powtarzany, wstawiamy linię repeat=true. Poniżej mamy ustawione czasy powtarzania. Pierwszy (70) to czas jaki ma minąć od naciśnięcia klawisza do rozpoczęcia jego powtarzania. Drugi (10) to prędkość samego powtarzania. Czasy podane są w standardowych tickach gdzie 1s równa się w przybliżeniu 125. Im mniej tym czas krótszy.
Mam nadzieję że to rozwiewa wszelkie wątpliwości na temat powtarzania klawiszy.
Ewentualne dalsze pytania proszę umieszczać poniżej.
Pozdrawiam
[Yak]
_________________ NokiX Ci się podoba? Kliknij i wyraź to!
W ten sposób możesz dla każdego klawisza osobno ustawić czy ma być powtarzany (repeat=true, brak tej lini oznacza brak powtarzania), po jakim czasie od naciśnięcia ma zacząć być powtarzany (repeat_start=xxx, brak oznacza użycie wartości domyślnej: 70) oraz jak szybko ma być powtarzany (repeat_speed=xxx, brak oznacza użycie wartości domyślnej: 10).
_________________ NokiX Ci się podoba? Kliknij i wyraź to!
Telefon: Kilka DCT3
Operator: Vodafone Pomógł: 20 razy Wiek: 36 Dołączył: 21 Gru 2004 Posty: 774 Skąd: Bochum / Niemcy
Wysłany: 2006-09-09, 00:39
MaximusResetus, baaardzo dziwne. Co ma jedno do drugiego? Błąd mówi, że makra LOCATE nie znają obiektu "msg_argc". Ten obiekt był dodany z 5 snapshotów temu, tylko wcześniejsze makra mogą zwrócić taki błąd. Mówię tu o dwóch makrach: LOCATE.rx i LOCATE_DATA.rx. Poszukaj ciągu "msg_argc" w makrze LOCATE_DATA.rx. Powinieneś je znaleźć w takiej linii:
Kod:
if func="MESSAGE" | func="MESSAGE_ARGS" | func="MSG_ID" | func="MSG_ARGC" | func="MSG_ARGV" then do
Jeśli nie ma to znaczy że masz jakieś stare. Pamiętaj że katalog z makrami ustawia się dla każdego projektu osobno.
_________________ NokiX Ci się podoba? Kliknij i wyraź to!
Telefon: 55,33,e398
Operator: Era Pomógł: 3 razy Wiek: 33 Dołączył: 23 Lip 2004 Posty: 456 Skąd: Nowy Sącz - okolice
Wysłany: 2006-09-09, 11:09
A no faktycznie mam chyba jakiegos przedwojennego snapshota :]
No ale to mnie dziwi że dla czasu
Kod:
else time=10;
skrypt przechodzi gładkona tym straymm snapshocie. Czy wtedy nie wyszukuje tej funkcji msg_argc? Przecież musi jej szukac ckoro jest wymieniona w pliku źródłowym...?
Telefon: Kilka DCT3
Operator: Vodafone Pomógł: 20 razy Wiek: 36 Dołączył: 21 Gru 2004 Posty: 774 Skąd: Bochum / Niemcy
Wysłany: 2006-09-09, 16:32
MaximusResetus, no musi, nie wiem co to może być. Prześlij mi to wszystko to zobaczę.
[ Dodano: 2006-09-10, 12:58 ] MaximusResetus, ok, dostałem Twój projekt i rzuciłem okiem.
Więc po pierwsze te skrypty locate są stare, to już wiemy.
A dziwny efekt szukania obiektu "msg_argc" w przypadku podania innej wartości niż 10 wynika stąd, że Twój kod wygląda tu następująco:
Kod:
if(msg_argc==1) time=10; // czas do rozpoczecia powtarzania (mniej = wczesniej)
else time=10; // predkosc powtarzania (mniej = szybciej)
Zauważ że we wcześniejszym poście podałeś 70 jako pierwszą wartość podczas gdy na prawdę masz tam również 10. Masz więc w obu tę samą wartość. W takim wypadku optymalizator kompilatora "widzi", że te dwie linie to to samo co:
Kod:
time=10;
A to oznacza że msg_argc (użyte w if'ie) już nie jest potrzebne więc nie będzie go szukał makrem locate.
Jeśli zmienisz to na cokolwiek innego to if musi zostać a więc msg_argc jest potrzebne.
Pozdrawiam
[Yak]
_________________ NokiX Ci się podoba? Kliknij i wyraź to!
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Nie możesz ściągać załączników na tym forum