home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1997 #3
/
amigamamagazinepolishissue03-1
/
ma_1995
/
08
/
ami040.txt
< prev
next >
Wrap
Text File
|
1997-04-07
|
7KB
|
184 lines
DWANAÔCI-E
<lead>Trudno uwierzyê, ûe to juû rok sië E-dukujecie. Nie
zaîamujcie sië, kurs E nie bëdzie trwaî w nieskoïczonoôê. Myôlë,
ûe 24. odcinka nie doczekamy.
<a>Rafaî Wiosna
<txt>Juû tradycyjnie proponujë zapodaê sobie jakiô muzak. Moduîy
zawarte na pîytce Aminet 6 jakoô nie rzuciîy mnie na nogi,
dlatego teû polecam tym razem muzykë z taômy: album "Dummy"
kapeli Portishead. Jest to muzyka typowo wisielcza, wprawiajâca w
nastrój samobójczy, czyli odpowiedni do nastroju naszego kâcika
E. Niemniej niektóre kawaîki sâ odjazdowe i zdecydowanie polecam
caîâ pîytkë, nie tylko na pogrzeby i rozwody.
<sr>Miësko
<txt>Jak juû wspomniaîem miesiâc temu, w tym odcinku kursu
zaczynam omawianie wbudowanych w E procedur wspóîpracy z
systemem. Na poczâtek pójdzie blok odpowiadajâcy za dostëp do
intuition.library. Przedtem jednak maîa dygresja. Otóû poniûsze
procedury nie umoûliwiajâ peînej kontroli nad systemem. Taka np.
OpenW(), która otwiera okienko, nie pozwoli na okreôlenie
wielkoôci okna zmniejszonego gadûetem "zoom" (po lewej od gadûetu
odpowiadajâcego za poîoûenie okna wzglëdem innych). Korzystanie z
wbudowanych do E funkcji intuicyjnych jest dozwolone, jednak gdy
bëdziesz pisaî duûy program, wykorzystujâcy w duûej mierze
procedury systemowe, powinieneô korzystaê z procedur, zawartych w
Kickstarcie.
Pierwszâ procedurâ "intuicyjnâ" w E jest otworzenie okna. Robi
sië to tak:
<l>wptr:=OpenW(x,y,szer,wys,IDCMP,wflagi,tytul,screen,sflagi,gadgety,taglist=NIL)
<txt>Procedura zwraca wskaúnik do otworzonego okna lub NIL,
jeûeli operacja nie byîa moûliwa.
Parametry "x" i "y" to, jak moûna sië domyôliê, poîoûenie górnego
lewego rogu okna na ekranie. Oczywiste sâ teû "szer" i "wys" --
szerokoôê i wysokoôê okna. Zabawa zaczyna sië z parametrem
"IDCMP". Okreôla on, które wiadomoôci o zdarzeniach systemowych
(IntuiMessage) ma otrzymywaê aplikacja. Zdarzenia to m.in.
ruchy myszy, wciôniëcie gadûetu. Program otrzymuje wiadomoôci
poprzez swój port, tworzony zawsze przez system przy uruchamianiu
programu. Jak odczytywaê te wiadomoôci -- napiszë za chwilë.
Strukturë IntuiMesage moûesz obejrzeê, wypisujâc nastëpujâcy
wiersz:
<l>e:bin/showmodule emodules:intuition/intuition
(---) OBJECT intuimessage
( 0) execmessage:substructure
( 20) class:LONG
( 24) code:INT
( 26) qualifier:INT
( 28) iaddress:LONG
( 32) mousex:INT
( 34) mousey:INT
( 36) seconds:LONG
( 40) micros:LONG
( 44) idcmpwindow:LONG
( 48) speciallink:LONG
(---) ENDOBJECT /* SIZEOF=52 */
<txt>NIE WPISUJ TEGO W SWOIM PROGRAMIE! Aby móc skorzystaê z tej
struktury, jak i z opisywanych flag oraz wiadomoôci IDCMP, dopisz
na poczâtku swojego programu:
<l>MODULE 'intuition/intuition'
<txt>Zdarzenie, a dokîadnie jego klasa, przechowywana w polu "class"
struktury "intuimessage", moûe byê nastëpujâce (zamieszczam, mimo tego,
ûe dubluje sië to z opisem C):
IDCMP_NEWSIZE -- wiadomoôê przesyîana po tym, kiedy uûytkownik zmieniî
wielkoôê okna.
IDCMP_REFRESHWINDOW -- wiadomoôê przesyîana wtedy, kiedy
zawartoôê okna trzeba odôwieûyê. Dotyczy okien otwieranych z
flagami WFLG_SIMPLE_REFRESH lub WFLG_SMART_REFRESH. Z tym
odôwieûaniem to jest tak, ûe Intuition odôwieûy za Ciebie
wszystkie gadûety i ramki w oknie, natomiast Twoja dziaîka to
odrysowanie caîej szaty graficznej, którâ tworzy program, np.
wszelkich napisów czy rysunków (funkcje DrawImage(),
PrintIText(), DrawBorder() itd.). Odôwieûanie powinieneô robiê w
takiej klamrze (zmienna "wptr" to wskaúnik do struktury okna
zwracany przez OpenW()):
<l>BeginRefresh(wptr)
... tu oôwieûamy nasze bazgroîy ...
EndRefresh(wptr,TRUE)
<txt>Proszë przeczytaê opis funkcji BeginUpdate() i EndRefresh()
w pliku "intuition.doc" z AutoDocs. Okna WFLG_SMART_REFRESH
wymagajâ odôwieûenia tylko i wyîâcznie wtedy, kiedy uûytkownik
zmieni wielkoôê okna (tak wiëc aplikacja, która otworzy sobie
takie okno, nie otrzyma wiadomoôci IDCMP_REFRESHWINDOW przy
"zwykîych" zniszczeniach -- o odtworzenie okreôlonych regionów
okna zadba system, magazynujâc potrzebne fragmenty okna w pamiëci
Chip). Okien typu WFLG_SUPERBITMAP nie trzeba odôwieûaê.
IDCMP_MOUSEBUTTONS -- przekazuje aplikacji wiadomoôci o
wciôniëciu lub puszczeniu przez uûytkownika któregoô klawisza
myszy. Przekazywane sâ tylko te zdarzenia wymienionego typu,
których nie obsîuguje Intuition, a wiëc na przykîad klikniëcie
nad gadûetem zmiany wielkoôci okna nie zostanie przekazane
aplikacji.
IDCMP_MOUSEMOVE -- przekazuje wiadomoôci o ruchu myszy, ale tylko
wtedy, kiedy okno jest aktywne oraz jeden z gadûetów stworzonych
przez uûytkownika ma ustawionâ flagë GACT_FOLLOWMOUSE.
IDCMP_GADGETDOWN -- informuje aplikacjë, ûe uûytkownik wcisnâî
gadûet. Pojëcie "wciôniëcia" trzeba uôciôliê -- chodzi tu o
naciôniëcie (ale nie puszczenie) lewego klawisza myszy nad
gadûetem. Aby aplikacja otrzymaîa takâ wiadomoôê, gadûet musi
mieê ustawionâ flagë GACT_IMMEDIATE, która informuje Intuition,
ûe aplikacja chce otrzymywaê wiadomoôci omawianego typu zaraz po
tzw. aktywacji gadûetu. Identyfikacjë gadûetu naleûy
przeprowadziê, sprawdzajâc wartoôê pola "gadgetid" w strukturze
zwracanej w polu "iaddress":
<l>IF (msg.class=IDCMP_GADGETDOWN) OR (msg.class=IDCMP_GADGETUP)
g:=msg.iaddress
gadid:=g.gadgetid
<txt>Zmienna "gadid" bëdzie zawieraîa numer wciôniëtego gadûetu
(nadawany przy ich tworzeniu).
IDCMP_GADGETUP -- jak moûna sië domyôliê, oznacza wiadomoôê
wysyîanâ przez Intuition po IDCMP_GADGETDOWN, czyli wtedy, kiedy
uûytkownik puôciî lewy klawisz myszy, a jej wskaúnik znajduje sië
jeszcze nad gadûetem. Aby otrzymaê takâ wiadomoôê, naleûy we
flagach gadûetu ustawiê wartoôê GACT_RELVERIFY. Przy okazji uwaga
-- wspominam o "puszczaniu" gadûetu, klikaniu na nim, ale
przecieû istniejâ typy gadûetów, których uûytkowanie jest
zupeînie inne, np. gadûety do wprowadzania danych (STRING_KIND).
Wiëcej moûna sië dowiedzieê z cyklu, opisujâcego
gadtools.library, który byî u nas drukowany w trzech kolejnych
numerach, poczâwszy od 3/95.
IDCMP_MENUPICK -- uûytkownik wybraî jakiô element menu. Moûna to
odczytaê w nastëpujâcy sposób:
<l>IF (msg.class=IDCMP_GADGETDOWN) OR (msg.class=IDCMP_GADGETUP)
menuid:=msg.code
menu:=menuid AND %11111
opcja:=Shr(menuid AND %11111100000,5)
<txt>IDCMP_CLOSEWINDOW -- uûytkownik chce zamknâê okienko.
<sr>*
<txt>Na tym zakoïczë ten wakacyjny odcinek. Za miesiâc bëdë dalej
meîî sprawy zwiâzane z oknami i Intuition. Poniewaû zaczyna sië
szkoîa, Wy teû przygotujcie sië na wkuwanie wiëkszej iloôci
materiaîu.
<przyp>Literatura: AutoDocs -- "intuition.doc", Commodore 1994.
Includes -- "intuition/intuition.h", "intuition/gadgetclass.h",
"libraries/gadtools.h", Commodore 1994.