DWANAÔCI-E 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. Rafaî Wiosna 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. Miësko 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: wptr:=OpenW(x,y,szer,wys,IDCMP,wflagi,tytul,screen,sflagi,gadgety,taglist=NIL) 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: 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 */ 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: MODULE 'intuition/intuition' 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()): BeginRefresh(wptr) ... tu oôwieûamy nasze bazgroîy ... EndRefresh(wptr,TRUE) 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": IF (msg.class=IDCMP_GADGETDOWN) OR (msg.class=IDCMP_GADGETUP) g:=msg.iaddress gadid:=g.gadgetid 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: IF (msg.class=IDCMP_GADGETDOWN) OR (msg.class=IDCMP_GADGETUP) menuid:=msg.code menu:=menuid AND %11111 opcja:=Shr(menuid AND %11111100000,5) IDCMP_CLOSEWINDOW -- uûytkownik chce zamknâê okienko. * 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. Literatura: AutoDocs -- "intuition.doc", Commodore 1994. Includes -- "intuition/intuition.h", "intuition/gadgetclass.h", "libraries/gadtools.h", Commodore 1994.