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

  1.  
  2. Gadtools.library (cz. 1.)
  3. -------------------------
  4.  
  5. TRÓJWYMIAROWE GADÛETY
  6.  
  7. <lead>Zapewnie wielokrotnie widziaîeô w programach îadne
  8. trójwymiarowe gadûety. Sâ one utworzone za pomocâ wprowadzonej w
  9. systemie 2.0 biblioteki gadtools. Moûliwoôci tej biblioteki sâ
  10. ogromne. Wystarczy przejrzeê programy w katalogu preferences.
  11. Wiëkszoôê istniejâcych tam gadûetów zostaîa utworzona za jej
  12. pomocâ.
  13.  
  14. <a>Sebastian Koîodziejczyk
  15.  
  16. <txt>Na poczâtku uwaga dotyczâca zamieszczonych przykîadów.
  17. Prawie wszystkie sâ przeznaczone dla KickPascala. Dla innych
  18. pascali program oraz includy mogâ wymagaê niewielkich przeróbek.
  19. Piszâcy w C i asemblerze nie powinni mieê kîopotów z
  20. wykorzystaniem tej biblioteki po zapoznaniu sië z podanymi
  21. informacjami.
  22.  
  23. Instrukcje opisane sâ w nastëpujâcy sposób:
  24.  
  25. <l> wynik:=instrukcja(parametr);
  26.  
  27.    typ        typ       -- typy wyniku i parametrów
  28.  
  29.    d0         rejestr   -- rejestry, w których podajemy parametry
  30.  
  31. <txt>Przedrostek P_ przy typie (dla Pascala) oznacza, ûe jest to
  32. wskaúnik. Np. typ P_XXX jest to wskaúnik do XXX.
  33.  
  34. Przez rejestry procesora, oczywiôcie, nie moûemy przekazaê caîych
  35. struktur tylko wskaúniki do nich. W dalszej czëôci przy opisach
  36. funkcji sîowo "wskaúnik" jest pomijane.
  37.  
  38. Przed utworzeniem gadûetów gadtools musi otrzymaê informacjë o
  39. ekranie, na którym znajduje sië okno. Do tego celu sîuûy funkcja
  40. GetVisualInfo. Zwraca ona strukturë VisualInfo zawierajâcâ
  41. niezbëdne informacje. Struktura ta jest przeznaczona wyîâcznie
  42. dla gadtools i jej zawartoôê nie jest udostëpniona programiôcie
  43. (inkludy nie zawierajâ jej opisu). Zmiennâ, zawierajâcâ wskaúnik
  44. do tej struktury, definiujemy po prostu jako Ptr (APTR).
  45.  
  46. Format instrukcji:
  47.  
  48. <l>VisualInfo:=GetVisualInfo(Screen,  TagList);
  49.  
  50. Ptr                      p_Screen p_TagList
  51.  
  52. d0                       a0       a1
  53.  
  54. <txt>Screen -- struktura Screen, o której informacjë chcemy uzyskaê.
  55. Moûe to byê wskaúnik otrzymany z OpenScreen lub wskaúnik do ekranu
  56. Workbencha.
  57.  
  58. TagList -- tag list. Poniewaû nie istniejâ jeszcze ûadne tagi dla tej
  59. funkcji, wiëc podajemy Nil.
  60.  
  61. Wynik: VisualInfo -- struktura VisualInfo lub Nil, jeûeli wystâpiî bîâd.
  62.  
  63. Gdy VisualInfo nie jest nam juû potrzebna, zwalniamy zajmowanâ przez niâ
  64. pamiëê za pomocâ procedury FreeVisualInfo.
  65.  
  66. Format instrukcji:
  67.  
  68. <l>FreeVisualInfo(VisualInfo);
  69.  
  70.                   Ptr
  71.  
  72.                   a0
  73.  
  74. <txt>VisualInfo -- struktura VisualInfo uzyskana z GetVisualInfo.
  75.  
  76. Wiëkszoôê programów (szczególnie maîych) otwiera okna na ekranie
  77. Workbencha. Jak wiëc uzyskaê wskaúnik do struktury Screen dla
  78. tego ekranu? Jednâ z moûliwoôci jest uûycie funkcji OpenWorkbench
  79. (z intuition.library). Otwiera ona ekran Workbencha zwracajâc
  80. przy okazji potrzebny nam wskaúnik.
  81.  
  82. Uwaga! W inkludach ta funkcja moûe byê zadeklarowana jako
  83. procedura (nie zwraca ûadnej wartoôci), np.: (dla KickPascala).
  84.  
  85. <l>-210: procedure OpenWorkBench;
  86.  
  87. <txt>naleûy wtedy zmieniê powyûszâ linië na:
  88.  
  89. <l>-210: function OpenWorkBench:p_Screen;
  90.  
  91. <txt>Przykîadowe uûycie:
  92.  
  93. <l> program przyklad;
  94.  
  95.   {$incl 'libraries/gadtools.h' }
  96.  
  97.  var
  98.  
  99.   VI:p_VisualInfo;
  100.  
  101.   WBScreen:p_Screen
  102.  
  103.  begin
  104.  
  105.   { otwieramy biblioteki }
  106.  
  107.   OpenLib (IntBase,'intuition.library',0);
  108.  
  109.   OpenLib (GTBase,'gadtools.library',0);
  110.  
  111.  
  112.  
  113.   WBScreen:=OpenWorkBench;
  114.  
  115.   { otwieramy i otrzymujemy strukturë screen Workbench'a }
  116.  
  117.  
  118.  
  119.   VI:=GetVisualInfo(WBScreen); { mamy VisualInfo }
  120.  
  121.  
  122.  
  123.    { ....... }
  124.  
  125.    { kod programu }
  126.  
  127.    { ....... }
  128.  
  129.  
  130.  
  131.   FreeVisualInfo(VI); { zwalniamy VisualInfo }
  132.  
  133.  
  134.  
  135.   { zamykamy biblioteki }
  136.  
  137.   CloseLib (GTBase);
  138.  
  139.   CloseLib (IntBase);  
  140.  
  141.  end.
  142.  
  143.  
  144. <txt>Powyûsza metoda ma wadë. W czasie pomiëdzy wywoîaniem
  145. OpenWorkbench, a GetVisualInfo inny program moûe zamknâê ekran
  146. Workbencha. Jeûeli mamy inkludy w wersji 36. lub wyûszej (dotyczy
  147. to chyba tylko piszâcych w C, E itp.), moûemy skorzystaê z innej,
  148. znacznie lepszej, metody:
  149.  
  150. Od wersji 36. w bibliotece intuition.library istnieje funkcja
  151. LockPubScreen. Zabezpiecza ona public screen o podanej nazwie
  152. przed zamkniëciem (do czasu uûycia UnlockPubScreen), zwracajâc
  153. structurë Screen dla tego ekranu. Wykorzystanie tej funkcji czyni
  154. nie tylko program caîkowicie odpornym na dziaîanie innych
  155. programów (w zakresie zamykania ekranów), ale równieû pozwala
  156. otworzyê okno na dowolnym public screenie. Przykîad (tym razem
  157. dla C z wymienionych wyûej powodów):
  158.  
  159. <l>struct Screen PrgScreen;
  160.  
  161. struct VisualInfo *VI;
  162.  
  163.  
  164.  
  165. PrgScreen=LockPubScreen("Workbench");
  166.  
  167.  
  168.  
  169. if (PrgScreen!=NULL)
  170.  
  171.  {
  172.  
  173.  VI=GetVisualInfo(PrgScreen)
  174.  
  175.  /* .... */
  176.  
  177.  /* Otwarcie okna */
  178.  
  179.  UnlockPubScreen(NULL,PrgScreen);
  180.  
  181.  /* ... */
  182.  
  183.  FreeVisualInfo(VI);
  184.  
  185.  }
  186.  
  187.  
  188. <txt>Jak moûna wywnioskowaê z przykîadu funkcji LockPubScreen,
  189. jako argument podajemy nazwë public screena, który chcemy
  190. zabezpieczyê przed zamkniëciem. W wypadku ekranu Workbencha
  191. bëdzie to, jak w przykîadzie, "Workbench" bâdú NULL (polecam
  192. raczej to drugie). Funkcja zwraca structurë Screen danego ekranu
  193. lub NULL, jeûeli na tym ekranie otworzenie wîasnego okna jest
  194. niemoûliwe. Zabezpieczenie ekranu przed zamkniëciem jest
  195. konieczne do czasu otwarcia wîasnego okna na nim (z tâ chwilâ
  196. zamkniëcie ekranu jest niemoûliwe aû do zamkniëcia okna). Po
  197. otwarciu okna moûna wiëc wywoîaê procedurë UnlockPubScreen, która
  198. zezwoli na ewentualne zamkniëcie ekranu po zakoïczeniu pracy
  199. naszego programu. Jako argumenty podajemy nazwë ekranu (w
  200. przykîadzie NULL) lub jego strukturë Screen (tak jak w
  201. przykîadzie). Jeûeli jako oba argumenty podamy NULL, procedura
  202. nie zadziaîa.
  203.  
  204. Nastëpnym krokiem, po uzyskaniu VisualInfo, bëdzie wywoîanie
  205. funkcji CreateContext. Tworzy ona miejsce, w którym gadtools
  206. przechowuje informacje o gadûetach.
  207.  
  208. Format instrukcji:
  209.  
  210. <l>gad:=CreateContext(glist);
  211.  
  212. P_gadûet           (P_)P_gadûet
  213.  
  214.  d0                a0
  215.  
  216. <txt>glist -- wskaúnik do zmiennej, która bëdzie wskazywaîa
  217. poczâtek listy gadûetów. Funkcja ustawia zmiennâ GList tak, ûe
  218. wskazuje na Contextgadûet -- niewidoczny gadûet, w którym
  219. gadtools bëdzie gromadziîa dane o swoich gadûetach. Jest on
  220. pierwszym gadûetem (nastëpne bëdâ doîâczane do niego), wiëc
  221. zmiennâ të bëdziemy traktowaê jako wskaúnik listy naszych
  222. gadûetów. Wykorzystamy jâ przy otwieraniu okna.
  223.  
  224. Wynik: gad -- context_gadûet lub jeûeli wystâpiî bîâd -- Nil.
  225.  
  226. W praktyce wyglâda to tak:
  227.  
  228. <l> var
  229.  
  230.   gad,glist:p_gadget;
  231.  
  232.   NW:NewWindow;
  233.  
  234.  begin
  235.  
  236.   { ....... }
  237.  
  238.   Gad:=CreateContext(^glist);
  239.  
  240.   if gad<>nil then begin
  241.  
  242.    { tutaj tworzymy inne gadûety 
  243.  
  244.      (wskaúnikiem do pierwszego gadûetu jest glist) }
  245.  
  246.    NW.Firstgadget:=glist;
  247.  
  248.    { ....... }
  249.  
  250.   end;
  251.  
  252.  end.
  253.  
  254. <txt>Przystëpujemy teraz do tworzenia gadûetów. Do tego celu sîuûy
  255. funkcja Creategadûet.
  256.  
  257. <l>Gad:=Creategadget(rodzaj, poprzedni, Newgadget,  TagList);
  258.  
  259. p_gadget            long    P_gadûet   P_Newgadget P_TagList   
  260.  
  261.   d0                 d0        a0         a1         a2
  262.  
  263. <txt>Rodzaj -- typ gadûetu, jaki chcemy utworzyê.
  264.  
  265. Poprzedni -- wskaúnik do poprzedniego gadûetu. Przy pierwszym
  266. wywoîaniu bëdzie to GList (z funkcji CreateContext).
  267.  
  268. Newgadget -- struktura opisujâca gadûet.
  269.  
  270. TagList -- wskaúnik do taglistu. Na razie Nil.
  271.  
  272. Wynik: gad -- utworzony gadûet lub Nil, jeûeli wystâpiî bîâd.
  273.  
  274.  
  275. Struktura Newgadûet
  276.  
  277. <l>Newgadûet=Record
  278.  
  279. gng_LeftEdge,gng_TopEdge:Word;    { pozyjca X,Y gadûetu }
  280.  
  281. gng_Width,gng_Height:Word;    { szerokoôê, wysokoôê }
  282.  
  283. gng_gadgetText:Str;    { nazwa gadûetu (zakoïczona zerem) }
  284.  
  285. gng_TextAttr:p_TextAttr;    { wskaúnik do struktury TextAttr opisujâcej czcionkë, jeûeli standardowa -- Nil }
  286.  
  287. gng_gadgetID:Word;    { identyfikator gadûetu, bëdzie póúniej wpisany do gadûet.gadûetid }
  288.  
  289. gng_Flags:Long;    { flagi decydujâce o sposobie wyôwietlania tekstu w gadûecie }
  290.  
  291. gng_VisualInfo:Ptr;    { wskaúnik do struktury VisualInfo otrzymanej przez GetVisualInfo }
  292.  
  293. gng_UserData:Ptr;    { wskaúnik do danych uûytkownika, bëdzie póúniej wpisany do gadûet.userdata }
  294.  
  295. End;
  296.  
  297. <txt>Uwaga! Mimo ûe jest to moûliwe, nie polecam wpisywania w
  298. pole gng_TextAttr Nil. W wypadku zmiany standardowej czcionki w
  299. preferencjach na wiëkszâ (np. z Topaz 8 na 11) gadûety nie bëdâ
  300. dopasowane do jej rozmiarów. Najprostszym wyjôciem jest
  301. ustawienie tego pola na strukturë TextAttr, zawierajâcâ opis
  302. czcionki, np. topaz 8.
  303.  
  304. Flagi dotyczâce sposobu wyôwietlania tekstu:
  305.  
  306. PLACETEXT_LEFT  -- tekst po lewej stronie
  307.  
  308. PLACETEXT_RIGHT -- po prawej
  309.  
  310. PLACETEXT_ABOVE -- ponad gadûetem
  311.  
  312. PLACETEXT_BELOW -- pod gadûetem
  313.  
  314. PLACETEXT_IN    -- w gadûecie
  315.  
  316. Jeûeli nie zostanie podana ûadna z nich, gadtools przyjmie
  317. wartoôê standardowâ dla danego typu gadûetu.
  318.  
  319. NG_HIGHLABEL    -- "podôwietlenie" tekstu
  320.  
  321. Przykîadowe uûycie Creategadget:
  322.  
  323. <l>var
  324.  
  325.  OKNewgadget:Newgadget;
  326.  
  327.  OKgadget:p_gadget;
  328.  
  329.  
  330.  
  331. begin
  332.  
  333.  { ........ }
  334.  
  335.  OKNewgadget:=Newgadget(10,30,30,12,' OK! ',Nil,1,0,VI,Nil);
  336.  
  337.  OKgadget:=Creategadget(BUTTON_KIND,GList,^OKNewgadûet,Nil);
  338.  
  339.  { ........ }
  340.  
  341. end.
  342.  
  343.  
  344. <txt>Po zamkniëciu okna naleûy zwolniê pamiëê zajmowanâ przez
  345. gadûety. W tym celu wywoîujemy procedurë Freegadûets. Zwalnia ona
  346. pamiëê zajëtâ przez CreateContext oraz Creategadûet.
  347.  
  348. Format instrukcji:
  349.  
  350. <l>Freegadgets (GList);
  351.  
  352.               P_gadget
  353.  
  354.               a0
  355.  
  356. <txt>GList -- lista gadûetów
  357.  
  358. Procedura ta powinna byê wywoîana przed FreeVisualInfo.
  359.  
  360. Na poczâtek zajmijmy sië najprostszym gadûetem -- BUTTON_KIND.
  361. Jest on najczëôciej spotykanym gadûetem -- "OK" , "Use" , "Save"
  362. itp. Wystarczy ustawiê pozycjë, rozmiary i nazwë gadûetu.
  363. Dodatkowo za pomocâ tagów moûna ustawiê:
  364.  
  365. GT_Underscore -- symbol, jaki poprzedza podkreôlonâ literë w nazwie
  366. gadûetu. Na przykîad jeûeli w "Cancel" chcemy podkreôliê "C", wtedy w
  367. tagu podajemy np. '_', a w nazwie "_Cancel". Uwaga -- dziaîa od wersji
  368. 37. biblioteki.
  369.  
  370. GA_Disabled -- jeûeli podamy TRUE (wartoôê róûnâ od 0), gadûet zostanie
  371. wyîâczony. Zostanie pokryty "siateczkâ" i nie bëdzie moûna go wybraê.
  372. Domyôlnie FALSE.
  373.  
  374. GA_Immediate -- jeûeli podamy TRUE, bëdziemy otrzymywaê message,
  375. gdy tylko gadûet zostanie naciôniëty. Domyôlnie FALSE. Uwaga!
  376. Dziaîa od wersji 39.!
  377.  
  378. Przy odbieraniu messages z okna, w którym sâ gadûety gadtools,
  379. funkcje GetMsg i ReplyMsg naleûy zastâpiê funkcjami GetIMsg i
  380. ReplyIMsg (skîadnia taka sama, zmieniono tylko typy parametrów --
  381. zamiast p_Message od razu p_IntuiMessage).
  382.  
  383. W wypadku BUTTON_KIND otrzymujemy tylko IDCMP_gadûETUP (dla systemu
  384. 1.3 gadûETUP) oraz, od wersji 39., gdy zostanie ustawiony tag
  385. GA_Immediate, IDCMP_gadûETDOWN (gadûETDOWN).
  386.  
  387. Naleûy pamiëtaê jeszcze o paru rzeczach:
  388.  
  389. -- Do ustalonych przez nas flag IDCMP naleûy dodaê (or) xxxIDCMP,
  390. gdzie xxx jest typem gadûetu, jakiego uûywamy, np. BUTTONIDCMP,
  391. LISTVIEWIDCMP, MXIDCMP.
  392.  
  393. -- Po utworzeniu gadûetów i otwarciu okna naleûy wywoîaê procedurë
  394. GT_RefreshWindow. Format instrukcji:
  395.  
  396. <l>GT_RefreshWindow (window,    requester);
  397.  
  398.                      p_Window  p_Requester
  399.  
  400.                      a0        a1
  401.  
  402. <txt>Window -- struktura window okna zawierajâcego gadûety gadtools.
  403.  
  404. Requester -- na razie nie uûywany. Zawsze Nil!
  405.  
  406. Jeûeli najpierw otwieramy okno, potem dodajâc gadûety za pomocâ
  407. AddGList, naleûy wywoîaê RefreshGList (z intuition.library), a póúniej
  408. GT_RefreshWindow.
  409.  
  410. To tyle w tym odcinku. Za miesiâc przedstawië m.in. listing w
  411. KickPascalu, przedstawiajâcy przykîad uûycia biblioteki
  412. gadtools.library.
  413.