home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1997 #3
/
amigamamagazinepolishissue03-1
/
ma_1995
/
07
/
ami45
< prev
next >
Wrap
Text File
|
1997-04-15
|
7KB
|
171 lines
C dla kaûdego (cz. 3.)
----------------------
OKNO NA SZARY ÔWIAT
<a>Kamil Iskra, Dariusz Ûbik
<txt>Wykorzystanie portu okna prezentuje listing 5. Uûyliômy w
nim nastëpujâcych, nie opisanych wczeôniej, funkcji:
<l>void DisplayBeep( struct Screen *screen );
<txt>Zadaniem tej funkcji jest "obudzenie" uûytkownika. Polega
ono na migniëciu ekranem (jednym lub wszystkimi). Jedyny argument
to wskaúnik na ekran; w wypadku gdy zostanie tam umieszczone
zero, "budzenie" odbëdzie sië na wszystkich ekranach (o ekranach
bëdzie za miesiâc). Od WB 2.1 na dyskach systemowych jest obecny
program, dodajâcy do standardowego "migniëcia" funkcji
DisplayBeep() równieû efekty dúwiëkowe.
Jeôli komuô znudzi sië tytuî okna, to powinien skorzystaê z usîug
funkcji Intuition:
<l>void SetWindowTitles( struct Window *window, UBYTE *windowTitle, UBYTE *screenTitle );
<txt>Funkcja ta ustawia oba tytuîy zwiâzane z oknem. Pierwszym
argumentem jest okno, w którym majâ byê dokonane zmiany. Drugi to
nowy tytuî okna, wyôwietlany na jego listwie tytuîowej
(odpowiednik tagu WA_Title), a trzeci jest tytuîem, który bëdzie
wyôwietlony na listwie ekranu w czasie, gdy okno bëdzie aktywne
(odpowiednik tagu WA_ScreenTitle). Zamiast jednego lub obu
napisów moûna podaê zero, wówczas tytuî zostanie wyczyszczony;
moûliwe jest równieû pozostawienie tytuîu bez zmian, naleûy wtedy
podaê zamiast napisu wartoôê -1 (zrzutowanâ na typ "wskaúnik na
znak", a wiëc "STRPTR" bâdú "char*").
Do komunikacji z uûytkownikiem istnieje kilka funkcji, zaczniemy
od tej, która wîaôciwie jest juû zapomniana:
<l>BOOL DisplayAlert( unsigned long alertNumber, UBYTE *string, unsigned long height );
<txt>Funkcja ta produkuje komunikaty typu "Guru Meditation" (OS
1.3) lub teû "Software Error" dla systemów nowszych. Pierwszy
argument to typ komunikatu -- jego istnienie wynika z
zastosowania funkcji do obwieszczania klësk ûywioîowych przez
system, ale tym nie bëdziemy sië zajmowaê. Z naszego punktu
widzenia pole to wpîywa na kolor ramki (RECOVERY_ALERT -- ramka
bursztynowa, DEADEND_ALERT -- ramka czerwona). Kolejny argument
to napis -- jest to ciekawa kompilacyjka tekstu i kodów
sterujâcych. W pierwszych bajtach sâ zapisane wspóîrzëdne
poczâtku napisu -- dwa bajty na wspóîrzëdnâ x i jeden bajt na
wspóîrzëdnâ y, nastëpnie jest umieszczony sam napis, zakoïczony
standardowo -- znakiem o kodzie '\0'. Jeûeli po tym znaku wystâpi
znak o kodzie róûnym od zera, to oznacza to, ûe dalej jest
kolejny napis w takim samym formacie -- w przeciwnym wypadku
wiëcej napisów nie ma. Wyglâda to moûe zawile, ale nie jest
trudne -- proponujë zajrzeê do przykîadu.
Ostatni argument to wysokoôê ramki. Mówiâc szczerze, dîugo
zastanawialiômy sië, czy pisaê o tej funkcji. Jej podstawowâ wadâ
jest to, ûe wyôwietla obraz zawsze w rozdzielczoôci NTSC bâdú
PAL. Ci, którzy majâ podîâczone do Amigi monitory VGA, zobaczâ w
takim wypadku... kaszë (a ponoê niektóre monitory mogâ sië nawet
uszkodziê!). Jednym z atutów tej funkcji w OS 1.3 byîy jej
niewielkie wymagania pamiëciowe -- na wyôwietlenie komunikatu
potrzeba byîo dosîownie kilku kilobajtów. Tymczasem od OS 2.0
wymaga ona raczej powyûej 50 KB RAM! Nie polecamy wiëc jej
uûywania, opisujemy jâ tutaj trochë przez sentyment (mówiâc
krótko: Darek sië uparî).
UWAGA: w wypadku uûycia funkcji DisplayAlert() radzimy dbaê o
wspóîrzëdne, poniewaû jeôli tekst wyjdzie poza ramkë, to funkcja
moûe uszkodziê coô w systemie. Do takiego bîëdu czësto prowadzi
nieostroûna zmiana wspóîrzëdnych. Uczulamy: po znaku "\"
umieszcza sië liczbë w kodzie ÓSEMKOWYM, czyli 0..7 (w czasie
pisania tego przykîadu przez wîasnâ gîupotë wpisaîem \28, bo
chciaîem, aby tekst byî dwa razy niûej niû górna linia. Cóû,
spotkaîo mnie Guru, choê na mojej Amidze juû sië tak nie nazywa).
Przejdúmy teraz do kolejnej funkcji, sîuûâcej do komunikowania
sië z uûytkownikiem. Funkcja ta pojawiîa sië w systemie
operacyjnym 2.0. Sâ dwa sposoby jej przywoîania:
<l>LONG EasyRequestArgs( struct Window *window, struct EasyStruct *easyStruct, ULONG *idcmpPtr, APTR args );
LONG EasyRequest( struct Window *window, struct EasyStruct *easyStruct, ULONG *idcmpPtr, ... );
<txt>Zadaniem tej funkcji jest zapytanie uûytkownika o zdanie,
lub teû przekonanie go do wykonania jakiejô czynnoôci -- robi to
ona przy uûyciu "okna dialogowego", zwanego popularnie
requesterem. Funkcja przekazuje sterowanie do programu w chwili,
gdy zostanie puszczony gadûet, lub w chwili, gdy nastâpi
wydarzenie wskazane przez program.
Struktura "EasyRequest" opisuje requester, moûna jâ znaleúê w
pliku "intuition/intuition.h":
<l>
struct EasyStruct
{
ULONG es_StructSize;
ULONG es_Flags;
UBYTE *es_Title;
UBYTE *es_TextFormat;
UBYTE *es_GadgetFormat;
};
<txt>Pole "es_StructSize" jest przygotowane na wyrost, to znaczy
twórcy nastawili sië na rozszerzenie tej struktury w przyszîoôci
-- naleûy tam podaê rozmiar uûytej struktury "EasyRequest", czyli
sizeof(struct EasyRequest). Kolejne pole teû jest przygotowane na
"wyrost", to znaczy, ûe jeszcze nie jest ono wykorzystywane (OS
3.1), i na razie naleûy tam trzymaê zero.
W polu "es_Tilte" znajduje sië napis, który ma byê nazwâ okna
requestera.
Napis "es_TextFormat" to treôê komunikatu, wyôwietlana wewnâtrz
okna. Mogâ w niej wystâpiê znaki formatujâce, podobne jak w
wypadku funkcji standardowej printf(), wîaônie dlatego funkcja
EasyRequest ma zmiennâ liczbë argumentów -- po prostu naleûy
gdzieô podaê dane do formatowanego napisu (UWAGA: nie sâ
obsîugiwane liczby zmiennoprzecinkowe, a aby wyôwietliê liczbë
caîkowitâ, trzeba uûyê "%ld", a nie "%d"). Napis ten moûe
zawieraê kilka linii, naleûy je oddzieliê znakiem nowej linii
'\n'. Napis jest formatowany do lewej krawëdzi requestera.
Moûliwe odpowiedzi naleûy umieôciê w napisie "es_GadgetFormat",
napisy do kolejnych gadûetów oddziela sië pionowymi kreskami '|'.
Napis ten nie moûe byê pusty, musi zawieraê przynajmniej jednâ
odpowiedú.
Jednym z argumentów funkcji EasyRequest() jest wskaúnik na okno,
z którym ma byê zwiâzany requester. Podajâc adres okna, wybiera
sië ekran, na którym requester sië ukaûe. W wypadku podania
wartoôci NULL requester ukaûe sië na standardowym ekranie
publicznym. Gdy pole "es_Title" bëdzie równe NULL, nazwa okna
requestera bëdzie taka sama, jak okna podanego w parametrze
"window" bâdú "SystemRequest", gdy i ten parametr bëdzie równy
NULL.
Argument "IDCMPptr" to wskaúnik na zmiennâ typu ULONG, w której
sâ przechowywane flagi, opisujâce, jakie wydarzenie ma spowodowaê
automatyczne zamkniëcie requestera (bez klikania na którâkolwiek
z odpowiedzi).
Wynikiem funkcji jest liczba typu LONG. Jej wartoôê to numer
wybranej odpowiedzi, które sâ numerowane od lewej do prawej, przy
czym ta znajdujâca sië najbardziej z prawej ma zawsze numer 0 --
jest to odpowiedú negatywna. Najlepiej to zobaczyê: 1, 2, ...,
N-1, 0 (gdzie N jest liczbâ moûliwych odpowiedzi). Funkcja moûe
zwróciê wartoôê równâ -1, gdy nastâpiîo wydarzenie opisane w
parametrze "IDCMPptr".
Warto wspomnieê, ûe gdy kilka urzâdzeï logicznych korzysta z
jednej stacji (sprzëtowo), to wîoûenie lub wyjëcie dysku powoduje
kilkakrotne wygenerowanie wiadomoôci IDCMP_DISKINSERTED /
REMOVED. Zapewne przekonali sië o tym Ci z Was, którzy korzystajâ
z "PC0:" bâdú "DS0:" -- listing 5. kaûe wtedy kilkakrotnie oddaê
wyjëty dysk.
Na dziô wystarczy, za miesiâc nauczymy sië otwieraê ekrany
samodzielnie.