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

  1. C dla kaûdego (cz. 4.)
  2. ----------------------
  3.  
  4. OTWIERANIE EKRANÓW
  5.  
  6. <lead>Umiecie juû otwieraê okna na ekranie Workbencha (a
  7. wîaôciwie na standardowym ekranie publicznym). Dziô nauczymy Was
  8. otwieraê okna na cudzych ekranach oraz... samemu otwieraê ekrany.
  9.  
  10. <a>Kamil Iskra, Dariusz Ûbik
  11.  
  12. <txt>Wîaôciwie to wypadaîoby zaczâê od tego, czym sië róûni
  13. okno od ekranu, bo, jak zauwaûyliômy, autorzy wielu artykuîów w
  14. polskiej prasie komputerowej po prostu mylâ te dwa pojëcia.
  15.  
  16. Czym jest okno, tîumaczyê chyba nie trzeba. "Takie coô" majâce
  17. zwykle ramkë i kupë gadûetów. Wystarczy zresztâ uruchomiê któryô
  18. z przykîadów z poprzedniej czëôci, aby je zobaczyê.
  19.  
  20. Ekrany sâ zaô jednostkâ nadrzëdnâ w stosunku do okien -- okno
  21. otwiera sië na konkretnym ekranie i nie moûna go za pomocâ myszy
  22. przesunâê na inny. Ekrany obsîuguje sië tylko dwoma gadûetami:
  23. przesuwa w górë/w dóî (sîuûy do tego po prostu listwa tytuîowa)
  24. oraz do przodu/do tyîu. Wszystkie inne gadûety, jakie moûna
  25. zobaczyê, znajdujâ sië w oknach. Ekranów, w przeciwieïstwie do
  26. okien, nie moûna zwykle przesuwaê na boki -- wyjâtkiem sâ te o
  27. szerokoôci innej niû szerokoôê aktualnego trybu wyôwietlania.
  28. Kaûdy ekran ma wîasne, niezaleûne od innych, atrybuty, takie jak
  29. liczba kolorów i ich numery (bo trzeba wiedzieê, ûe kolory sâ
  30. numerowane), a takûe szerokoôê, wysokoôê i tryb wyôwietlania (tj.
  31. czëstotliwoôê odchylania pionowego/poziomego, przeplot itp.).
  32. Okna otwarte na danym ekranie dziedziczâ jego atrybuty, tzn. majâ
  33. takie same kolory jak ekran, sâ wyôwietlane w takiej samej
  34. rozdzielczoôci itp.
  35.  
  36. No, chyba wystarczy tego sadzenia banaîów. Ci, którzy jeszcze
  37. majâ wâtpliwoôci, czym sië jedno od drugiego róûni, niech sobie
  38. poczytajâ instrukcjë do Amigi. Tam jest to nieúle opisane i
  39. pokazane na obrazkach.
  40.  
  41. Zacznijmy moûe od otwierania naszych okien na cudzych ekranach.
  42. Przede wszystkim, nie na kaûdym ekranie moûna okno otworzyê -- do
  43. tego celu sîuûâ ekrany publiczne (ang. public screens). Domyôlnym
  44. ekranem publicznym jest ekran Workbencha. Jeôli chcemy otworzyê
  45. okno na innym ekranie publicznym, to musimy znaê nazwë tego
  46. ekranu. Jest ona zwykle wyôwietlana na listwie tytuîowej okna
  47. bâdú w "About". Przykîady: "CygnusEdScreen1", "DOPUS.1",
  48. "GOLDED.1", "SC_CPR.1". Pisownia maîych i duûych liter JEST
  49. WAÛNA! Najpierw warto sprawdziê, czy ekran publiczny o danej
  50. nazwie istnieje. Sîuûy do tego funkcja:
  51.  
  52. <l>struct Screen *LockPubScreen( UBYTE *name );
  53.  
  54. <txt>Jej parametrem jest wskaúnik na nazwë ekranu, zwraca zaô ona
  55. wskaúnik na strukturë "Screen", opisujâcâ otwarty ekran. Jeûeli
  56. ekran o podanej nazwie nie istnieje, to funkcja zwraca NULL.
  57. Jeûeli jako nazwë podamy NULL, to funkcja zwraca adres domyôlnego
  58. ekranu publicznego. Po uûyciu tej funkcji nie da sië danego
  59. ekranu zamknâê.
  60.  
  61. Jeûeli adres ekranu nie jest nam juû potrzebny, naleûy uûyê
  62. funkcji:
  63.  
  64. <l>void UnlockPubScreen( UBYTE *name, struct Screen *screen );
  65.  
  66. <txt>Jako pierwszy parametr podaje sië zwykle NULL, a jako drugi
  67. wartoôê zwróconâ przez LockPubScreen(). Wywoîanie tej funkcji
  68. umoûliwia póúniej zamkniëcie danego ekranu przez program, który
  69. ekranem zarzâdza.
  70.  
  71. Skoro znamy juû adres ekranu, na którym chcemy otworzyê okno, to
  72. naleûy teraz poinformowaê o tym funkcjë OpenWindowTagList(), która
  73. otworzy nam okno na tym wîaônie ekranie. Sîuûy do tego tag:
  74.  
  75. WA_PubScreen -- jego parametrem jest po prostu adres ekranu
  76. (struktury "Screen").
  77.  
  78. Czas wiëc na maîy przykîadzik, utrwalajâcy zdobytâ wîaônie wiedzë:
  79.  
  80. --------------------tu listing 6.----------------------------
  81.  
  82. Sâdzimy, ûe nie wymaga on dîuûszego komentarza: jeûeli poda sië
  83. przy uruchamianiu parametr w linii argumentowej, to program uzna
  84. ten parametr za nazwë ekranu publicznego i spróbuje otworzyê na
  85. nim okno. Bardziej eleganckie metody podawania parametrów omówimy
  86. w którejô z kolejnych czëôci.
  87.  
  88. Poniewaû nie podaliômy przy otwieraniu okna tagów "WA_Left" oraz
  89. "WA_Width", to system otworzy okno maksymalnej wielkoôci, a wiëc
  90. o szerokoôci ekranu. Tagi "WA_Top" oraz "WA_Height" podaliômy po
  91. to, aby okno nie zasîaniaîo górnej listwy ekranu. Szerokoôê
  92. górnej listwy jest zapisana w strukturze "Screen" -- wynosi ona
  93. BarHeight+1. Nie moûna w to miejsce wstawiê jakiejô staîej
  94. wartoôci, gdyû szerokoôê listwy zaleûy od uûytej czcionki
  95. ekranowej.
  96.  
  97. Istniejâ inne niû tag "WA_PubScreen" metody podawania, na którym
  98. ekranie ma byê otwarte okno:
  99.  
  100. WA_PubScreenName -- parametrem jest wskaúnik na NAZWË ekranu
  101. publicznego, na którym chcemy otworzyê okno.
  102.  
  103. WA_PubScreenFallBack -- uûyty w poîâczeniu z powyûszym powoduje,
  104. ûe jeûeli ekran o danej nazwie nie jest dostëpny, to okno
  105. zostanie otwarte na standardowym ekranie publicznym.
  106.  
  107. WA_CustomScreen -- uûywany, gdy ekran, na którym chcemy otworzyê
  108. okno, nie jest ekranem publicznym (w praktyce oznacza to, ûe
  109. jesteômy wîaôcicielami tego ekranu -- sami go otworzyliômy).
  110. Parametrem tego tagu jest adres ekranu, tak samo jak w tagu
  111. "WA_PubScreen".
  112.  
  113. No, teraz wypadaîoby samemu otworzyê ekran. Sîuûy do tego
  114. funkcja:
  115.  
  116. <l>
  117. struct Screen *OpenScreenTagList( struct NewScreen *newScreen, struct TagItem *tagList );
  118.  
  119. struct Screen *OpenScreenTags( struct NewScreen *newScreen, unsigned long tag1Type, ... );
  120.  
  121. <txt>Znaczenie parametrów jest analogiczne do omówionej w
  122. poprzedniej czëôci funkcji OpenWindowTagList() (tak samo,
  123. istnieje teû stara funkcja OpenScreen() -- bez tagów).
  124. Analogiczna jest równieû zwracana przez funkcjë wartoôê -- jest
  125. niâ wskaúnik na strukturë "Screen" (të samâ, co w
  126. "LockPubScreen()"), bâdú 0, gdy ekran nie moûe byê otwarty (bo
  127. np. nie wystarczyîo pamiëci).
  128.  
  129. Tagów dla funkcji OpenScreenTagList() jest caîa masa,
  130. najwaûniejsze to:
  131.  
  132. SA_Depth -- "gîëbokoôê" ekranu, tzn. liczba bitplanów. Gdyby ktoô
  133. nie wiedziaî: liczbë kolorów oblicza sië jako 2 do potëgi "liczba
  134. bitplanów". Standardowa wartoôê (tj. taka, jaka zostanie
  135. ustawiona, jeûeli ten tag w ogóle nie bëdzie podany) to 1 (2
  136. kolory).
  137.  
  138. SA_Title -- tytuî ekranu, wyôwietlany na listwie tytuîowej (NIE
  139. jest to równoznaczne z nazwâ ekranu publicznego).
  140.  
  141. SA_Type -- typ ekranu -- PUBLICSCREEN, gdy ekran ma byê
  142. publiczny, CUSTOMSCREEN, gdy ma byê prywatny.
  143.  
  144. SA_PubName -- nazwa ekranu publicznego (tag uûywany wtedy, gdy
  145. chcemy, aby ekran byî publiczny).
  146.  
  147. SA_DisplayID -- rozdzielczoôê, w jakiej ma byê wyôwietlany ekran.
  148. Jako parametr podajemy staîe zdefiniowane w pliku
  149. "graphics/modeid.h" lub "graphics/displayinfo.h" (w zaleûnoôci od
  150. posiadanej wersji inkludów). Na przykîad, aby otrzymaê ekran o
  151. czëstotliwoôci odchylania PAL (50 Hz), w wysokiej rozdzielczoôci
  152. i z przeplotem, jako parametr podajemy: PAL_MONITOR_ID |
  153. HIRESLACE_KEY.
  154.  
  155. SA_Pens -- ten wymaga dîuûszego komentarza. Jak wiadomo, ekrany
  156. mogâ mieê róûnâ liczbë kolorów, róûne mogâ teû byê poszczególne
  157. barwy. Barwy, zapisane jako skîadowe R (red -- czerwona), G
  158. (green -- zielona) i B (blue -- niebieska), sâ przyporzâdkowane
  159. numerom od 0 do "iloôê_kolorów-1". Zarówno system, jak i inne
  160. programy, chciaîby wiedzieê, którym z kolorów ma byê narysowana
  161. górna listwa ekranu, którym majâ byê rysowane lewe i górne
  162. krawëdzie gadûetów, a którym prawe i dolne (aby otrzymaê efekt
  163. trójwymiarowoôci), którym kolorem powinny byê rysowane normalne
  164. teksty, a którym teksty o szczególnym znaczeniu itp. To wszystko
  165. ustala wîaônie tag "SA_Pens". Jego parametrem jest adres do
  166. tablicy UWORDów, zawierajâcej informacje o numerach kolorów,
  167. przeznaczonych dla poszczególnych zadaï. Tablica ta powinna byê
  168. zakoïczona numerem ~0, czyli 0xFFFF. W pliku
  169. "intuition/screens.h" znajdujâ sië staîe, informujâce, w których
  170. elementach tablicy powinny byê numery kolorów dla odpowiednich
  171. celów, np. SHADOWPEN ustala, jakim kolorem majâ byê rysowane
  172. "ciemne krawëdzie" trójwymiarowych obiektów. Staîa ta ma wartoôê
  173. 4, co oznacza, ûe numer koloru sîuûâcego do tego celu ma byê
  174. odnotowany w czwartym elemencie tablicy (czyli w piâtym z kolei,
  175. bo pierwszy element tablicy ma w "C" indeks 0). W systemie 2.04
  176. jest 9 takich "penów" (jak to przetîumaczyê?!), w 3.0 doszîy
  177. jeszcze 3, ustalajâce dokîadnie kolory na górnej listwie ekranu.
  178. Nie ma potrzeby podawaê caîej tablicy "penów". Moûna podaê np.
  179. tylko 3 pierwsze (a wiëc DETAILPEN, BLOCKPEN i TEXTPEN -- patrz
  180. "intuition/screens.h"), a zaraz po nich ~0, co spowoduje, ûe
  181. pozostaîe zostanâ ustawione na standardowe wartoôci.
  182.  
  183. I tu nasz maîy apel. Jeûeli nie musicie, nie ustalajcie wîasnych,
  184. niestandardowych wartoôci. Najlepiej juû jako pierwszy element
  185. podaê ~0, co spowoduje, ûe wszystkie "peny" zostanâ ustawione na
  186. standardowe wartoôci. Ma to të zaletë, ûe Wasze programy nie bëdâ
  187. odstawaîy swym wyglâdem od reszty systemu. Jeûeli standardowe
  188. systemowe wartoôci ulegnâ zmianie (tak jak to miaîo miejsce w
  189. wypadku kolorów górnej listwy ekranu pomiëdzy OS 2.04 i OS 3.0),
  190. to przy takim rozwiâzaniu Wasz program dostosuje sië do tego --
  191. uûytkownicy bëdâ Wam wdziëczni. Jeûeli zaleûy Wam na innych
  192. wartoôciach, to powinniôcie mimo wszystko daê uûytkownikowi
  193. moûliwoôê ich zmiany (takâ opcjë ma np. edytor GoldEd, a takûe
  194. sam AmigaOS od wersji 3.0 -- program Palette), bo uûytkownik moûe
  195. chcieê inaczej, i ma do tego prawo! Jednym sîowem, nic na siîë!
  196.  
  197. Otwarty za pomocâ OpenScreenTagList() z uûyciem powyûszych tagów
  198. ekran bëdzie miaî standardowe rozmiary oraz pozycjë. I tu
  199. ponawiamy nasz apel. Nie zmieniajcie tego bez waûnego powodu!
  200. Standardowe wartoôci ustawia sam uûytkownik, za pomocâ
  201. systemowego programu Overscan, i jest naprawdë denerwujâce, gdy
  202. program otwiera ekran 640 x 256, mimo ûe w Overscan jest
  203. ustawione 724 x 283... Jeûeli jednak musicie mieê inny rozmiar,
  204. to uûywa sië do tego tagów "SA_Width" oraz "SA_Height", których
  205. znaczenie jest chyba oczywiste (szerokoôê, wysokoôê). Istniejâ
  206. teû tagi "SA_Left" i "SA_Top", ustalajâce poczâtkowâ pozycjë
  207. ekranu w stosunku do lewego górnego rogu, ustalonego przez
  208. uûytkownika w programie Overscan (standardowo 0, 0). To samo
  209. dotyczy wîaôciwie równieû rozdzielczoôci oraz liczby kolorów: o
  210. tym wszystkim powinien móc decydowaê uûytkownik. Najbardziej
  211. eleganckim rozwiâzaniem jest uûycie ScreenMode-requestera, w
  212. którym uûytkownik moûe sobie podstawowe atrybuty dowolnie
  213. ustaliê. Zostanie to pokazane w którejô z kolejnych czëôci.
  214.  
  215. Ekran ma po otwarciu ustawienie kolorów takie samo, jak ekran
  216. Workbencha.
  217.  
  218. "Ôwieûo otwarty" ekran publiczny nie jest w gruncie rzeczy
  219. publiczny, tzn. jest otwierany w trybie prywatnym. Jest to doôê
  220. sensowne, bo program otwierajâcy ekran publiczny moûe chcieê
  221. najpierw dokonaê jakichô inicjalizacji -- nasz prymitywny
  222. przykîad, rzecz jasna, nic takiego nie bëdzie robiî. Gdy program
  223. chce zezwoliê innym na otwieranie na swym ekranie publicznym
  224. okien, musi zmieniê status tego ekranu, wywoîujâc funkcjë:
  225.  
  226. <l>UWORD PubScreenStatus( struct Screen *screen, unsigned long statusFlags );
  227.  
  228. <txt>Pierwszym parametrem jest, oczywiôcie, ekran, drugim --
  229. status, jaki ma otrzymaê ekran. Na razie istnieje tylko jedna
  230. flaga statusu: PSNF_PRIVATE. Podaje sië jâ, gdy chce sië ekran
  231. uczyniê na powrót prywatnym. Jeûeli chce sië, tak jak my, uczyniê
  232. ekran publicznym, to podaje sië 0. Funkcja zwraca poprzedni
  233. status ekranu. W wypadku, gdy chcemy za pomocâ tej funkcji
  234. uczyniê ekran publiczny na powrót prywatnym, funkcja moûe zwróciê
  235. 0, aby zasygnalizowaê niepowodzenie (spowodowane np. tym, ûe na
  236. ekranie sâ otwarte okna innych programów).
  237.  
  238. Gdy chcemy zamknâê nasz ekran, naleûy uûyê funkcji:
  239.  
  240. <l>BOOL CloseScreen( struct Screen *screen );
  241.  
  242. <txt>Parametrem jest ekran, który ma zostaê zamkniëty. Funkcja
  243. zwraca 0, jeûeli nie udaîo sië zamknâê ekranu. Dzieje sië to
  244. wtedy, gdy na ekranie sâ otwarte jakieô okna (albo uûyty zostaî
  245. LockPubScreen() bez dopeîniajâcego go UnlockPubScreen()).
  246. Wykorzystamy të wîasnoôê w naszym przykîadzie.
  247.  
  248. W przykîadzie uûyjemy jeszcze jednej funkcji systemu
  249. operacyjnego:
  250.  
  251. <l>LONG ModeNotAvailable( unsigned long modeID );
  252.  
  253. <txt>UWAGA! Funkcja ta znajduje sië w bibliotece
  254. "graphics.library", a NIE w Intuition, naleûy wiëc të bibliotekë
  255. najpierw otworzyê. Funkcja sîuûy do sprawdzania, czy podany jej
  256. jako parametr identyfikator trybu wyôwietlania (liczba, którâ
  257. podaje sië jako parametr tagu "SA_DisplayID") jest poprawnym,
  258. dostëpnym na danym komputerze trybem. Zwraca ona 0, jeûeli tryb
  259. moûe byê uûyty; w przeciwnym wypadku zwraca jednâ z wartoôci
  260. zdefiniowanych w pliku "graphics/displayinfo.h" (np.
  261. DI_AVAIL_NOCHIPS oznacza, ûe nie masz odpowiednich koôci
  262. graficznych, niezbëdnych do wyôwietlenia danego trybu, moûe to
  263. spotkaê na przykîad posiadaczy Amig 3000 z OS 3.x, chcâcych
  264. otworzyê ekran w trybie HAM8).
  265.  
  266. Tyle teorii w tym odcinku. W nastëpnym zamieszczë przykîady.
  267.  
  268. <przyp>Tych z Was, którzy sâ niecierpliwi i juû nie mogâ sië
  269. doczekaê na przykîady, zwiâzane z tym odcinkiem kursu, informujë,
  270. ûe moûna je uzyskaê, jeûeli ma sië dostëp do Internetu. Do mojej
  271. strony WWW moûna sië dostaê, zaglâdajâc pod:
  272. http://www.uci.agh.edu.pl/student/infgrp/iskra/public_html/index.html,
  273. a listy do mnie proszë kierowaê pod adresem:
  274. iskra@student.uci.agh.edu.pl.
  275.