home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / ma_1995 / 03 / ami030.txt < prev    next >
Text File  |  1997-04-06  |  9KB  |  552 lines

  1. -------------Fragmenty w >...< pogrubione---------------------
  2.  
  3.  
  4.  
  5.  
  6. AMOS 
  7. ----
  8.  
  9. MENU I PROGRAM GRAFICZNY
  10.  
  11. <lead>W dzisiejszym odcinku AMOS-a zaprojektujemy wîasny
  12. interfejs uûytkownika (skîadajâcy sië jedynie z rozwijalnego
  13. menu) dla bardzo prostego programu graficznego -- Kreska.
  14.  
  15. <a>Krzysztof Prusik
  16.  
  17. <txt> Dla peceta istnieje sîawny Visual Basic. Oczywiôcie nie
  18. moûe sië on równaê z AMOS-em pod wzglëdem moûliwoôci graficznych,
  19. dúwiëkowych czy muzycznych, ale ma jednâ ciekawâ cechë --
  20. umoûliwia programowanie zdarzeniowe. Polega ono na tym, ûe
  21. najpierw projektuje sië interfejs uûytkownika, tj. menu, okienka
  22. dialogowe, przyciski itp., a nastëpnie pod kaûde z nich podpina
  23. zdarzenia, czyli procedury, które majâ zostaê wykonane. To tyle
  24. na temat teorii. Proste?
  25.  
  26. Visual Basic zmusza koderów do takiego stylu programowania, a my
  27. sami, z wyboru, wykorzystamy të technikë do utworzenia naszej
  28. Kreski. No to zaczynamy od zaprojektowania menu.
  29.  
  30. <sr>Tworzenie menu
  31.  
  32. <txt>
  33. 1. Gîówne operacje (Project)
  34.  
  35. 1.1. Informacja o autorze (About)
  36.  
  37. 1.2. --------------------------------------
  38.  
  39. 1.3. Odczytanie z dysku obrazka IFF (Load Iff)
  40.  
  41. 1.4. Zapis na dysk obrazka IFF (Save Iff)
  42.  
  43. 1.5. --------------------------------------
  44.  
  45. 1.6. Koniec pracy, wyjôcie z programu (Exit)
  46.  
  47.  
  48. 2. Tryb rysowania (Mode)
  49.  
  50. 2.1. Stawianie kropek (Plot)
  51.  
  52. 2.2. Linia îamana (ciâgniëcie myszâ)
  53.  
  54. 2.3. Kreôlenie odcinków (Line)
  55.  
  56. 2.4. Kreôlenie okrëgów (Circle)
  57.  
  58. 2.5. Kreôlenie elips (Ellipse)
  59.  
  60. 2.6. Wypeînianie figur (Fill)
  61.  
  62.  
  63. 3. Wybór koloru rysowania (Color)
  64.  
  65. 3.1. Wziëcie koloru z ekranu (Get Color)
  66.  
  67. 3.2. Kolor 0 (Color 0)
  68.  
  69. 3.3. Kolor 1 (Color 1)
  70.  
  71. 3.4. Kolor 2 (Color 2)
  72.  
  73. itd. (tyle ile kolorów).
  74.  
  75.  
  76. 4. Rozdzielczoôê ekranu (Screen Mode)
  77.  
  78. 4.1. 320 x 256 pikseli -- 32 kolory
  79.  
  80. 4.2. 320 x 512 pikseli -- 32 kolory
  81.  
  82. 4.3. 640 x 256 pikseli -- 16 kolorów
  83.  
  84. 4.4. 640 x 512 pikseli -- 16 kolorów
  85.  
  86. Procedura tworzâca takie menu moûe wyglâdaê np. tak:
  87.  
  88. <l>Procedure _UTWORZENIE_MENU
  89.  
  90.     '------------------------ pasek menu
  91.  
  92.     Menu$(1)=" Gîówne "
  93.  
  94.     Menu$(2)=" Tryb "
  95.  
  96.     Menu$(3)=" Kolor "
  97.  
  98.     Menu$(4)=" Rozdzielczoôê "
  99.  
  100.     '------------------------ submenu Gîówne
  101.  
  102.     Menu$(1,1)=" Informacja "
  103.  
  104.     Menu$(1,2)="------------" : Menu Inactive(1,2)
  105.  
  106.     Menu$(1,3)=" Îaduj IFF  "
  107.  
  108.     Menu$(1,4)=" Zapisz IFF "
  109.  
  110.     Menu$(1,5)="------------" : Menu Inactive(1,5)
  111.  
  112.     Menu$(1,6)=" Koniec     "
  113.  
  114.     '------------------------ submenu Informacja
  115.  
  116.     Menu$(1,1,1)="-------------------"
  117.  
  118.     Menu$(1,1,2)=" Autor:            "
  119.  
  120.     Menu$(1,1,3)=" Krzysztof Prusik  "
  121.  
  122.     Menu$(1,1,4)="-------------------"
  123.  
  124.     Menu$(1,1,5)=" program w AMOS-ie "
  125.  
  126.     Menu$(1,1,6)="-------------------"
  127.  
  128.     '------------------------ submenu Tryb
  129.  
  130.     Menu$(2,1)=" Kropka   "
  131.  
  132.     Menu$(2,2)=" Linia    "
  133.  
  134.     Menu$(2,3)=" Odcinek  "
  135.  
  136.     Menu$(2,4)=" Okrâg    "
  137.  
  138.     Menu$(2,5)=" Elipsa   "
  139.  
  140.     Menu$(2,6)=" Wypeînij "
  141.  
  142.     '------------------------ submenu Kolor
  143.  
  144.     Menu$(3,1)=" Z ekranu " : Menu Inactive(3,1)
  145.  
  146.     For I=0 To Screen Colour-1
  147.  
  148.         Menu$(3,2+I)=" Kolor"+Str$(I)+" "
  149.  
  150.     Next
  151.  
  152.     '------------------------ submenu Rozdzielczoôê
  153.  
  154.     Menu$(4,1)=" 320x256 32 kolory  "
  155.  
  156.     Menu$(4,2)=" 320x512 16 kolorów "
  157.  
  158.     Menu$(4,3)=" 640x256 16 kolorów "
  159.  
  160.     Menu$(4,4)=" 640x512 16 kolorów "
  161.  
  162.     Menu On
  163.  
  164. End Proc
  165.  
  166.  
  167. <txt> Krótki (i bardzo pobieûny) opis instrukcji dotyczâcych
  168. menu:
  169.  
  170. >Menu$(...)=TYTUÎ$< -- ustala nazwë danej pozycji menu.
  171.  
  172. >Menu Inactive(...)< -- sprawia, ûe dana pozycja menu staje sië
  173. nieaktywna (nie moûna jej wybraê).
  174.  
  175. >Menu On< -- uaktywnia wyôwietlanie menu (czyli sprawia, ûe menu
  176. stanie sië widoczne po wciôniëciu prawego przycisku myszy).
  177.  
  178. Przeanalizuj dziaîanie procedury _UTWORZENIE_MENU (zwróê uwagë na
  179. pëtlë >For...Next<), a gdy juû wszystko bëdzie dla Ciebie jasne
  180. aû do przesady -- przeczytaj dalszâ czëôê artykuîu.
  181.  
  182.  
  183. <sr>Obsîuga menu
  184.  
  185. <txt> Majâc juû do dyspozycji przeôliczne, utworzone przez nas,
  186. menu (czyli interfejs uûytkownika), trzeba sië zastanowiê nad
  187. sposobem jego obsîugi. Gîówny program powinien dziaîaê wedîug
  188. nastëpujâcego schematu:
  189.  
  190. 1. Otwarcie ekranu
  191.  
  192. 2. Utworzenie menu
  193.  
  194. 3. Sprawdzenie, czy uûytkownik nie wybraî juû jakiejô opcji z
  195. menu i ewentualne wykonanie procedury obsîugi zdarzenia.
  196.  
  197. 4. Patrz punkt 3.
  198.  
  199. Wydaje sië to proste, wiëc do dzieîa!
  200.  
  201.  
  202. <l>_OTWORZENIE_EKRANU
  203.  
  204. _UTWORZENIE_MENU
  205.  
  206. Do
  207.  
  208.     Multi Wait
  209.  
  210.     If Choice
  211.  
  212.         _OBSLUGA_MENU
  213.  
  214.     End If
  215.  
  216. Loop
  217.  
  218.  
  219. <txt> Objaônienie:
  220.  
  221. >Multi Wait< -- bardzo waûna komenda (niestety, koderzy czësto
  222. zapominajâ o jej istnieniu), która powoduje, ûe w chwili
  223. oczekiwania na zdarzenie, czyli np. wybranie przez uûytkownika
  224. pewnej opcji z menu, program nie zajmuje niepotrzebnie czasu
  225. mikroprocesora, co pozwala na szybsze dziaîanie innych programów
  226. DOS-a, pracujâcych w Multitaskingu.
  227.  
  228. >Choice< -- sprawdza, czy ostanio "ktoô" wybraî jakâô opcjë z
  229. menu (i nie zostaî obsîuûony). Jeûeli tak, zwraca wartoôê >True<
  230. -- prawda (w przeciwnym wypadku >False< -- faîsz).
  231.  
  232. >Choice(1)< -- podaje numer wybranego przez uûytkownika menu (na
  233. pierwszym poziomie).
  234.  
  235. Wszystko jasne? Listingu procedurki _OTWORZENIE_EKRANU nie
  236. zamieszczë, pozostawiajâc Tobie, drogi Czytelniku, wolnâ rëkë
  237. twórcy, _OBSLUGA_MENU zaô moûe wyglâdaê np. tak:
  238.  
  239. <l>Procedure _OBSLUGA_MENU
  240.  
  241.     NR=Choice(1)
  242.  
  243.     If NR=1
  244.  
  245.         MENU_GLOWNE
  246.  
  247.     End If
  248.  
  249.     If NR=2
  250.  
  251.         MENU_TRYB
  252.  
  253.     End If
  254.  
  255.     If NR=3
  256.  
  257.         MENU_KOLOR
  258.  
  259.     End If
  260.  
  261.     If NR=4
  262.  
  263.         MENU_ROZDZIELCZOSC
  264.  
  265.     End If
  266.  
  267. End Proc
  268.  
  269.  
  270. <sr>Zdarzenia
  271.  
  272. <txt> Przypuôêmy, ûe uûytkownik wybraî coô z menu "Gîówne". Jak
  273. je obsîuûymy? Moûe tak:
  274.  
  275. <l>Procedure MENU_GLOWNE
  276.  
  277.     NR=Choice(2)
  278.  
  279.     If NR=3 
  280.  
  281.         Load Iff Fsel$("","Niciewo.IFF","Wybierz plik"),0
  282.  
  283.     End If
  284.  
  285.     If NR=4
  286.  
  287.         Save Iff Fsel$("","Niciewo.IFF","Wybierz plik"),1
  288.  
  289.     End If
  290.  
  291.     If NR=6
  292.  
  293.         Edit
  294.  
  295.     End If
  296.  
  297. End Proc
  298.  
  299. <txt> Pojawiîy sië nowe rozkazy, lecz tym razem pozostawië je
  300. Czytelnikowi do samodzielnego przeanalizowania i zrozumienia
  301. (trzeba siëgnâê po odpowiedniâ literaturë). Na razie trzeba sië
  302. skupiê na samym sposobie obsîugiwania zdarzeï. Otóû w chwili
  303. wciôniëcia przez uûytkownika prawego przycisku myszy i wybrania
  304. przez niego jakiejô opcji z menu "Gîówne" wywoîana zostanie
  305. procedura MENU_GLOWNE, a tam, w zaleûnoôci od wyboru uûytkownika,
  306. wykonana bëdzie odpowiednia komenda.
  307.  
  308. Podobna struktura obsîugi zdarzenia bëdzie dla menu
  309. "Rozdzielczoôê":
  310.  
  311. <l>Procedure MENU_ROZDZIELCZOSC
  312.  
  313.     NR=Choice(2)
  314.  
  315.     If NR=1
  316.  
  317.         Screen Open 0,320,256,32,Lowres
  318.  
  319.     End If
  320.  
  321.     If NR=2
  322.  
  323.         Screen Open 0,320,512,16,Lowres+Laced
  324.  
  325.     End If
  326.  
  327.     If NR=3
  328.  
  329.         Screen Open 0,640,256,16,Hires
  330.  
  331.     End If
  332.  
  333.     If NR=4
  334.  
  335.         Screen Open 0,6400,512,16,Hires+Laced
  336.  
  337.     End If
  338.  
  339. End Proc
  340.  
  341. <txt> Mogîoby sië wydawaê, ûe prawie tak samo bëdâ wyglâdaîy
  342. procedurki MENU_TRYB i MENU_KOLOR, ale czy muszâ? Zmiana trybu
  343. kreôlenia moûe przecieû polegaê jedynie na zdefiniowaniu na nowo
  344. zmiennej TRYB, a zmiana koloru -- na ustaleniu numeru koloru
  345. pisaka. To znaczy:
  346.  
  347. <l>Procedure MENU_TRYB
  348.  
  349.     TRYB=Choice(2)
  350.  
  351. End Proc
  352.  
  353. Procedure MENU_KOLOR
  354.  
  355.     Ink Choice(2)-1
  356.  
  357. End Proc
  358.  
  359.  
  360. <txt> Poniewaû zmienna TRYB bëdzie uûywana równieû wewnâtrz
  361. procedur, trzeba jâ zadeklarowaê jako globalnâ, czyli na poczâtku
  362. programu dostawiê linië:
  363.  
  364. <l>Global TRYB
  365.  
  366. <txt> No dobrze. Zdarzenia mamy obsîuûone doskonale, ale gdzie tu
  367. rysowanie? Hmmm. Rysowanie to takûe zdarzenie, lecz wywoîane
  368. wciôniëciem lewego przycisku myszy. Tak wiëc do gîównej pëtli
  369. >Do...Loop< powinniômy dodaê linië:
  370.  
  371. <l>If Mouse Key=1
  372.  
  373.     _RYSOWANIE
  374.  
  375. End If
  376.  
  377. <txt> Czy teraz juû wszystko jest jasne? Jeszcze nie? Myôlë, ûe
  378. poniûsza procedura dostatecznie rozjaôni wszystkim w gîowach.
  379.  
  380. <l>Procedure _RYSOWANIE
  381.  
  382.     '---------- kropki
  383.  
  384.     If TRYB=1
  385.  
  386.         While Mouse Key=1
  387.  
  388.             X=X Screen(X Mouse)
  389.  
  390.             Y=Y Screen(Y Mouse)
  391.  
  392.             Plot X,Y
  393.  
  394.         Wend
  395.  
  396.     End If
  397.  
  398.     '---------- ciâgniëcie myszâ
  399.  
  400.     If TRYB=2
  401.  
  402.         X2=X Screen(X Mouse)
  403.  
  404.         Y2=Y Screen(Y Mouse)
  405.  
  406.         While Mouse Key=1
  407.  
  408.             X1=X2
  409.  
  410.             Y1=Y2
  411.  
  412.             X2=X Screen(X Mouse)
  413.  
  414.             Y2=Y Screen(Y Mouse)
  415.  
  416.             Line X1,Y1 To X2,Y2
  417.  
  418.         Wend
  419.  
  420.     End If
  421.  
  422.     '---------- odcinek
  423.  
  424.     If TRYB=3
  425.  
  426.         Gr Writing %10
  427.  
  428.         X1=X Screen(X Mouse)
  429.  
  430.         Y1=Y Screen(Y Mouse)
  431.  
  432.         While Mouse Key=1
  433.  
  434.             X2=X Screen(X Mouse)
  435.  
  436.             Y2=Y Screen(Y Mouse)
  437.  
  438.             Line X1,Y1 To X2,Y2
  439.  
  440.             Line X1,Y1 To X2,Y2
  441.  
  442.         Wend
  443.  
  444.         Gr Writing %0
  445.  
  446.         Line X1,Y1 To X2,Y2
  447.  
  448.     End If
  449.  
  450.     '---------- okrâg
  451.  
  452.     If TRYB=4
  453.  
  454.         Gr Writing %10
  455.  
  456.         X=X Screen(X Mouse)
  457.  
  458.         Y=Y Screen(Y Mouse)
  459.  
  460.         While Mouse Key=1
  461.  
  462.             R=X Screen(X Mouse)-X
  463.  
  464.             If R>0
  465.  
  466.                 Circle X,Y,R
  467.  
  468.                 Circle X,Y,R
  469.  
  470.             End If
  471.  
  472.         Wend
  473.  
  474.         Gr Writing %0
  475.  
  476.         If R>0
  477.  
  478.             Circle X,Y,R
  479.  
  480.         End if
  481.  
  482.     End If
  483.  
  484.     '---------- elipsa
  485.  
  486.     If TRYB=4
  487.  
  488.         Gr Writing %10
  489.  
  490.         X=X Screen(X Mouse)
  491.  
  492.         Y=Y Screen(Y Mouse)
  493.  
  494.         While Mouse Key=1
  495.  
  496.             RX=X Screen(X Mouse)-X
  497.  
  498.             RY=Y Screen(Y Mouse)-Y
  499.  
  500.             If RX>0 and RY>0
  501.  
  502.                 Ellipse X,Y,RX,RY
  503.  
  504.                 Ellipse X,Y,RX,RY
  505.  
  506.             End If
  507.  
  508.         Wend
  509.  
  510.         Gr Writing %0
  511.  
  512.         If RX>0 and RY>0
  513.  
  514.             Ellipse X,Y,RX,RY
  515.  
  516.         End If
  517.  
  518.     End If
  519.  
  520.     '---------- wypeînianie
  521.  
  522.     If TRYB=5
  523.  
  524.         X=X Screen(X Mouse)
  525.  
  526.         Y=Y Screen(Y Mouse)
  527.  
  528.         Paint X,Y
  529.  
  530.     End If
  531.  
  532. End Proc
  533.  
  534.  
  535. <txt> Gdy uûytkownik wciônie lewy przycisk myszy, wywoîana
  536. zostanie procedura obsîugi zdarzenia (_RYSOWANIE), gdzie w
  537. zaleûnoôci od zmiennej TRYB wykonana bëdzie odpowiednia operacja
  538. (np. stawiania kropek). Zastanów sië nad tym!
  539.  
  540. No i tyle. Teraz, drogi Czytelniku, odprëû sië. Juû? Spróbuj
  541. poskîadaê caîy program do kupy (tak, ûeby dziaîaî). No i w
  542. porzâdku? Ôwietnie! Postaraj sië pojâê sposób obsîugiwania
  543. zdarzeï. Jeûeli zaîapiesz, o co chodzi w programowaniu
  544. zdarzeniowym, gwarantujë Ci, ûe z wiëkszâ îatwoôciâ przyjdzie Ci
  545. pisanie uûytków.
  546.  
  547. <sr>*
  548.  
  549. <txt> I od niebieskich moûna sië czegoô nauczyê. Pecety nie sâ
  550. moûe najnowoczeôniejsze, ale niektóre napisane dla nich programy
  551. sâ naprawdë ciekawie rozwiâzane.
  552.