Menu w programach QB  

mały przegląd


(W Sieci znaleźć można wiele przykładów budowania menu dla programów w QBasicu, np. te napisane przez Dona Smitha, czy też topmenu2 Glenna Millera jeszcze z 1989 r. Być może po ich spolszczeniu dołączę je do tego przeglądu. Także Bob Seguin w rozdziale "Myszy i menu" pokazuje, jak w trybie graficznym zrobić - windowsopodobne - menu sterowane myszą. Tymczasem więc - tylko nieco prostych przykładów. Kod dla nich musisz wymyśleć samemu...)

Proste menu z opcjami oznaczonymi przez cyfry. Jeśli jest obsługiwane przez zwykłe INPUT, na ekranie pozostaje naciśnięta cyfra, ale wybór wymaga potwierdzenia przez [Enter]. Za to sterowanie może być obsłużone przez zmienną numeryczną. Wygodniejsza wersja z Klaw$ = INPUT$(1) nie wymaga [Enter] i nie zostawia śladu; gdyby był on potrzebny, zawsze można go uzyskać przez PRINT Klaw$. Wtedy użycie wprowadzonej cyfry do obliczeń wymaga funkcji VAL.




     Wybierz:

       1. Pierwszy

       2. Drugi

       3. Trzeci

       0. Wyjście




Odmiana tego samego menu - z nawiasami kwadratowymi [   ], które symbolicznie podkreślają, że chodzi tu o naciśnięcie klawisza. Obsługiwane przez Klaw$ = INPUT$(1).




     Wybierz:

       [1] - Pierwszy

       [2] - Drugi

       [3] - Trzeci

      [Esc]- Wyjście




Jeszcze jeden wariant tego menu, używający klawiszy liter. Jeśli będą to kolejne litery alfabetu, pozwala wprowadzić maksymalnie tyle opcji, ile jest liter. Przykład poniżej reaguje na pierwsze litery nazwy opcji. W tej sytuacji jedni użytkownicy nawykowo będą wciskać te klawisze z Shift'em, a inni nie, trzeba więc "wyłączyć" rozpoznawanie pocztu liter przez dodanie po Klaw$ = INPUT$(1) linii Klaw$ = UCASE$(Klaw$) [albo Klaw$ = LCASE(Klaw$)].
Jeżeli menu podczas dalszej pracy programu ma pozostawać na ekranie, warto zaznaczyć dokonany wybór przez wyświetlenie wybranej pozycji w "negatywie" (tylko litery, lub też całego tekstu opcji), zamieniając domyślne kolory liter i tła [7, 0] na przeciwne: COLOR 0, 7 (przy czarnym ekranie i szarych literach). Pomocne będzie polecenie SWAP.




     Wybierz:

       [P] - Pierwszy

       [D] - Drugi

       [T] - Trzeci

      [Esc]- Wyjście




Jeszcze inną odmianą tego menu będzie takie, w którym na odpowiedni klawisz wskazywać będzie (znane z menu QBasica) rozjaśnienie pierwszej litery opcji - COLOR 15, 0 (dla trybu tekstowego) czyli wypisanie jej innym kolorem.




     Wybierz:

       Pierwszy

       Drugi

       Trzeci

      [Esc]= Wyjście




"Wędrujące podświetlenie", sterowane naciskaniem klawisza Tab, działa jak przełącznik, wybierając jedną z dwóch opcji:

Kolory tła i liter zapisane są w zmiennych kt i kl, a polecenie "kolorujące" ma postać COLOR kt, kl. Polecenie SWAP kt, kl umieszczone w pętli zamienia ze sobą wartości tych zmiennych przy każdym naciśnięciu [Tab], a równocześnie inne SWAP zamienia wartości zmiennych istotnych dla dalszego biegu programu. Wyjście z pętli (i zaakceptowanie wyboru) następuje po naciśnięciu [Enter] - CHR$(13).



A oto inne menu "klawiszowe", oparte na INKEY$(1). Pomysł wykorzystania ramek z rozszerzonego zestawu znaków ASCII do "narysowania klawiszy" został zapożyczony z dawnej DOS-owskiej wersji programu MKS-Vir:




A tutaj na stronie tytułowej programu umieszczono równocześnie opis "klawiszologii" i dwa menu przełączane. Znacznik [x] wędruje w nich pomiędzy nawiasami, w jednym menu przełączany klawiszem [Tab], a w drugim - [Insert]. Pętla interpretująca menu wykorzystuje INKEY$ i konstrukcję SELECT CASE:



W drugiej edycji programu menu jest jeszcze bardziej rozbudowane i oparte na klawiszach funkcyjnych F2 - F7 (F1 zwyczajowo daje dostęp do Pomocy).


Z wyjątkiem F1 i F7 wszystkie klawisze działają jako przełączniki, przy czym zmienia się też opis przełączanej opcji. Naciskanie klawisza F5 zmienia # of samples displayed co 1 w zakresie od 6 do 1 i z powrotem.




Tutaj mamy poziome menu arkusza kalkulacyjnego Lotus 1-2-3, dostępne klawiszem [/] a także myszą. Przemieszczanie się pomiędzy opcjami górnego menu realizują klawisze strzałek albo wybranie pierwszej litery opcji. Równocześnie w dolnym wierszu pojawiają się sub-opcje dla tej wskazanej w górnym. Z prawej strony arkusza - ikony skrótów do bezpośredniej obsługi myszą niektórych operacji.

Takie menu (nawet z ikonami) można także dość łatwo sporządzić i obsłużyć w QBasicu.



Stabilna "ściągawka z klawiszologii" (na przewijanym ekranie bazy danych dBaseIII+) jest bardzo łatwa do uzyskania także w QBasicu. Sześć wierszy, które zajmuje, trzeba wyłączyć z przewijania poleceniem

VIEW PRINT 7 TO 25.
Przewijany wtedy będzie tylko obszar ekranu od wiersza 7 w dół. Ustawienie VIEW PRINT 1 TO 19 pozwoli umieścić takie stabilne napisy u dołu ekranu, a np. 7 TO 19 - równocześnie u dołu i u góry. W ten sposób można np. rozmieścić menu i pasek stanu.




Tutaj mamy menu z dBaseIII+ - bardzo podobne w koncepcji do menu edytora QBasica, z tą różnicą, że nie angażuje klawisza Alt. Podobnie jak w QB jest to tzw. menu rozwijane (Pull-Down Menu). Klawisze strzałek poziomych powodują przesuwanie się po menu na górnym pasku, a podczas tej wędrówki rozwijają się w dół poszczególne sub-opcje, wśród których wybór dokonywany jest klawiszami strzałek pionowych. Odpowiednie podświetlenia wędrują za strzałkami. Menu to (w odróżnieniu od QB) reaguje na klawisze pierwszych liter tylko w przypadku opcji paska, a w submenu już nie.


Zbudowanie (i obsługa programowa) takiego złożonego menu to już sporo pracy nad wieloma liniami kodu. Nie obejdzie się też bez podprogramów lub procedur SUB. Podstawy jednak są podobne: klawisze strzałek przechwytujemy przez INKEY$ w pętli i SELECT CASE albo konstrukcją ON KEY(n) GOSUB etykieta (gdzie n będzie z zakresu 11 - 14), a funkcja SWAP będzie zamieniać kolory czyli podświetlenie. Następnie w podprogramie lub procedurze SUB trzeba będzie zakodować to, co ma wykonywać wybrana opcja.

Podobnie działa topmenu2 Glenna Millera z 1989 r. Można je ściągnąć i skopiować zastosowane w nim rozwiązania. Program jest dosyć duży (40,8 KB), ale dobrze skomentowany po angielsku.



Ikony Lotusa powiększone w programie MSPaint       Jeśli wyposażymy nasz program w procedury obsługi myszy (zob. QBasic myszowaty), można wtedy będzie klikać w poszczególne pozycje menu. Oczywiscie ekran nie może być przewijany, bo zmieni się położenie tych napisów, a obsługa myszy reaguje na współrzędne ekranowe jej wskaźnika. Gdy ekran pracuje w trybie graficznym SCREEN 12 (co przy okazji daje dodatkowe 6 wierszy dla tekstu), możemy pokusić się o wyposażenie go w ikony do klikania. Wskaźnik myszy przybierze wtedy znajomą postać strzałki, a obsługa myszy będzie reagować na jego położenie względem współrzędnych graficznych.

      Tworzenie tak małych obrazków bezpośrednio z poleceń graficznych QBasica wymaga sporej wyobraźni i zwykle wielu prób. Użyteczne mogą być zarówno polecenia PSET, LINE i CIRCLE, jak i DRAW. A oto sposób na niejakie uproszczenie tej roboty, z wykorzystaniem windowsowskiego Painta jako pomocnika:

Ikony w Windows mają domyślny wymiar 32 x 32 piksele. W Paincie z menu "Obraz" wybieramy więc "Atrybuty...", po czym w "Jednostkach" zaznaczamy "Piksele" i wpisujemy Szerokość i Wysokość = 32. Otrzymujemy mały biały kwadracik - pole do rysowania. Przestawiamy paletę Painta na 16 kolorów, zapisując wstępnie ten obraz pod jakąś nazwą (Plik —> Zapisz jako..., wybierając w "Zapisz jako typ:" - Mapa bitowa 16 kolorowa). Teraz klikając na pasku narzędzi na ikonę lupy wybieramy powiększenie "2 x", a jeśli oczy słabe lub ręka niepewna - "6 x".

Komponujemy nasz obrazek z linii i pojedynczych pikseli, co chwila sprawdzając, jak wygląda niepowiększony (1 x). Kiedy już jest gotowy, powiekszamy go do 6 x i zmniejszamy okno Painta tak, żeby móc równocześnie widzieć okno QBasica. Paint na pasku stanu w prawym dolnym rogu pokazuje bieżące współrzędne położenia swojego kursora - tu: w zakresie od 0,0 do 32,32. W ten sposób "mierzymy" elementy naszego obrazka i wyniki tych pomiarów odpowiednio wstawiamy do poleceń graficznych QBasica. Jeśli np. lewy górny róg ikony ma się znaleźć na ekranie na pozycji 100,100 a kolorem tła ma być żółty, rysujemy kwadrat poleceniem

LINE (100 + 0, 100 + 0)-(100 + 32, 100 + 32), 14, BF

Ikona - drogowskaz powiększenie 2 x Oczywiście nasze ikony niekoniecznie muszą mieć wymiar 32 x 32 i niekoniecznie muszą być kwadratowe. Mogą to być np. tabliczki z napisami, jak ten "drogowskaz" obok. Tu w powiększeniu 2 x widać zębatość (aliasing) pikseli składających się na napis kursywą, który trudno byłoby taki stworzyć z wyobraźni. Tym sposobem zresztą można zaprojektować także inne elementy graficzne dla programu.

Na przeciwnym biegunie znajdują się interfejsy wzorowane na Windows, zawierające dziesiątki procedur SUB i tysiące linii kodu, jak np. napisana w QBasicu przez Sami Kyöstilä Windoze (tutaj do ściągnięcia):


Wstęp do tworzenia takich interfejsów znajdziesz w kursie grafiki Boba Seguina w rozdziale "Myszy i menu".




Damian Gawrych "Deger", czerwiec 2007 - luty 2008
http://deger.republika.pl