home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1997 #3
/
amigamamagazinepolishissue03-1
/
ma_1995
/
03
/
ami030.txt
< prev
next >
Wrap
Text File
|
1997-04-06
|
9KB
|
552 lines
-------------Fragmenty w >...< pogrubione---------------------
AMOS
----
MENU I PROGRAM GRAFICZNY
<lead>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.
<a>Krzysztof Prusik
<txt> 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.
<sr>Tworzenie menu
<txt>
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:
<l>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
<txt> 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.
<sr>Obsîuga menu
<txt> 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!
<l>_OTWORZENIE_EKRANU
_UTWORZENIE_MENU
Do
Multi Wait
If Choice
_OBSLUGA_MENU
End If
Loop
<txt> 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:
<l>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
<sr>Zdarzenia
<txt> Przypuôêmy, ûe uûytkownik wybraî coô z menu "Gîówne". Jak
je obsîuûymy? Moûe tak:
<l>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
<txt> 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ôê":
<l>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
<txt> 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:
<l>Procedure MENU_TRYB
TRYB=Choice(2)
End Proc
Procedure MENU_KOLOR
Ink Choice(2)-1
End Proc
<txt> Poniewaû zmienna TRYB bëdzie uûywana równieû wewnâtrz
procedur, trzeba jâ zadeklarowaê jako globalnâ, czyli na poczâtku
programu dostawiê linië:
<l>Global TRYB
<txt> 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ë:
<l>If Mouse Key=1
_RYSOWANIE
End If
<txt> Czy teraz juû wszystko jest jasne? Jeszcze nie? Myôlë, ûe
poniûsza procedura dostatecznie rozjaôni wszystkim w gîowach.
<l>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
<txt> 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.
<sr>*
<txt> 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.