home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / ma_1995 / 07 / ami45 < prev    next >
Text File  |  1997-04-15  |  7KB  |  171 lines

  1. C dla kaûdego (cz. 3.)
  2. ----------------------
  3.  
  4. OKNO NA SZARY ÔWIAT
  5.  
  6. <a>Kamil Iskra, Dariusz Ûbik
  7.  
  8. <txt>Wykorzystanie portu okna prezentuje listing 5. Uûyliômy w
  9. nim nastëpujâcych, nie opisanych wczeôniej, funkcji:
  10.  
  11. <l>void DisplayBeep( struct Screen *screen );
  12.  
  13. <txt>Zadaniem tej funkcji jest "obudzenie" uûytkownika.  Polega
  14. ono na migniëciu ekranem (jednym lub wszystkimi). Jedyny argument
  15. to wskaúnik na ekran; w wypadku gdy zostanie tam umieszczone
  16. zero, "budzenie" odbëdzie sië na wszystkich ekranach (o ekranach
  17. bëdzie za miesiâc). Od WB 2.1 na dyskach systemowych jest obecny
  18. program, dodajâcy do standardowego "migniëcia" funkcji
  19. DisplayBeep() równieû efekty dúwiëkowe.
  20.  
  21. Jeôli komuô znudzi sië tytuî okna, to powinien skorzystaê z usîug
  22. funkcji Intuition:
  23.  
  24. <l>void SetWindowTitles( struct Window *window, UBYTE *windowTitle, UBYTE *screenTitle );
  25.  
  26. <txt>Funkcja ta ustawia oba tytuîy zwiâzane z oknem. Pierwszym
  27. argumentem jest okno, w którym majâ byê dokonane zmiany. Drugi to
  28. nowy tytuî okna, wyôwietlany na jego listwie tytuîowej
  29. (odpowiednik tagu WA_Title), a trzeci jest tytuîem, który bëdzie
  30. wyôwietlony na listwie ekranu w czasie, gdy okno bëdzie aktywne
  31. (odpowiednik tagu WA_ScreenTitle). Zamiast jednego lub obu
  32. napisów moûna podaê zero, wówczas tytuî zostanie wyczyszczony;
  33. moûliwe jest równieû pozostawienie tytuîu bez zmian, naleûy wtedy
  34. podaê zamiast napisu wartoôê -1 (zrzutowanâ na typ "wskaúnik na
  35. znak", a wiëc "STRPTR" bâdú "char*").
  36.  
  37. Do komunikacji z uûytkownikiem istnieje kilka funkcji, zaczniemy
  38. od tej, która wîaôciwie jest juû zapomniana:
  39.  
  40. <l>BOOL DisplayAlert( unsigned long alertNumber, UBYTE *string, unsigned long height );
  41.  
  42. <txt>Funkcja ta produkuje komunikaty typu "Guru Meditation" (OS
  43. 1.3) lub teû "Software Error" dla systemów nowszych. Pierwszy
  44. argument to typ komunikatu -- jego istnienie wynika z
  45. zastosowania funkcji do obwieszczania klësk ûywioîowych przez
  46. system, ale tym nie bëdziemy sië zajmowaê. Z naszego punktu
  47. widzenia pole to wpîywa na kolor ramki (RECOVERY_ALERT -- ramka
  48. bursztynowa, DEADEND_ALERT -- ramka czerwona). Kolejny argument
  49. to napis -- jest to ciekawa kompilacyjka tekstu i kodów
  50. sterujâcych. W pierwszych bajtach sâ zapisane wspóîrzëdne
  51. poczâtku napisu -- dwa bajty na wspóîrzëdnâ x i jeden bajt na
  52. wspóîrzëdnâ y, nastëpnie jest umieszczony sam napis, zakoïczony
  53. standardowo -- znakiem o kodzie '\0'. Jeûeli po tym znaku wystâpi
  54. znak o kodzie róûnym od zera, to oznacza to, ûe dalej jest
  55. kolejny napis w takim samym formacie -- w przeciwnym wypadku
  56. wiëcej napisów nie ma. Wyglâda to moûe zawile, ale nie jest
  57. trudne -- proponujë zajrzeê do przykîadu.
  58.  
  59. Ostatni argument to wysokoôê ramki. Mówiâc szczerze, dîugo
  60. zastanawialiômy sië, czy pisaê o tej funkcji. Jej podstawowâ wadâ
  61. jest to, ûe wyôwietla obraz zawsze w rozdzielczoôci NTSC bâdú
  62. PAL. Ci, którzy majâ podîâczone do Amigi monitory VGA, zobaczâ w
  63. takim wypadku... kaszë (a ponoê niektóre monitory mogâ sië nawet
  64. uszkodziê!). Jednym z atutów tej funkcji w OS 1.3 byîy jej
  65. niewielkie wymagania pamiëciowe -- na wyôwietlenie komunikatu
  66. potrzeba byîo dosîownie kilku kilobajtów. Tymczasem od OS 2.0
  67. wymaga ona raczej powyûej 50 KB RAM! Nie polecamy wiëc jej
  68. uûywania, opisujemy jâ tutaj trochë przez sentyment (mówiâc
  69. krótko: Darek sië uparî).
  70.  
  71. UWAGA: w wypadku uûycia funkcji DisplayAlert() radzimy dbaê o
  72. wspóîrzëdne, poniewaû jeôli tekst wyjdzie poza ramkë, to funkcja
  73. moûe uszkodziê coô w systemie. Do takiego bîëdu czësto prowadzi
  74. nieostroûna zmiana wspóîrzëdnych. Uczulamy: po znaku "\"
  75. umieszcza sië liczbë w kodzie ÓSEMKOWYM, czyli 0..7 (w czasie
  76. pisania tego przykîadu przez wîasnâ gîupotë wpisaîem \28, bo
  77. chciaîem, aby tekst byî dwa razy niûej niû górna linia. Cóû,
  78. spotkaîo mnie Guru, choê na mojej Amidze juû sië tak nie nazywa).
  79.  
  80. Przejdúmy teraz do kolejnej funkcji, sîuûâcej do komunikowania
  81. sië z uûytkownikiem. Funkcja ta pojawiîa sië w systemie
  82. operacyjnym 2.0. Sâ dwa sposoby jej przywoîania:
  83.  
  84. <l>LONG EasyRequestArgs( struct Window *window, struct EasyStruct *easyStruct, ULONG *idcmpPtr, APTR args );
  85.  
  86. LONG EasyRequest( struct Window *window, struct EasyStruct *easyStruct, ULONG *idcmpPtr, ... );
  87.  
  88. <txt>Zadaniem tej funkcji jest zapytanie uûytkownika o zdanie,
  89. lub teû przekonanie go do wykonania jakiejô czynnoôci -- robi to
  90. ona przy uûyciu "okna dialogowego", zwanego popularnie
  91. requesterem. Funkcja przekazuje sterowanie do programu w chwili,
  92. gdy zostanie puszczony gadûet, lub w chwili, gdy nastâpi
  93. wydarzenie wskazane przez program.
  94.  
  95. Struktura "EasyRequest" opisuje requester, moûna jâ znaleúê w
  96. pliku "intuition/intuition.h":
  97.  
  98. <l>
  99. struct EasyStruct
  100.  
  101. {
  102.  
  103.    ULONG es_StructSize;
  104.    
  105.    ULONG es_Flags;
  106.    
  107.    UBYTE *es_Title;
  108.    
  109.    UBYTE *es_TextFormat;
  110.    
  111.    UBYTE *es_GadgetFormat;
  112.    
  113. };
  114.  
  115. <txt>Pole "es_StructSize" jest przygotowane na wyrost, to znaczy
  116. twórcy nastawili sië na rozszerzenie tej struktury w przyszîoôci
  117. -- naleûy tam podaê rozmiar uûytej struktury "EasyRequest", czyli
  118. sizeof(struct EasyRequest). Kolejne pole teû jest przygotowane na
  119. "wyrost", to znaczy, ûe jeszcze nie jest ono wykorzystywane (OS
  120. 3.1), i na razie naleûy tam trzymaê zero.
  121.  
  122. W polu "es_Tilte" znajduje sië napis, który ma byê nazwâ okna
  123. requestera.
  124.  
  125. Napis "es_TextFormat" to treôê komunikatu, wyôwietlana wewnâtrz
  126. okna. Mogâ w niej wystâpiê znaki formatujâce, podobne jak w
  127. wypadku funkcji standardowej printf(), wîaônie dlatego funkcja
  128. EasyRequest ma zmiennâ liczbë argumentów -- po prostu naleûy
  129. gdzieô podaê dane do formatowanego napisu (UWAGA: nie sâ
  130. obsîugiwane liczby zmiennoprzecinkowe, a aby wyôwietliê liczbë
  131. caîkowitâ, trzeba uûyê "%ld", a nie "%d"). Napis ten moûe
  132. zawieraê kilka linii, naleûy je oddzieliê znakiem nowej linii
  133. '\n'. Napis jest formatowany do lewej krawëdzi requestera.
  134.  
  135. Moûliwe odpowiedzi naleûy umieôciê w napisie "es_GadgetFormat",
  136. napisy do kolejnych gadûetów oddziela sië pionowymi kreskami '|'.
  137. Napis ten nie moûe byê pusty, musi zawieraê przynajmniej jednâ
  138. odpowiedú.
  139.  
  140. Jednym z argumentów funkcji EasyRequest() jest wskaúnik na okno,
  141. z którym ma byê zwiâzany requester. Podajâc adres okna, wybiera
  142. sië ekran, na którym requester sië ukaûe. W wypadku podania
  143. wartoôci NULL requester ukaûe sië na standardowym ekranie
  144. publicznym. Gdy pole "es_Title" bëdzie równe NULL, nazwa okna
  145. requestera bëdzie taka sama, jak okna podanego w parametrze
  146. "window" bâdú "SystemRequest", gdy i ten parametr bëdzie równy
  147. NULL.
  148.  
  149. Argument "IDCMPptr" to wskaúnik na zmiennâ typu ULONG, w której
  150. sâ przechowywane flagi, opisujâce, jakie wydarzenie ma spowodowaê
  151. automatyczne zamkniëcie requestera (bez klikania na którâkolwiek
  152. z odpowiedzi).
  153.  
  154. Wynikiem funkcji jest liczba typu LONG. Jej wartoôê to numer
  155. wybranej odpowiedzi, które sâ numerowane od lewej do prawej, przy
  156. czym ta znajdujâca sië najbardziej z prawej ma zawsze numer 0 --
  157. jest to odpowiedú negatywna. Najlepiej to zobaczyê: 1, 2, ...,
  158. N-1, 0 (gdzie N jest liczbâ moûliwych odpowiedzi). Funkcja moûe
  159. zwróciê wartoôê równâ -1, gdy nastâpiîo wydarzenie opisane w
  160. parametrze "IDCMPptr".
  161.  
  162. Warto wspomnieê, ûe gdy kilka urzâdzeï logicznych korzysta z
  163. jednej stacji (sprzëtowo), to wîoûenie lub wyjëcie dysku powoduje
  164. kilkakrotne wygenerowanie wiadomoôci IDCMP_DISKINSERTED /
  165. REMOVED. Zapewne przekonali sië o tym Ci z Was, którzy korzystajâ
  166. z "PC0:" bâdú "DS0:" -- listing 5. kaûe wtedy kilkakrotnie oddaê
  167. wyjëty dysk.
  168.  
  169. Na dziô wystarczy, za miesiâc nauczymy sië otwieraê ekrany
  170. samodzielnie.
  171.