-------------Fragmenty w >...< pogrubione--------------------- AMOS ---- MENU I PROGRAM GRAFICZNY W dzisiejszym odcinku AMOS-a zaprojektujemy wîasny interfejs uûytkownika (skîadajâcy sië jedynie z rozwijalnego menu) dla bardzo prostego programu graficznego -- Kreska. Krzysztof Prusik Dla peceta istnieje sîawny Visual Basic. Oczywiôcie nie moûe sië on równaê z AMOS-em pod wzglëdem moûliwoôci graficznych, dúwiëkowych czy muzycznych, ale ma jednâ ciekawâ cechë -- umoûliwia programowanie zdarzeniowe. Polega ono na tym, ûe najpierw projektuje sië interfejs uûytkownika, tj. menu, okienka dialogowe, przyciski itp., a nastëpnie pod kaûde z nich podpina zdarzenia, czyli procedury, które majâ zostaê wykonane. To tyle na temat teorii. Proste? Visual Basic zmusza koderów do takiego stylu programowania, a my sami, z wyboru, wykorzystamy të technikë do utworzenia naszej Kreski. No to zaczynamy od zaprojektowania menu. Tworzenie menu 1. Gîówne operacje (Project) 1.1. Informacja o autorze (About) 1.2. -------------------------------------- 1.3. Odczytanie z dysku obrazka IFF (Load Iff) 1.4. Zapis na dysk obrazka IFF (Save Iff) 1.5. -------------------------------------- 1.6. Koniec pracy, wyjôcie z programu (Exit) 2. Tryb rysowania (Mode) 2.1. Stawianie kropek (Plot) 2.2. Linia îamana (ciâgniëcie myszâ) 2.3. Kreôlenie odcinków (Line) 2.4. Kreôlenie okrëgów (Circle) 2.5. Kreôlenie elips (Ellipse) 2.6. Wypeînianie figur (Fill) 3. Wybór koloru rysowania (Color) 3.1. Wziëcie koloru z ekranu (Get Color) 3.2. Kolor 0 (Color 0) 3.3. Kolor 1 (Color 1) 3.4. Kolor 2 (Color 2) itd. (tyle ile kolorów). 4. Rozdzielczoôê ekranu (Screen Mode) 4.1. 320 x 256 pikseli -- 32 kolory 4.2. 320 x 512 pikseli -- 32 kolory 4.3. 640 x 256 pikseli -- 16 kolorów 4.4. 640 x 512 pikseli -- 16 kolorów Procedura tworzâca takie menu moûe wyglâdaê np. tak: Procedure _UTWORZENIE_MENU '------------------------ pasek menu Menu$(1)=" Gîówne " Menu$(2)=" Tryb " Menu$(3)=" Kolor " Menu$(4)=" Rozdzielczoôê " '------------------------ submenu Gîówne Menu$(1,1)=" Informacja " Menu$(1,2)="------------" : Menu Inactive(1,2) Menu$(1,3)=" Îaduj IFF " Menu$(1,4)=" Zapisz IFF " Menu$(1,5)="------------" : Menu Inactive(1,5) Menu$(1,6)=" Koniec " '------------------------ submenu Informacja Menu$(1,1,1)="-------------------" Menu$(1,1,2)=" Autor: " Menu$(1,1,3)=" Krzysztof Prusik " Menu$(1,1,4)="-------------------" Menu$(1,1,5)=" program w AMOS-ie " Menu$(1,1,6)="-------------------" '------------------------ submenu Tryb Menu$(2,1)=" Kropka " Menu$(2,2)=" Linia " Menu$(2,3)=" Odcinek " Menu$(2,4)=" Okrâg " Menu$(2,5)=" Elipsa " Menu$(2,6)=" Wypeînij " '------------------------ submenu Kolor Menu$(3,1)=" Z ekranu " : Menu Inactive(3,1) For I=0 To Screen Colour-1 Menu$(3,2+I)=" Kolor"+Str$(I)+" " Next '------------------------ submenu Rozdzielczoôê Menu$(4,1)=" 320x256 32 kolory " Menu$(4,2)=" 320x512 16 kolorów " Menu$(4,3)=" 640x256 16 kolorów " Menu$(4,4)=" 640x512 16 kolorów " Menu On End Proc Krótki (i bardzo pobieûny) opis instrukcji dotyczâcych menu: >Menu$(...)=TYTUÎ$< -- ustala nazwë danej pozycji menu. >Menu Inactive(...)< -- sprawia, ûe dana pozycja menu staje sië nieaktywna (nie moûna jej wybraê). >Menu On< -- uaktywnia wyôwietlanie menu (czyli sprawia, ûe menu stanie sië widoczne po wciôniëciu prawego przycisku myszy). Przeanalizuj dziaîanie procedury _UTWORZENIE_MENU (zwróê uwagë na pëtlë >For...Next<), a gdy juû wszystko bëdzie dla Ciebie jasne aû do przesady -- przeczytaj dalszâ czëôê artykuîu. Obsîuga menu Majâc juû do dyspozycji przeôliczne, utworzone przez nas, menu (czyli interfejs uûytkownika), trzeba sië zastanowiê nad sposobem jego obsîugi. Gîówny program powinien dziaîaê wedîug nastëpujâcego schematu: 1. Otwarcie ekranu 2. Utworzenie menu 3. Sprawdzenie, czy uûytkownik nie wybraî juû jakiejô opcji z menu i ewentualne wykonanie procedury obsîugi zdarzenia. 4. Patrz punkt 3. Wydaje sië to proste, wiëc do dzieîa! _OTWORZENIE_EKRANU _UTWORZENIE_MENU Do Multi Wait If Choice _OBSLUGA_MENU End If Loop Objaônienie: >Multi Wait< -- bardzo waûna komenda (niestety, koderzy czësto zapominajâ o jej istnieniu), która powoduje, ûe w chwili oczekiwania na zdarzenie, czyli np. wybranie przez uûytkownika pewnej opcji z menu, program nie zajmuje niepotrzebnie czasu mikroprocesora, co pozwala na szybsze dziaîanie innych programów DOS-a, pracujâcych w Multitaskingu. >Choice< -- sprawdza, czy ostanio "ktoô" wybraî jakâô opcjë z menu (i nie zostaî obsîuûony). Jeûeli tak, zwraca wartoôê >True< -- prawda (w przeciwnym wypadku >False< -- faîsz). >Choice(1)< -- podaje numer wybranego przez uûytkownika menu (na pierwszym poziomie). Wszystko jasne? Listingu procedurki _OTWORZENIE_EKRANU nie zamieszczë, pozostawiajâc Tobie, drogi Czytelniku, wolnâ rëkë twórcy, _OBSLUGA_MENU zaô moûe wyglâdaê np. tak: Procedure _OBSLUGA_MENU NR=Choice(1) If NR=1 MENU_GLOWNE End If If NR=2 MENU_TRYB End If If NR=3 MENU_KOLOR End If If NR=4 MENU_ROZDZIELCZOSC End If End Proc Zdarzenia Przypuôêmy, ûe uûytkownik wybraî coô z menu "Gîówne". Jak je obsîuûymy? Moûe tak: Procedure MENU_GLOWNE NR=Choice(2) If NR=3 Load Iff Fsel$("","Niciewo.IFF","Wybierz plik"),0 End If If NR=4 Save Iff Fsel$("","Niciewo.IFF","Wybierz plik"),1 End If If NR=6 Edit End If End Proc Pojawiîy sië nowe rozkazy, lecz tym razem pozostawië je Czytelnikowi do samodzielnego przeanalizowania i zrozumienia (trzeba siëgnâê po odpowiedniâ literaturë). Na razie trzeba sië skupiê na samym sposobie obsîugiwania zdarzeï. Otóû w chwili wciôniëcia przez uûytkownika prawego przycisku myszy i wybrania przez niego jakiejô opcji z menu "Gîówne" wywoîana zostanie procedura MENU_GLOWNE, a tam, w zaleûnoôci od wyboru uûytkownika, wykonana bëdzie odpowiednia komenda. Podobna struktura obsîugi zdarzenia bëdzie dla menu "Rozdzielczoôê": Procedure MENU_ROZDZIELCZOSC NR=Choice(2) If NR=1 Screen Open 0,320,256,32,Lowres End If If NR=2 Screen Open 0,320,512,16,Lowres+Laced End If If NR=3 Screen Open 0,640,256,16,Hires End If If NR=4 Screen Open 0,6400,512,16,Hires+Laced End If End Proc Mogîoby sië wydawaê, ûe prawie tak samo bëdâ wyglâdaîy procedurki MENU_TRYB i MENU_KOLOR, ale czy muszâ? Zmiana trybu kreôlenia moûe przecieû polegaê jedynie na zdefiniowaniu na nowo zmiennej TRYB, a zmiana koloru -- na ustaleniu numeru koloru pisaka. To znaczy: Procedure MENU_TRYB TRYB=Choice(2) End Proc Procedure MENU_KOLOR Ink Choice(2)-1 End Proc Poniewaû zmienna TRYB bëdzie uûywana równieû wewnâtrz procedur, trzeba jâ zadeklarowaê jako globalnâ, czyli na poczâtku programu dostawiê linië: Global TRYB No dobrze. Zdarzenia mamy obsîuûone doskonale, ale gdzie tu rysowanie? Hmmm. Rysowanie to takûe zdarzenie, lecz wywoîane wciôniëciem lewego przycisku myszy. Tak wiëc do gîównej pëtli >Do...Loop< powinniômy dodaê linië: If Mouse Key=1 _RYSOWANIE End If Czy teraz juû wszystko jest jasne? Jeszcze nie? Myôlë, ûe poniûsza procedura dostatecznie rozjaôni wszystkim w gîowach. Procedure _RYSOWANIE '---------- kropki If TRYB=1 While Mouse Key=1 X=X Screen(X Mouse) Y=Y Screen(Y Mouse) Plot X,Y Wend End If '---------- ciâgniëcie myszâ If TRYB=2 X2=X Screen(X Mouse) Y2=Y Screen(Y Mouse) While Mouse Key=1 X1=X2 Y1=Y2 X2=X Screen(X Mouse) Y2=Y Screen(Y Mouse) Line X1,Y1 To X2,Y2 Wend End If '---------- odcinek If TRYB=3 Gr Writing %10 X1=X Screen(X Mouse) Y1=Y Screen(Y Mouse) While Mouse Key=1 X2=X Screen(X Mouse) Y2=Y Screen(Y Mouse) Line X1,Y1 To X2,Y2 Line X1,Y1 To X2,Y2 Wend Gr Writing %0 Line X1,Y1 To X2,Y2 End If '---------- okrâg If TRYB=4 Gr Writing %10 X=X Screen(X Mouse) Y=Y Screen(Y Mouse) While Mouse Key=1 R=X Screen(X Mouse)-X If R>0 Circle X,Y,R Circle X,Y,R End If Wend Gr Writing %0 If R>0 Circle X,Y,R End if End If '---------- elipsa If TRYB=4 Gr Writing %10 X=X Screen(X Mouse) Y=Y Screen(Y Mouse) While Mouse Key=1 RX=X Screen(X Mouse)-X RY=Y Screen(Y Mouse)-Y If RX>0 and RY>0 Ellipse X,Y,RX,RY Ellipse X,Y,RX,RY End If Wend Gr Writing %0 If RX>0 and RY>0 Ellipse X,Y,RX,RY End If End If '---------- wypeînianie If TRYB=5 X=X Screen(X Mouse) Y=Y Screen(Y Mouse) Paint X,Y End If End Proc Gdy uûytkownik wciônie lewy przycisk myszy, wywoîana zostanie procedura obsîugi zdarzenia (_RYSOWANIE), gdzie w zaleûnoôci od zmiennej TRYB wykonana bëdzie odpowiednia operacja (np. stawiania kropek). Zastanów sië nad tym! No i tyle. Teraz, drogi Czytelniku, odprëû sië. Juû? Spróbuj poskîadaê caîy program do kupy (tak, ûeby dziaîaî). No i w porzâdku? Ôwietnie! Postaraj sië pojâê sposób obsîugiwania zdarzeï. Jeûeli zaîapiesz, o co chodzi w programowaniu zdarzeniowym, gwarantujë Ci, ûe z wiëkszâ îatwoôciâ przyjdzie Ci pisanie uûytków. * I od niebieskich moûna sië czegoô nauczyê. Pecety nie sâ moûe najnowoczeôniejsze, ale niektóre napisane dla nich programy sâ naprawdë ciekawie rozwiâzane.