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

  1. 14-ôciE
  2.  
  3. <lead>Mam bardzo smutnâ wiadomoôê. To juû przedostatni odcinek
  4. kursu E.
  5.  
  6. <a>Rafaî Wiosna
  7.  
  8. <txt>Mimo smutnej okazji, niech tradycji stanie sië zadoôê.
  9. Wszystkim mëûczynom (lub menszczyznom, jak to sîychaê w reklamie
  10. Gilette) o mocnych nerwach polecam film "Crimson Tide"
  11. ("Karmazynowy przypîyw"). Naprawdë jest znakomity i trzyma w
  12. napiëciu od 5. minuty od rozpoczëcia do 5. minuty przed koïcem.
  13.  
  14. Wracajmy jednak do E. W tym odcinku zakoïczë opisywanie
  15. komunikatów IDCMP, które moûe otrzymaê okno aplikacji. Opis
  16. otwierania ekranów znajdziecie w kursie C, a uûywania gadûetów
  17. znajduje sië w publikowanym niedawno materiale o
  18. gadtools.library. Sprawë GUI i jego obsîugi moûna uwaûaê za
  19. zamkniëtâ.
  20.  
  21. <sr>Ochîapy
  22.  
  23. <txt>Przypominam -- to, co opisuje poniûej naleûy wpisaê jako
  24. piâty argument funkcji OpenW(), która jest funkcjâ wewnëtrznâ E
  25. lub jako argument tagu WA_IDCMP przy otwieraniu okna systemowâ
  26. funkcjâ OpenWindowTagList(). Argumenty te majâ wartoôci binarne,
  27. wiëc moûna je bardzo îatwo îâczyê przez dodawanie.
  28.  
  29. IDCMP_INTUITICKS -- niekiedy bardzo uûyteczna wiadomoôê. Nie
  30. pociâga za sobâ ûadnych argumentów, natomiast przysyîana jest
  31. mniej wiëcej 10 razy na sekundë. Podkreôlam sîowo "mniej wiëcej",
  32. gdyû nie jest to np. przerwanie generowane przez ukîad CIA z
  33. dokîadnoôciâ do milisekund... Intuiticks sâ przydatne, gdy chcesz
  34. coô sprawdzaê albo odôwieûaê w odstëpach czasowych w miarë
  35. staîych. Jeûeli Intuition nie otrzyma odpowiedzi na wysîany
  36. komunikat typu IDCMP_INTUITICKS (tzn. nie odpowiesz na niego
  37. funkcjâ ReplyMsg()), wysyîanie dalszych zostanie wstrzymane.
  38.  
  39. IDCMP_DELTAMOVE -- wiadomoôê podobna do IDCMP_MOUSEMOVE, z tym ûe
  40. system zwraca nie obrobione wartoôci, ôwiadczâce o relatywnym
  41. ruchu myszy. Moûna stosowaê razem z IDCMP_MOUSEMOVE. Wtedy w
  42. odpowiednich polach IntuiMessage bedâ przekazywane relatywne
  43. wartoôci ruchu myszy, a nie poîoûenie kursora wzglëdem lewego
  44. górnego rogu okna. Naleûy pamiëtaê, aby okno miaîo ustawionâ
  45. flagë WFLG_REPORTMOUSE. Oto przykîad uûycia MOUSEMOVE i
  46. DELTAMOVE:
  47.  
  48. <l>^-
  49.  
  50. ->
  51.  
  52. -> Program ilustrujâcy sposób interpretacji danych
  53.  
  54. -> przekazywanych przez wiadomoôci typu
  55.  
  56. -> IDCMP_MOUSEMOVE i IDCMP_DELTAMOVE
  57.  
  58. ->
  59.  
  60. -> ************ (c) RW & Magazyn AMIGA 1995 ************
  61.  
  62.  
  63.  
  64. ENUM    KONIEC,BLAD_OKNO
  65.  
  66.  
  67.  
  68. MODULE    'intuition/intuition','intuition/intuitionbase'
  69.  
  70. MODULE    'intuition/screens','graphics/text'
  71.  
  72.  
  73.  
  74. DEF wnd:PTR TO window,klasa,kod,msx,msy
  75.  
  76.  
  77.  
  78. PROC main() HANDLE
  79.  
  80.  
  81.  
  82.     otworzGUI()
  83.  
  84.  
  85.  
  86.     Colour(1,0)
  87.  
  88.  
  89.  
  90.     REPEAT
  91.  
  92.  
  93.  
  94.         zdarzenie()
  95.  
  96.  
  97.  
  98.         
  99.  
  100.         TextF(30,35,'msg.class: \z\h[8]  msg.code: \h[4]',klasa,kod)
  101.  
  102.         TextF(30,45,'msg.mousex \d[4] msg.mousey \d[4]',msx,msy)
  103.  
  104.  
  105.  
  106.     UNTIL klasa=IDCMP_CLOSEWINDOW
  107.  
  108.  
  109.  
  110. EXCEPT DO
  111.  
  112.  
  113.  
  114.     zamknijGUI()
  115.  
  116.  
  117.  
  118.     IF exception THEN WriteF('Nie mogë \s!\n',
  119.  
  120.         ListItem(['','otworzyê okna'],exception))
  121.  
  122.  
  123.  
  124. ENDPROC
  125.  
  126.  
  127.  
  128. PROC otworzGUI()
  129.  
  130.  
  131.  
  132. /*
  133.  
  134.     Poniûszy fragment zawiîego kodu pozwala na okreôlenie
  135.  
  136.     wysokoôci i szerokoôci domyôlnej czcionki ekranowej.
  137.  
  138.  
  139.  
  140.     Problem w tym, ûe funkcja TextF() wyôwietla teksty uûywajâc
  141.  
  142.     domyôlnej czcionki SYSTEMOWEJ, a nie EKRANOWEJ... Ambitnym
  143.  
  144.     Czytelnikom pozostawiam zmianë sposoby wyôwietlania danych
  145.  
  146.     tak, aby byîo ono realizowane za pomocâ systemowej
  147.  
  148.     funkcji PrintIText().
  149.  
  150.  
  151.  
  152. */
  153.  
  154.  
  155.  
  156.     DEF ourscreen:PTR TO screen, ourdrawinfo:PTR TO drawinfo
  157.  
  158.     DEF txtfont:PTR TO textfont, ibase:PTR TO intuitionbase
  159.  
  160.     DEF deffontwidth, deffontheight, ibaselock
  161.  
  162.  
  163.  
  164.     ibaselock:=LockIBase(NIL)
  165.  
  166.     ibase:=intuitionbase
  167.  
  168.     ourscreen:=ibase.activescreen
  169.  
  170.     ourdrawinfo:=GetScreenDrawInfo(ourscreen)
  171.  
  172.     txtfont:=ourdrawinfo.font
  173.  
  174.     deffontwidth:=txtfont.xsize
  175.  
  176.     deffontheight:=txtfont.ysize
  177.  
  178.     FreeScreenDrawInfo(ourscreen,ourdrawinfo)
  179.  
  180.     UnlockIBase(ibaselock)
  181.  
  182.  
  183.  
  184.     IF (wnd:=OpenW(10,15,60*deffontwidth,10*deffontheight,
  185.  
  186.         IDCMP_CLOSEWINDOW+IDCMP_MOUSEMOVE
  187.  
  188. ->        +IDCMP_DELTAMOVE -> spróbuj usunâê tâ linië
  189.  
  190.         ,WFLG_DRAGBAR+WFLG_DEPTHGADGET+
  191.  
  192.         WFLG_CLOSEGADGET+WFLG_ACTIVATE+
  193.  
  194.         WFLG_REPORTMOUSE,
  195.  
  196.         'Ruchy myszki jak na dîoni',
  197.  
  198.         NIL,1,NIL))=NIL THEN Raise(BLAD_OKNO)
  199.  
  200.  
  201.  
  202. ENDPROC
  203.  
  204.  
  205.  
  206. PROC zamknijGUI()
  207.  
  208.  
  209.  
  210.     IF wnd THEN CloseWindow(wnd)
  211.  
  212.  
  213.  
  214. ENDPROC
  215.  
  216.  
  217.  
  218.  
  219.  
  220. PROC zdarzenie()
  221.  
  222.  
  223.  
  224. DEF mes:PTR TO intuimessage
  225.  
  226.  
  227.  
  228. REPEAT
  229.  
  230.  
  231.  
  232.     klasa:=0
  233.  
  234.  
  235.  
  236.     IF mes:=GetMsg(wnd.userport)
  237.  
  238.  
  239.  
  240.         klasa:=mes.class
  241.  
  242.         kod:=mes.code
  243.  
  244.         msx:=mes.mousex
  245.  
  246.         msy:=mes.mousey
  247.  
  248.                        
  249.  
  250.         ReplyMsg(mes)
  251.  
  252.  
  253.  
  254.     ELSE
  255.  
  256.  
  257.  
  258.         WaitPort(wnd.userport)
  259.  
  260.  
  261.  
  262.     ENDIF
  263.  
  264.  
  265.  
  266. UNTIL klasa
  267.  
  268.  
  269.  
  270. ENDPROC
  271.  
  272. <txt>IDCMP_NEWPREFS -- takâ wiadomoôê otrzymuje aplikacja, gdy
  273. zmieniâ sië preferencje systemu.
  274.  
  275. IDCMP_ACTIVEWINDOW i IDCMP_INACTIVEWINDOW -- dwa typy wiadomoôci,
  276. informujâce aplikacjë, ûe jej okno zostaîo zaktywizowane
  277. (uûytkownik kliknâî myszâ wewnâtrz obszaru okna) lub
  278. zdeaktywizowane (uûytkownik kliknâî myszâ poza obszarem okna).
  279. Nie myliê z WFLG_WINDOWACTIVE, flagâ okna, nie typem
  280. wiadomoôci!!!
  281.  
  282. IDCMP_DISKINSERTED i IDCMP_DISKREMOVED -- wiadomoôci przekazywane
  283. aplikacji w chwili wîoûenia dyskietki do dowolnej stacji dysków
  284. lub wyjëcia jej. Informacja nie musi dotyczyê wyîâcznie dyskietek
  285. -- moûe to byê równie dobrze jakieô urzâdzenie traktowane przez
  286. system jako tzw. removable media.
  287.  
  288. IDCMP_IDCMPUPDATE -- wiadomoôê sîuûâca do komunikacji z gadûetami
  289. boopsi. Wyûsza szkoîa jazdy.
  290.  
  291. IDCMP_CHANGEWINDOW -- wiadomoôê wysyîana aplikacji w chwili
  292. zmiany wymiarów lub poîoûenia okna. Moûe to zrobiê uûytkownik lub
  293. sam program, uûywajâc funkcji SizeWindow(), MoveWindow(),
  294. ChangeWindowBox() lub ZipWindow().
  295.  
  296. IDCMP_MENUHELP -- bardzo ciekawy typ wiadomoôci. Otrzyma jâ
  297. aplikacja wtedy, gdy uûytkownik naciônie klawisz [Help] podczas
  298. wybierania jakiejô opcji z menu. MENUHELP dziaîa nawet wtedy, gdy
  299. opcja jest niedostëpna (ghosted). Wiadomoôci tego typu bëdâ
  300. wysyîane tylko wtedy, gdy w tagach, przekazywanych funkcji
  301. OpenWindowTagList() znajduje sië tag WA_MenuHelp. (Nie ma
  302. odpowiednika tego taga wôród flag typu WFLG_!)
  303.  
  304. Programista moûe odczytaê, który element menu zostaî "wybrany" w
  305. polu code. Jeûeli ûadna opcja nie znajdowaîa sië pod kursorem
  306. myszy, w chwili gdy uûytkownik naciskaî [Help], wartoôê pola code
  307. bëdzie wynosiîa MENUNULL.
  308.  
  309. IDCMP_GADGETHELP -- (nowoôê w systemie V39, czyli 3.0) wiadomoôê
  310. wysyîana wtedy, gdy kursor myszy znajduje sië nad gadûetami. Aby
  311. z tego skorzystaê, naleûy uûyê funkcji HelpControl() w celu
  312. wîâczenia moûliwoôci otrzymywania wiadomoôci typu
  313. IDCMP_GADGETHELP. W jej polu code jest numer gadûetu, nad którym
  314. znajduje sië kursor myszy.
  315.  
  316. To mniej wiëcej wszystkie typy wiadomoôci, które moûe otrzymaê
  317. aplikacja. Zajmijmy sië teraz flagami, którymi okreôla sië
  318. parametry i stan nowo otwieranego okna.
  319.  
  320. <sr>WFLG_
  321.  
  322. <txt>WFLG_SIZEGADGET -- decyduje o obecnoôci gadûetu,
  323. umoûliwiajâcego zmianë rozmiaru okna.
  324.  
  325. WFLG_DRAGBAR -- okno bëdzie miaîo listwë, umoûliwiajâcâ jego
  326. przesuwanie. Jeûeli nie uûyjesz tej flagi, okna nie bëdzie moûna
  327. przesunâê.
  328.  
  329. WFLG_DEPTHGADGET -- gadûet umoûliwiajâcy ustawianie okna wzglëdem
  330. innych.
  331.  
  332. WFLG_CLOSEGADGET -- gadûet umoûliwiajâcy zamkniëcie okna. Jeûeli
  333. nie uûyjesz tej flagi, Twojego okna nie bëdzie moûna zamknâê
  334. (aplikacja nie otrzyma wiadomoôci IDCMP_CLOSEWINDOW nawet, gdy
  335. zaûâdasz, aby jâ przysyîano!).
  336.  
  337. WFLG_SIZEBRIGHT -- okno bëdzie miaîo dodatkowâ listwë po prawej
  338. stronie (np. na suwaki).
  339.  
  340. WFLG_SIZEBBOTTOM -- okno bëdzie miaîo dodatkowâ listwë u doîu
  341. (np.  na suwaki).
  342.  
  343. WFLG_SMART_REFRESH -- flaga dotyczâca odtwarzania zawartoôci
  344. okna, kiedy zmieniâ sië jego parametry, np. wielkoôê. Tym razem
  345. zadba o to system.
  346.  
  347. WFLG_SIMPLE_REFRESH -- j.w., ale o odtwarzanie zawartoôci okna
  348. dba aplikacja.
  349.  
  350. WFLG_SUPER_BITMAP -- j.w., w tym wypadku sysytem magazynuje
  351. zawartoôê okna (która moûe byê wiëksza niû samo okno) w
  352. specjalnym buforze, dziëki czemu odôwieûanie zawartoôci (tak jak
  353. w wypadku WFLG_SMART_REFRESH i WFLG_SIMPLE_REFRESH) jest
  354. wîaôciwie niepotrzebne.
  355.  
  356. Wiëcej o odôwieûaniu okien napisaîem w 12. odcinku cyklu.
  357.  
  358. WFLG_BACKDROP -- okreôla specjalny typ okna. Jest ono otwierane
  359. pod wszystkimi innymi "normalnymi" oknami, ale nad innymi oknami
  360. backdrop. Zwykle ten typ okna okreôla sië jeszcze flagâ
  361. WLFG_BORDERLESS (o tym za chwilë), dziëki temu okno jest
  362. niewidoczne na ekranie. Tym sposobem uzyskuje sië zîudzenie
  363. dziaîania pustego ekranu tak jak okna -- wszak ekrany nie
  364. otrzymujâ wiadomoôci IDCMP... Okno o tych samych rozmiarach co
  365. ekran, bez nazwy i otworzone z flagami
  366. WFLG_BORDERLESS+WFLG_BACKDROP pozwala na zrealizowanie podobnych
  367. rozwiâzaï interfejsu uûytkownika, jak np. w PowerPackerze czy
  368. programach malarskich. Jedynym gadûetem systemowym w tej
  369. sytuacji, którego moûna uûyê, jest gadûet zamkniëcia okna (gadûet
  370. zmiany wielkoôci jest bez sensu, a zmiany gîëbokoôci zasîoni jego
  371. odpowiednik na ekranie).
  372.  
  373. WFLG_REPORTMOUSE -- aplikacja bëdzie otrzymywaîa wiadomoôci typu
  374. IDCMP_MOUSEMOVE i/lub IDCMP_DELTAMOVE.
  375.  
  376. WFLG_GIMMEZEROZERO -- okreôla poîoûenie poczâtku koordynat okna.
  377. W normalnej sytuacji znajduje sië on w lewym górnym rogu ramki
  378. okna. Uûywajâc GZZ moûna go umieôciê w lewym górnym rogu
  379. wewnëtrznego obszaru okna. Poczâtkujâcy programiôci robiâ bîad,
  380. nie uûywajâc tej techniki do lokalizacji gadûetów, tekstów i
  381. innych elementów graficznych. Gdy uûytkownik zmieni wielkoôci
  382. domyôlnych czcionek, czësto sië zdarza, ûe napis "wychodzi" na
  383. ramkë. (Przy okazji: poîoûenia kursora myszy, zwracane przez
  384. wiadomoôci typu IDCMP_MOUSEMOVE, sâ zawsze relatywne do ramki
  385. okna, niezaleûnie od tego, czy uûyto flagi WFLG_GIMMEZEROZERO. W
  386. strukturze otwartego okna znajdujâ sië dwa pola --- gzzmousex i
  387. gzzmousey, które podajâ poîoûenie kursora w stosunku do rogu
  388. obszaru roboczego.)
  389.  
  390. WFLG_BORDERLESS -- okno nie bëdzie miaîo obwódki. Jeûeli chcesz,
  391. ûeby okno nie byîo w ogóle widoczne, nie moûesz uûyê flagi
  392. WFLG_DRAGBAR oraz flag umieszczajâcych w jego ramce gadûety.
  393. Pamiëtaj teû, aby tytuî okna byî pusty.
  394.  
  395. WFLG_ACTIVATE -- okno po otworzeniu bëdzie aktywne (normalnie --
  396. nie zostanie uaktywnione).
  397.  
  398. WFLG_RMBTRAP -- po wciôniëciu prawego przycisku myszy menu nie
  399. zostanie pokazane. Aplikacja powinna sama zadbaê o to, aby dostëp
  400. do menu zostaî zapewniony (np. Deluxe Paint).
  401.  
  402. WFLG_NOCAREREFRESH -- programistë nie obchodzi odôwieûanie okna
  403. (aplikacja nie otrzyma wiadomoôci IDCMP_REFRESHWINDOW).
  404.  
  405. Istniejâ jeszcze inne flagi, ale przeznaczone sâ one dla
  406. zaawansowanych programistów.
  407.  
  408. <sr>*
  409.  
  410. <txt>To juû koniec. Dajë Wam miesiâc na przygotowanie sië do
  411. ostatniego odcinka kursu. W nastëpnym numerze opiszë teû
  412. ôwieûutkâ, nowâ, wersjë E -- 3.2a.
  413.