home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / ma_1995 / 09 / ami931.txt < prev    next >
Text File  |  1997-04-07  |  8KB  |  186 lines

  1. C dla kaûdego (cz. 4.)
  2. ----------------------
  3.  
  4. OTWIERANIE EKRANÓW
  5.  
  6. <a>Kamil Iskra, Dariusz Ûbik
  7.  
  8. <txt>Bez zbëdnego wstëpu przejdúmy do przykîadu, nawiâzujâcego do
  9. poprzedniego odcinka. Chodzi o listing 7. Program demonstruje
  10. otwarcie ekranu publicznego. Uûytkownik moûe sam wybraê tryb, w
  11. jakim ma byê wyôwietlany ekran, podajâc programowi w linii
  12. argumentowej identyfikator trybu wyôwietlania, czyli odpowiedniâ
  13. liczbë, zdefiniowanâ w pliku "graphics/modeid.h". Liczbë të
  14. program otrzymuje w formie napisu (w argv[1]) -- konwersjâ na
  15. wartoôê liczbowâ zajmie sië za nas standardowa funkcja strtoul(),
  16. która przy uûytych przez nas parametrach akceptuje liczby podane
  17. w trybie szesnastkowym (poprzedzone znakiem 0x bâdú 0X),
  18. ósemkowym (poprzedzone zerem) bâdú dziesiëtnym -- jej dokîadny
  19. opis znajdziesz w Zalecanej Literaturze ("Jëzyk ANSI C"). Jeûeli
  20. uûytkownik nie poda tego parametru, to ekran zostanie otwarty w
  21. trybie hi-res, przy uûyciu standardowego monitora (a wiëc w
  22. wypadku wiëkszoôci Amig w Polsce -- PAL).
  23.  
  24. Program sprawdza, czy podana wartoôê jest sensowna
  25. (ModeNotAvailable()), otwiera ekran (OpenScreenTagList()) i
  26. uaktywnia go (PubScreenStatus()). Nastëpnie czeka na naciôniëcie
  27. [Return] i zamyka ekran.
  28.  
  29. Chcâc sprawdziê, czy program rzeczywiôcie dziaîa tak, jak
  30. powinien, uruchom go, a nastëpnie uruchom listing 6. z parametrem
  31. LISTING7 -- okno powinno sië otworzyê na naszym ekranie z
  32. listingu 7. Warto teû sprawdziê, czy dziaîa otwieranie ekranu w
  33. róûnych rozdzielczoôciach. Uruchom listing 7. tak:
  34.  
  35. <l>Listing7 0x11000
  36.  
  37. <txt>Szybkie spojrzenie do "graphics/modeid.h" i juû wiesz, co to
  38. za tryb: NTSC_MONITOR_ID. Uruchamiamy wiëc, a tu:
  39.  
  40. <l>Podano nieznany identyfikator trybu wyôwietlania!
  41.  
  42. <txt>Czyûby coô byîo nie tak? Nie, wszystko jest w porzâdku! Po
  43. prostu nie moûna uûywaê trybów, których sterowniki nie sâ
  44. uruchomione. Uruchom wiëc program "Storage/Monitors/NTSC" i...
  45. tym razem dziaîa, tzn. ekran wariuje (przynajmniej u mnie -- mój
  46. monitor wyôwietla tylko obraz w trybie PAL).
  47.  
  48. A co sië stanie, gdy sië uruchomi dwa listingi 7 na raz -- np. z
  49. dwóch Shelli?
  50.  
  51. <l>Nie mogë otworzyê ekranu!
  52.  
  53. <txt>Jest to zwiâzane z tym, ûe w systemie nie mogâ istnieê dwa
  54. ekrany publiczne o tej samej nazwie. Z tego wîaônie powodu
  55. wiëkszoôê aplikacji ma na koïcu nazwy ekranu publicznego cyfrë --
  56. normalnie jest to "1", ale gdy uruchomisz kolejne kopie tego
  57. samego programu, to w nazwie bëdzie "2", "3" itd. Moûesz
  58. wprowadziê odpowiednie modyfikacje w listingu 7., aby i on tak
  59. sië zachowywaî -- sugerujemy "wrzuciê" OpenScreenTags() w pëtlë i
  60. stworzyê zmiennâ, zawierajâcâ nazwë ekranu publicznego, która
  61. powinna byê po kaûdym nieudanym OpenScreenTags() modyfikowana --
  62. poprzez zwiëkszanie sië cyferki na jej koïcu. Program powinien
  63. jednak wiedzieê, dlaczego nie udaîo sië otworzyê ekranu. Moûe
  64. wcale nie dlatego, ûe jest juû inny o tej samej nazwie, ale
  65. dlatego, ûe brakuje pamiëci? Przewidzieli to twórcy systemu --
  66. sîuûy do tego tag:
  67.  
  68. SA_ErrorCode -- jego parametrem jest adres zmiennej typu ULONG,
  69. do której zostanie zapisane, dlaczego ekranu nie moûna byîo
  70. otworzyê, np. gdy ekran publiczny o tej nazwie juû istnieje,
  71. zostanie tam odnotowana staîa OSERR_PUBNOTUNIQUE, gdy brakuje
  72. pamiëci -- OSERR_NOMEM bâdú OSERR_NOCHIPMEM. Staîe sâ
  73. zdefiniowane w pliku "intuition/screens.h".
  74.  
  75. Otwarty przez nas ekran bëdzie uûywaî standardowej czcionki
  76. systemowej, ustawionej przez uûytkownika w systemowym programie
  77. Font. Czcionka ta jest zawsze nieproporcjonalna (fixed width),
  78. tzn. szerokoôê wszystkich liter jest taka sama. Istniejâ dwa
  79. tagi kontrolujâce to, jaka czcionka ma zostaê uûyta na ekranie:
  80.  
  81. SA_SysFont -- ustala, która z ustawionych przez uûytkownika w
  82. Font czcionek ma byê uûyta: przy parametrze 0 (wartoôê domyôlna)
  83. uûyta zostanie czcionka systemowa, a przy 1 -- czcionka ekranu
  84. Workbencha (która moûe byê proporcjonalna).
  85.  
  86. SA_Font -- parametrem jest struktura "TextAttr", którâ omówimy za
  87. dwa miesiâce -- specyfikuje ona dokîadnie nazwë i rozmiar
  88. czcionki, która ma zostaê uûyta na ekranie. I znów powtórzë mój
  89. maîy apel (tak, wiem, ûe robië sië nudny, ale bëdë to powtarzaî
  90. tak dîugo, aû wejdzie Wam to w krew!): nie uûywajcie tego tagu
  91. bez waûnego powodu, a jeûeli chcecie go uûyê, to dajcie
  92. uûytkownikowi moûliwoôê wybrania dowolnej czcionki. Szczególnie
  93. denerwujâca jest sytuacja, gdy posiadacz monitora o
  94. rozdzielczoôci 800 x 600 pikseli musi wypatrywaê oczy, bo program
  95. uûywa maciupeïkiej czcionki topaz 8.
  96.  
  97. Powinniôcie jeszcze wiedzieê, w jaki sposób zmienia sië
  98. ustawienie kolorów ekranu (tylko pamiëtajcie o naszym apelu!).
  99. Robi sië to za pomocâ nastëpujâcych funkcji z biblioteki
  100. "graphics.library":
  101.  
  102. <l>void SetRGB4( struct ViewPort *vp, long index, unsigned long red, unsigned long green, unsigned long blue );
  103.  
  104. void SetRGB32( struct ViewPort *vp, unsigned long n, unsigned long r, unsigned long g, unsigned long b );
  105.  
  106. <txt>Pierwsza z nich jest starâ funkcjâ, która umoûliwia
  107. ustawienie kolorów w wypadku palety 12 bitów (po 4 bity na kaûdâ
  108. skîadowâ). Druga funkcja pojawiîa sië razem z nowymi koôêmi
  109. graficznymi w OS 3.0 i jest ona stworzona zdecydowanie na wyrost
  110. -- obsîuguje 96-bitowâ paletë (po 32 bity na kaûdâ skîadowâ).
  111. Rzecz jasna, obecne ukîady graficzne nie majâ takich moûliwoôci,
  112. wiëc parametry sâ "zaokrâglane". Znaczenie parametrów jest
  113. nastëpujâce:
  114.  
  115. vp -- adres struktury "ViewPort", wchodzâcej w skîad struktury
  116. "Screen" -- pole "ViewPort". W strukturze tej sâ zapisane
  117. ustawienia kolorów, tryb wyôwietlania ekranu itp.
  118.  
  119. index, n -- numer koloru, który ma zostaê zmieniony
  120.  
  121. red, green, blue -- (w funkcji SetRGB4()) nowe wartoôci
  122. poszczególnych skîadowych -- od 0 do 15
  123.  
  124. r, g, b -- (w funkcji SetRGB32()) nowe wartoôci poszczególnych
  125. skîadowych -- od 0 (minimum nasycenia) do 0xFFFFFFFF (maksimum
  126. nasycenia).
  127.  
  128. Przydatna jest moûliwoôê otwarcia ekranu o takich samych
  129. atrybutach, jak Workbench, jako ûe atrybuty Workbencha uûytkownik
  130. moûe îatwo dostosowaê do wîasnego "widzimisië". Pomyôleli o tym
  131. twórcy systemu:
  132.  
  133. SA_LikeWorkbench -- powoduje, ûe otwarty ekran bëdzie kopiâ
  134. ekranu Workbencha -- bëdzie miaî jego rozmiar, liczbë kolorów,
  135. tryb wyôwietlania, czcionkë itp.
  136.  
  137. Niestety, twórcy systemu pomyôleli o tym nieco zbyt póúno -- tag
  138. ten jest dostëpny dopiero od OS 3.0. W OS 2.04 trzeba go wiëc
  139. emulowaê. Aby zrobiê to dobrze, musicie poznaê jeszcze trzy
  140. funkcje:
  141.  
  142. <l>struct DrawInfo *GetScreenDrawInfo( struct Screen *screen );
  143.  
  144. <txt>Funkcja zwraca adres struktury "DrawInfo", naleûâcej do
  145. ekranu "screen", bâdú 0, gdy nie moûna tego zrobiê. Struktura
  146. "DrawInfo" jest zdefiniowana w pliku "intuition/screens.h" -- nas
  147. interesuje w niej pole "dri_Pens", bëdâce wskaúnikiem na tablicë
  148. "penów" oraz "dri_Depth", zawierajâce informacjë o liczbie
  149. kolorów na ekranie. Gdy struktura "DrawInfo" nie jest nam juû
  150. dîuûej potrzebna, naleûy uûyê funkcji:
  151.  
  152. <l>void FreeScreenDrawInfo( struct Screen *screen, struct DrawInfo *drawInfo );
  153.  
  154. <txt>Trzecia funkcja jest zawarta w "graphics.library":
  155.  
  156. <l>LONG GetVPModeID( struct ViewPort *vp );
  157.  
  158. <txt>Zwraca ona tryb wyôwietlania danego ViewPortu (patrz wyûej --
  159. opis SetRGB4()) bâdú INVALID_ID, gdy nie moûe tego zrobiê.
  160.  
  161. SA_AutoScroll -- jeûeli parametrem jest TRUE i szerokoôê/wysokoôê
  162. ekranu jest na tyle duûa, ûe niecaîy ekran moûemy na raz
  163. zobaczyê, to po przesuniëciu myszy do krawëdzi ekranu bëdzie on
  164. przewijany (moûna to najlepiej zrozumieê, eksperymentujâc w
  165. systemowym programie ScreenMode z opcjâ AUTOSCROLL oraz
  166. szerokoôciâ i wysokoôciâ ekranu).
  167.  
  168. Czas wiëc przetestowaê to wszystko -- patrz listing 8. Gdy
  169. program wykryje obecnoôê systemu 3.0 bâdú nowszego, to idzie na
  170. îatwiznë i po prostu uûywa tagu "WA_LikeWorkbench". W wypadku
  171. systemu 2.x pobiera informacje o "penach" i liczbie kolorów
  172. (GetScreenDrawInfo()) oraz trybie wyôwietlania (GetVPModeID()),
  173. pozostaîe zaô informacje bierze po prostu ze struktury "Screen"
  174. ekranu Workbencha. Gdy ekran ma wîâczony AutoScroll, to w polu
  175. "Flags" struktury "Screen" jest ustawiona flaga AUTOSCROLL.
  176.  
  177. Na dziô wystarczy. W nastëpnej czëôci trochë sobie porysujemy po
  178. okienkach.
  179.  
  180. <przyp>Przypominam, ûe mojâ stronë WWW moûna obejrzeê w
  181. Internecie pod adresem:
  182.  
  183. http://www.uci.agh.edu.pl/student/infgrp/iskra/public_html/index.htm.
  184. Znajdujâ sië tam m.in. listing z kursu. Wszelkie e-maile proszë
  185. kierowaê pod adresem: iskra@student.uci.agh.edu.pl.
  186.