home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_GEN / GUITLS38.ZIP / GUITOOLS.DOK < prev    next >
Text File  |  1994-02-27  |  94KB  |  2,132 lines

  1.  
  2.  
  3.                                    GUITools
  4.  
  5.                                  Version 38.0
  6.  
  7.                                  SASC-Dokument
  8.  
  9.  ============================================================================
  10.  
  11.                        Feb 1994   Carsten Ziegeler
  12.                                   Augustin-Wibbelt-Str.7
  13.                                   D-33106 Paderborn
  14.                                   Germany
  15.  
  16.  ============================================================================
  17.  
  18.  
  19. Inhalt:
  20. =======
  21.  
  22.   1. Funktionsbeschreibungen
  23.  
  24.   1.1 Funktionsⁿbersicht
  25.   1.2 Screen/Window
  26.   1.3 Fonts
  27.   1.4 GUI-Erstellung
  28.   1.5 GUI-Abfrage
  29.   1.6 GUI-Bearbeitung
  30.   1.7 GUITools-Gadgets
  31.   1.8 Refresh-Funktionen
  32.  
  33.   2. Arbeiten mit GUITools
  34.  
  35.   2.1 Richtlinien
  36.   2.2 Resourcenfreigabe
  37.   2.3 Menⁿ-Erstellung
  38.   2.4 Font-Behandlung
  39.   2.5 Key-Equivalente
  40.   2.6 Resizable-Gadgets
  41.   2.7 GUITools-Gadgets
  42.   2.8 Requester
  43.  
  44.   3. Fehler / Bugs / Probleme
  45.  
  46.   3.1 Probleme bei V37.3
  47.   3.2 Bekannte Fehler
  48.   3.3 Autor
  49.  
  50.  
  51. 1. Funktionsbeschreibung
  52.    =====================
  53.  
  54. 1.1 Funktionsⁿbersicht (V38.0)
  55.     --------------------------
  56.  
  57.       Funktion                Kapitel      Bemerkung
  58.     -----------------------------------------------------------------------
  59.     AllVarsToGad               1.6.6        (V38.0)
  60.     BeginRefresh               1.8.1        (V38.0)
  61.     ClearWindow                1.2.7        (V38.0)
  62.     CloseIntWindow             1.2.5
  63.     CloseIntScreen             1.2.6
  64.     ConvKMsgToGMsg             1.5.5        (V38.0)
  65.     CreateGadget               1.4.5
  66.     CreateGadgetFull           1.4.7
  67.     CreateGadgetFullTag        1.4.7
  68.     CreateGadgetTag            1.4.5
  69.     CreateGadgetText           1.4.6
  70.     CreateGadgetTextTag        1.4.6
  71.     CreateGUIInfo              1.4.1
  72.     CreateGUIInfoTagList       1.4.2        (V38.0)
  73.     CreateGUIInfoTags          1.4.2        (V38.0)
  74.     CreateSpecialGadget        1.7.1        (V38.0)
  75.     CreateSpecialGadgetTag     1.7.1        (V38.0)
  76.     DrawBox                    1.6.13       (V38.0)
  77.     EmptyIntMsgPort            1.5.3
  78.     EndRefresh                 1.8.2        (V38.0)
  79.     FreeGUIInfo                1.4.3
  80.     GadgetStatus               1.6.1
  81.     GadWithKey                 1.5.6        (V38.0)
  82.     GetIntMsg                  1.5.2
  83.     GetOwnFont                 1.3.1
  84.     HandleIntMsg               1.5.4
  85.     MakeMenuEntry              1.4.9
  86.     ModifyGadget               1.6.2
  87.     ModifyGadgetTag            1.6.2
  88.     NewFontAllGadgets          1.6.12       (V38.0)
  89.     NewGadgetFont              1.6.11       (V38.0)
  90.     NewGadgetText              1.6.10       (V38.0)
  91.     OpenIntScreen              1.2.1
  92.     OpenIntScreenTagList       1.2.2        (V38.0)
  93.     OpenIntScreenTags          1.2.2        (V38.0)
  94.     OpenIntWindow              1.2.3
  95.     OpenIntWindowTagList       1.2.4        (V38.0)
  96.     OpenIntWindowTags          1.2.4        (V38.0)
  97.     RedrawGadgets              1.6.8        (V38.0)
  98.     RedrawMenu                 1.6.7        (V38.0)
  99.     RemoveGadgets              1.4.8        (V38.0)
  100.     RemoveMenu                 1.4.10       (V38.0)
  101.     RemOwnFont                 1.3.2
  102.     ResizeGadget               1.6.9        (V38.0)
  103.     SetGUI                     1.4.4
  104.     SetProcessWindow           1.6.15       (V38.0)
  105.     ShowRequester              1.6.14       (V38.0)
  106.     ShowRequesterTag           1.6.14       (V38.0)
  107.     SimpleReq                  1.6.16       (V38.0)
  108.     TopazAttr                  1.3.3
  109.     UpdateEGad                 1.6.3
  110.     UpdateEntryGadgets         1.6.4
  111.     VarToGad                   1.6.5        (V38.0)
  112.     WaitIntMsg                 1.5.1
  113.  
  114.     Bei der Beschreibung der Funktionen werden nur die wichtigsten Para-
  115.     meter erwΣhnt. Die Bedeutung der meisten ergibt sich aus dem Namen.
  116.  
  117.     Steht bei irgendeiner Funktion, Konstanten, Struktur etc. eine Ver-
  118.     sionsnummer mit angegeben, so ist diese erst ab dieser Version im-
  119.     plementiert und darf unter Σlteren Versionen nicht benutzt werden !
  120.     Gegebenenfalls mu▀ Ihr Programm vorher testen, ob die vorhandene
  121.     Version der guitools.library fⁿr Ihre Zwecke ausreicht!
  122.  
  123.     Weitere Beschreibungen, Hilfestellungen und Tips erfahren Sie in dem
  124.     Kapitel "Arbeiten mit GUITools".
  125.  
  126.     Bei den Parametern der Funktion steht in den {}-Klammern das Register,
  127.     in dem der Parameter ⁿbergeben wird. Dieses ist keine C-Notation und
  128.     dient lediglich zur Bekanntgabe der ▄bergaberegister !
  129.  
  130.  
  131. 1.2 Screens / Windows
  132.     -----------------
  133.  
  134. 1.2.1 OpenIntScreen
  135.  
  136.       Es wird versucht einen Screen mit den entsprechenden Angaben zu
  137.       ÷ffnen.
  138.  
  139.       struct Screen *OpenIntScreen(ULONG  id{D0},
  140.                                    WORD   depth{D1},
  141.                                    STRPTR name{A0},
  142.                                    struct TextAttr * font{A1});
  143.  
  144.        id     Screen-Display-ID aus graphics/displayinfo.h oder eine der
  145.               vordefinierten:
  146.  
  147.               hiresPalID  = HIRES_KEY + PAL_MONITOR_ID
  148.               hiresID     = HIRES_KEY + DEFAULT_MONITOR_ID
  149.               loresPalID  = LORES_KEY + PAL_MONITOR_ID
  150.               loresID     = LORES_KEY + DEFAULT_MONITOR_ID
  151.  
  152.        font   NULL fⁿr Default-Font oder eigene TextAttr-Struktur
  153.  
  154.       Intern wird folgende Tag-Liste fⁿr den Screen erzeugt:
  155.  
  156.         SA_Pens      = -1
  157.         SA_Depth     = depth
  158.         SA_DisplayID = id
  159.         SA_Title     = name
  160.         SA_Font      = font
  161.  
  162.  
  163. 1.2.2 OpenIntScreenTags  (V38.0)  / OpenIntScreenTagList  (V38.0)
  164.  
  165.       Es wird versucht einen Screen mit den entsprechenden Angaben zu
  166.       ÷ffnen.
  167.  
  168.       struct Screen *OpenIntScreenTags(ULONG  id{D0},
  169.                                        WORD   depth{D1},
  170.                                        STRPTR name{A0},
  171.                                        struct TextAttr * font{A1},
  172.                                        ULONG  tagitem, tagdata, ...{A2});
  173.  
  174.          oder
  175.  
  176.       struct Screen *OpenIntScreenTagList(ULONG  id{D0},
  177.                                           WORD   depth{D1},
  178.                                           STRPTR name{A0},
  179.                                           struct TextAttr * font{A1},
  180.                                           strcut TagItem  * tags{A2});
  181.  
  182.        id     Screen-Display-ID aus graphics/displayinfo.h oder eine der
  183.               vordefinierten:
  184.  
  185.               hiresPalID  = HIRES_KEY + PAL_MONITOR_ID
  186.               hiresID     = HIRES_KEY + DEFAULT_MONITOR_ID
  187.               loresPalID  = LORES_KEY + PAL_MONITOR_ID
  188.               loresID     = LORES_KEY + DEFAULT_MONITOR_ID
  189.  
  190.        font   NULL fⁿr Default-Font oder eigene TextAttr-Struktur
  191.        tags   Zeiger auf eine eigene Tag-Liste (oder NULL) um den Screen
  192.               noch genauer zu beschreiben.
  193.  
  194.       OpenIntScreenTags/OpenIntScreenTagList erzeugt eine TagListe intern,
  195.       wie bei OpenIntScreen angegeben, und hΣngt an diese, die unter tags
  196.       angegebene.
  197.  
  198.  
  199. 1.2.3 OpenIntWindow
  200.  
  201.       Versucht ein Fenster auf dem angegebenen Screen zu ÷ffnen.
  202.  
  203.       struct Window *OpenIntWindow(WORD   left{D0},
  204.                                    WORD   top{D1},
  205.                                    WORD   width{D2},
  206.                                    WORD   height{D3},
  207.                                    STRPTR name{A0},
  208.                                    ULONG  idcmpFlags{D4},
  209.                                    ULONG  windowFlags{D5},
  210.                                    struct Screen *screen{A1});
  211.  
  212.        width       Breite oder asScreen fⁿr Breite bis zum Screen-Rand
  213.        height      H÷he oder asScreen fⁿr H÷he bis zum Screen-Rand
  214.        screen      Zeiger auf eigenen Screen oder NULL fⁿr PublicScreen.
  215.  
  216.       Intern wird folgende TagListe fⁿr das Window erzeugt:
  217.  
  218.         WA_Title    = name
  219.         WA_ScreenTitle = name
  220.         WA_Left     = left
  221.         WA_Top      = top
  222.         WA_Width    = width   (bzw screen->Width  -left bei asScreen)
  223.         WA_Height   = height  (bzw screen->height -top  bei asScreen)
  224.         WA_IDCMP    = idcmpFlags
  225.         WA_Flags    = windowFlags
  226.  
  227.        Bei eigenem Screen
  228.  
  229.         WA_CustomScreen = screen
  230.  
  231.        Bei NULL fⁿr Screen
  232.  
  233.         WA_PubScreen         = aktueller Public-Screen
  234.         WA_BubScreenFallBack = TRUE
  235.  
  236.  
  237. 1.2.4 OpenIntWindowTags  (V38.0)  / OpenIntWindowTagList  (V38.0)
  238.  
  239.       Versucht ein Fenster auf dem angegebenen Screen zu ÷ffnen.
  240.  
  241.       struct Window *OpenIntWindowTagList(WORD   left{D0},
  242.                                           WORD   top{D1},
  243.                                           WORD   width{D2},
  244.                                           WORD   height{D3},
  245.                                           STRPTR name{A0},
  246.                                           ULONG  idcmpFlags{D4},
  247.                                           ULONG  windowFlags{D5},
  248.                                           struct Screen *screen{A1},
  249.                                           struct TagItem *tags{A2});
  250.  
  251.           oder
  252.  
  253.       struct Window *OpenIntWindowTags(WORD   left{D0},
  254.                                        WORD   top{D1},
  255.                                        WORD   width{D2},
  256.                                        WORD   height{D3},
  257.                                        STRPTR name{A0},
  258.                                        ULONG  idcmpFlags{D4},
  259.                                        ULONG  windowFlags{D5},
  260.                                        struct Screen *screen{A1},
  261.                                        ULONG  tagitem, tagdata,...{A2});
  262.  
  263.        width       Breite oder asScreen fⁿr Breite bis zum Screen-Rand
  264.        height      H÷he oder asScreen fⁿr H÷he bis zum Screen-Rand
  265.        screen      Zeiger auf eigenen Screen oder NULL fⁿr PublicScreen.
  266.        tags        Zeiger auf eine eigene Tag-Liste (oder NULL) um das Window
  267.                    noch genauer zu beschreiben.
  268.  
  269.       Intern wird folgende TagListe fⁿr das Window erzeugt:
  270.  
  271.         WA_Title    = name
  272.         WA_Left     = left
  273.         WA_Top      = top
  274.         WA_Width    = width   (bzw screen->Width  -left bei asScreen)
  275.         WA_Height   = height  (bzw screen->Height -top  bei asScreen)
  276.         WA_IDCMP    = idcmpFlags
  277.         WA_Flags    = windowFlags
  278.  
  279.        Bei eigenem Screen
  280.  
  281.         WA_CustomScreen = screen
  282.  
  283.        Bei NULL fⁿr Screen
  284.  
  285.         WA_PubScreen         = aktueller Public-Screen
  286.         WA_BubScreenFallBack = TRUE
  287.  
  288.       OpenIntWindowTags / OpenIntWindowTagList erzeugt diese TagListe
  289.       intern und hΣngt die unter tags angegebene an diese.
  290.       ACHTUNG: Im Gegensatz zu OpenIntWindows erzeugt OpenIntWindowTags/
  291.                OpenIntWindowTagList NICHT mehr das WA_ScreenTitle-Tag
  292.                mit dem Wert name !
  293.  
  294.  
  295. 1.2.5 CloseIntWindow
  296.  
  297.       Schlie▀t ein Window "sicher". D.h. es werden vorher alle IntuiMsg
  298.       beantwortet.
  299.  
  300.       void CloseIntWindow(struct Window *window{A0});
  301.  
  302.       Ab (V38.0) wird auch noch ⁿberprⁿft, ob fⁿr das Fenster noch eine
  303.       GUIInfo-Struktur besteht und diese wird dann ggf vorher auch noch
  304.       entfernt. Da es auch m÷glich ist, mehrere GUIInfo-Strukturen mit
  305.       verschiedenen OberflΣchen fⁿr ein Window zu erstellen, ⁿberprⁿft
  306.       CloseIntWindow, ob es fⁿr das Window mehrere GUIInfo-Strukturen
  307.       gibt und entfernt alle.
  308.  
  309.  
  310. 1.2.6 CloseIntScreen
  311.  
  312.       Schlie▀t einen Screen "sicher". D.h. es werden vorher alle dort
  313.       noch ge÷ffneten Windows mit Hilfe von CloseIntWindow entfernt.
  314.  
  315.       void CloseIntScreen(struct Screen *screen{A0});
  316.  
  317.       Somit reicht fⁿr Windows die alle auf einem eigenen Screen erzeugt
  318.       wurden am Ende ein Aufruf von CloseIntScreen. Explizite Aufrufe
  319.       von CloseIntWindow kann man sich sparen.
  320.       Ab (V38.0) kann man sich auch die FreeGUIInfo-Aufrufe sparen, da
  321.       diese von CloseIntWindow ebenfalls ausgefⁿhrt werden !
  322.  
  323.  
  324. 1.2.7 ClearWindow  (V38.0)
  325.  
  326.       L÷scht den Window-Inhalt des ⁿber gui->window spezifizierten Windows.
  327.  
  328.       void ClearWindow(struct GUIInfo *gui{A0});
  329.  
  330.  
  331. 1.3 Fonts
  332.     -----
  333.  
  334. 1.3.1 GetOwnFont
  335.  
  336.       Versucht den spezifizierten Font zu ÷ffnen.
  337.  
  338.       struct TextFont *GetOwnFont(STRPTR name{A0},
  339.                                   UWORD  size{D0},
  340.                                   struct TextAttr *font{A1});
  341.  
  342.        font  Zeiger auf eine TextAttr-Struktur, die automatisch von
  343.              GetOwnFont ausgefⁿllt wird oder NULL falls nicht erwⁿnscht
  344.  
  345. 1.3.2 RemOwnFont
  346.  
  347.       Schlie▀t den ⁿber GetOwnFont ge÷ffneten.
  348.  
  349.       void RemOwnFont(struct TextFont *font{A0});
  350.  
  351. 1.3.3 TopazAttr
  352.  
  353.       Liefert einen Zeiger auf eine initialisierte TextAttr-Struktur
  354.       fⁿr den Topaz/8 font.
  355.  
  356.       struct TextAttr *TopazAttr(void);
  357.  
  358.  
  359. 1.4 GUI-Erstellung
  360.     --------------
  361.  
  362. 1.4.1 CreateGUIInfo
  363.  
  364.       Es wird eine GUIInfo-Struktur erstellt und alle wichtigen Felder
  365.       werden automatisch gesetzt.
  366.  
  367.       struct GUIInfo *CreateGUIInfo(struct Window *window{A0},
  368.                                     WORD          maxGads{D0},
  369.                                     WORD          maxMenus{D1});
  370.  
  371.       window   Fⁿr welches Fenster soll das GUI sein
  372.       maxGads  Maximale Anzahl an Gadgets oder noGadgets ( = 0)
  373.       maxMenus Maximale Anzahl an Menⁿs   oder noMenu    ( = 0)
  374.  
  375.       maxGads und maxMenus sind notwendig, da CreateGUIInfo entsprechend
  376.       Speicher anfordert, um z.B. die Gadgets in einem Feld speichern zu
  377.       k÷nnen, um spΣter einfacher darauf zugreifen zu k÷nnen.
  378.       Leider k÷nnen diese Werte spΣter nicht mehr erh÷ht werden, so da▀
  379.       hier genⁿgend gro▀e Zahlen angegeben werden mⁿssen. Geben Sie 0 an,
  380.       so sind Gadgets bzw. Menⁿs fⁿr dieses Window nicht mehr m÷glich.
  381.  
  382.       Die GUIInfo-Struktur sieht folgenderma▀en aus:
  383.  
  384.       struct GUIInfo {
  385.         struct Window *window;         /* read only */
  386.         struct Screen *screen;         /* read only */
  387.         struct TextAttr  font;         /* read/write */
  388.         APTR   visual;                 /* read only */
  389.         struct MsgPort *port;          /* read/write */
  390.         struct Gadget *gadlist;        /* read only */
  391.         struct DrawInfo *drawinfo;     /* read only (V38.0) */
  392.         struct NewGadget newgad;       /* read/write */
  393.         WORD   actgad;                 /* read only  */
  394.         WORD   private0;               /* PRIVATE */
  395.         struct GUIGadList *gadgets;    /* read only */
  396.  
  397.         struct Menu *menus;            /* read only */
  398.         WORD   actmenu;                /* read only */
  399.         WORD   private1;               /* PRIVATE */
  400.         struct GUIMenuList *newMenus;  /* read/write */
  401.  
  402.         struct IntuiMessage im;        /* read only */
  403.         union {
  404.           struct gadmsg  gm;           /* read only */
  405.           struct menumsg mm;           /* read only */
  406.         } im_un;
  407.         ULONG  flags;                  /* read/write */
  408.         union {                        /* read only (V38.0) */
  409.           UWORD cardCode;
  410.           UWORD intCode;
  411.           struct oc {
  412.             UBYTE boolCode;
  413.             char  charCode;
  414.           };
  415.         } mc_un;
  416.  
  417.         WORD   gadNbr;                 /* read only (V38.0) */
  418.         struct TextAttr *menuFont;     /* read/write (V38.0) */
  419.         APTR   vanKeyHook;             /* read/write (V38.0) */
  420.         ULONG  msgClass;               /* read only */
  421.  
  422.         union {
  423.           struct MenuItem *itemAdr;    /* read only (V38.0) */
  424.           struct NewMenu  *menuAdr;    /* read only (V38.0) */
  425.         } ma_un;
  426.       };
  427.  
  428.       Mit "PRIVATE" gekennzeichnete Felder dⁿrfen nicht berⁿhrt werden.
  429.       Die Verwendung dieser Felder kann in spΣteren Versionen anders
  430.       sein !
  431.       Mit "read only" gekennzeichnete Felder dⁿrfen nur ausgelesen
  432.       werden.
  433.       Beachten Sie, da▀ nicht alle Felder in Σlteren Versionen zur Ver-
  434.       fⁿgung stehen. Prⁿfen Sie also vorher die Versionsnummer der
  435.       Library !
  436.  
  437.       Dabei kommen folgende Strukturen innerhalb von GUIInfo vor:
  438.       struct gadmsg {
  439.         WORD   gadID;                    /* read only */
  440.         struct Gadget *gadget;           /* read only */
  441.       };
  442.  
  443.       struct menumsg {
  444.         WORD   menuNum;                  /* read only */
  445.         WORD   itemNum;                  /* read only */
  446.         WORD   subNum;                   /* read only */
  447.        };
  448.  
  449.        struct GUIGadlist {
  450.          struct Gadget *allGadgets[256]; /* read only */
  451.        };
  452.  
  453.        struct GUIMenulist {
  454.          struct NewMenu allMenus[256];   /* read only */
  455.        };
  456.  
  457.       Die Bedeutung der EntrΣge im einzelnen: (Bei den Union-EintrΣgen wird
  458.       jeweils nur der letzte Teil des Namens angegeben)
  459.  
  460.       flags      Hier geben Sie an, wie sich GUITools bei den einzelnen
  461.                  Gadgets und den IntuiMessages verhalten sollen.
  462.                  Voreingestellt sind alle flags gel÷scht ! Sie mⁿssen
  463.                  also von Hand gesetzt werden. Man sollte dieses gleich
  464.                  nach CreateGUIInfo tun. Es ist aber auch erlaubt, die
  465.                  Flags zu verΣndern, damit sie nur auf bestimmte
  466.                  Gadgets greifen.
  467.                  Folgende Flags kennt GUITools:
  468.  
  469.             GFLG_StringNotify        : Beim Erstellen eines String-Gadgets
  470.                                        wird in gtstString ein Zeiger auf
  471.                                        eine String-Variabel angegeben.
  472.                                        GUITools merkt sich diese und spΣter
  473.                                        kann GUITools dann automatisch den
  474.                                        eingegebenen String in Ihre Variable
  475.                                        kopieren.
  476.             GFLG_IntegerNotify       : Funktioniert wie stringNotify, nur da▀
  477.                                        bei GTIN_Number ein Zeiger auf eine
  478.                                        LONG-Variable ⁿbergeben wird.
  479.             GFLG_LinkEntryGads       : VerlΣ▀t der Anwender ein EntryGadget
  480.                                        mit RETURN, so wird automatisch das
  481.                                        nΣchste EntryGadget aktiviert.
  482.                                        Nur beim Erstellen wirksam.
  483.             GFLG_CycleEntryGads      : Wird das letzte EntryGadget verlassen,
  484.                                        so wird wieder das erste aktiviert.
  485.                                        Funktioniert nur mit linkEntryGads.
  486.             GFLG_ActivateFirstEGad   : Aktiviert nach dem Erstellen des
  487.                                        GUI ⁿber SetGUI() automatisch das
  488.                                        erste EntryGadget.
  489.             GFLG_AutoUpdateEGads     : Sobald in einem EntryGadget RETURN
  490.                                        gedrⁿckt wird, wird der entsprechende
  491.                                        Wert in die angegebene Variable kopiert
  492.                                        und steht somit sofort zur Verfⁿgung.
  493.                                        GFLG_AutoUpdateEGads ist nur beim
  494.                                        Abfragen
  495.                                        interessant und funktioniert nur in Zu-
  496.                                        sammenhang mit GFLG_IntegerNotify bzw
  497.                                        GFLG_StringNotify.
  498.             GFLG_CycleNotify         : Beim Erstellen eines Cycle-Gadgets wird
  499.                                        in GTCY_Active die Adresse einer UWORD-
  500.                                        Variable ⁿbergeben. Wird nun das Cycle-
  501.                                        Gadget betΣtigt, wird automatisch der
  502.                                        Status in die Variable kopiert.
  503.             GFLG_MXNotify            : Funktioniert genauso wie GFLG_Cycle-
  504.                                        Notify, nur da▀ in GTMX_Active die
  505.                                        Adresse ⁿbergeben wird.
  506.             GFLG_CheckboxNotify      : Genau wie GFLG_MXNotify, nur wird in
  507.                                        GTCB_Checked die Adresse einer UBYTE-
  508.                                        Variable erwartet.
  509.  
  510.             GFLG_SliderNotify        : (V38.0) Genau wie GFLG_MXNotify, nur
  511.                                        wird in GTSLLevel die Adresse einer
  512.                                        WORD-Variablen geliefert.
  513.             GFLG_ScrollerNotify      : (V38.0) Wie GFLG_SliderNotify, nur in
  514.                                        GTSC_Top wird die Adresse ⁿbergeben.
  515.             GFLG_ListviewNotify      : (V38.0) In GTLV_Selected wird die
  516.                                        Adresse einer UWORD-Variablen ⁿbergeben.
  517.             GFLG_VanillaKeysNotify   : (V38.0) Beim CreateGadget Aufruf wird
  518.                                        geprⁿft, ob fⁿr das Gadget ein Key-Equi-
  519.                                        valent angegeben wurde.
  520.                                        Ist dies der Fall wird dieser gemerkt.
  521.             GFLG_ConvertKeys         : (V38.0) Ist GFLG_VanillaKeysNotify
  522.                                        eingeschaltet, so wird beim Drⁿcken
  523.                                        eines Key-Equivalents automatisch
  524.                                        die IDCMP-Msg umgeΣndert, so als wΣre
  525.                                        das Gadget betΣtigt worden.
  526.                                        Nur wirksam beim Abfragen der Msgs.
  527.             GFLG_NoHandleIntMsgCall  : (V38.0) Unterbindet den automatischen
  528.                                        Aufruf von HandleIntMsg. Nur wirksam
  529.                                        beim Abfragen der Msgs
  530.             GFLG_InternMsgHandling   : (V38.0) Alle IDCMP-Msg, die GUITools
  531.                                        selber auswerten kann, werden nicht mehr
  532.                                        weitergesendet.
  533.                                        Dieses Flag gilt nur beim Erstellen der
  534.                                        Gadgets, so da▀ man bestimmte Gadgets
  535.                                        sozusagen unter den Tisch fallen lassen
  536.                                        kann
  537.             GFLG_LVKeyClearTime      : Setzt den IntuiMessage-Sekunden Eintrag
  538.                                        auf 0, falls das Key-Equivalent fⁿr
  539.                                        dieses LV-Gadget betΣtigt wurde, um
  540.                                        Probleme mit Double-Klicks zu vermeiden.
  541.                                        Gilt nur beim Erstellen. (V38.0)
  542.             GFLG_AllowAllVanillaKeys : (V38.0) Normalerweise k÷nnen nur
  543.                                        Key-Equivalente von GUITools bearbeitet
  544.                                        werden, die Buchstaben sind. Wollen
  545.                                        Sie andere aber auch benutzen, wie z.B.
  546.                                        die Ziffern etc. so gibt SetGUI eine
  547.                                        Fehlermeldung aus. Setzen Sie dieses
  548.                                        Flag, so wird keine Fehlermeldung aus-
  549.                                        gegeben. GUITools aber unterstⁿtzt
  550.                                        trotzdem diese Equivalente NICHT !
  551.                                        Das mu▀ von Hand aus ⁿber GadWithKey
  552.                                        gemacht werden !
  553.             GFLG_AddBorderDims       : (V38.0) Bei CreateGadget wird automatisch
  554.                                        zum left-Eintrag noch window->BorderLeft
  555.                                        und zum top-Eintrag window->BorderTop ad-
  556.                                        diert, so da▀ die Gadgets, egal welchen
  557.                                        Font Sie benutzen, immer im inneren des
  558.                                        Windows liegen.
  559.             GFLG_CallVanillaKeyFct   : (V38.0) Wenn dieses Flag gesetzt ist und
  560.                                        der Benutzer drⁿckt eine Taste, dann
  561.                                        wird die unter vanKeyHook angegeben
  562.                                        Funktion angesprungen.
  563.                                        (s. ConvKMsgToGMsg )
  564.             GFLG_CallMenuData        : (V38.0) Wenn eine IDCMP_MenuPick-Message
  565.                                        vorliegt, ruft HandleIntMsg automatisch
  566.                                        die Funktion auf, die im userData-Feld
  567.                                        angegeben ist.
  568.             GFLG_DoRefresh           : (V38.0) HandleIntMsg ruft automatisch
  569.                                        BeginRefresh und EndRefresh auf, sobald
  570.                                        eine IDCMP_RefreshWindow-Msg vorliegt.
  571.             GFLG_AddStdUnderscore    : (V38.0) Zu der Liste der Tags wird bei
  572.                                        CreateGadget automatisch das Tag
  573.                                        GT_Underscore mit dem Wert '_' hinzu-
  574.                                        gefⁿgt, so da▀ Sie dieses selber nicht
  575.                                        mehr mit angeben mⁿssen.
  576.             GFLG_PaletteNotify       : (V38.0) In GTPA_Color wird die Adresse
  577.                                        einer UWORD-Variable angeliefert.
  578.  
  579.  
  580.       screen     Merker fⁿr GUITools auf den Screen des Windows
  581.       visual     Zeiger auf die VisualInfo-Struktur des Screens
  582.       drawinfo   Zeiger auf eine Kopie der DrawInfo-Struktur des Screens
  583.                  ab (V38.0). Diese Struktur darf nur gelesen werden !
  584.  
  585.       font       Eine TextAttr-Struktur die standartmΣ▀ig mit
  586.                  dem aktuellen im Fenster gesetzten Font ausgefⁿllt
  587.                  wird. Dieser Font wird spΣter fⁿr die Gadgets ver-
  588.                  wendet.
  589.                  Fⁿr einen anderen Font bei Gadgets Σndern Sie ent-
  590.                  weder diese Struktur oder den Eintrag der newgad-
  591.                  Struktur (s.u.).
  592.                  StandardmΣ▀ig zeigt der font-Eintrag der newgad-
  593.                  Struktur auf diese Attr-Struktur.
  594.                  Wenn Sie CreateGUIInfo benutzen, so zeigt auch der
  595.                  menuFont-Zeiger (s.u.) auf diese Struktur, so da▀ Sie
  596.                  beim AbΣndern dieser Struktur auch den Menⁿ-Font mit
  597.                  Σndern !
  598.       menuFont   Zeiger auf eine TextAttr-Struktur, die beim Erstellen der
  599.                  Menⁿs benutzt wird. StandardmΣ▀ig zeigt dieser Eintrag font.
  600.                  Ab (38.0) zeigt dieser Zeiger, wenn Sie CreateGUIInfoTags
  601.                  benutzen auf den Font des Screens.
  602.  
  603.       window     hier merkt sich GUITools den Zeiger auf ihr Window
  604.       port       Zeiger auf den IDCMP-Port, an dem die Msgs ankommen,
  605.                  wird dieser verΣndert, z.B. durch ModifyIDCMP, so
  606.                  mu▀ dieser Eintrag auch mit geΣndert werden !
  607.  
  608.       newgad     NewGadget-Struktur, die zum Erstellen der Gadgets
  609.                  benutzt wird. Sie kann nach belieben verΣndert
  610.                  werden. Die EintrΣge ng_TextAttr und ng_VisualInfo
  611.                  werden automatisch vorgesetzt. Die wichtigsten
  612.                  EintrΣge werden durch die CreateGadget-Prozeduren
  613.                  vorgenommen.
  614.                  Bei textAttr kann ein eigener Font fⁿr die Gadgets
  615.                  angegeben werden. ─ndern Sie einfach den Zeiger auf
  616.                  Ihre eigene TextAttr-Struktur. (s. auch font)
  617.       actgad     EnthΣlt die Gadget-Nummer (0 ist das Erste !) von
  618.                  dem Gadget, das als nΣchstes erstellt wird. Nach
  619.                  SetGUI steht hier die Anzahl der Gadgets!
  620.       gadgets    Ein Zeiger auf ein Feld mit Gadget-Pointer. Jeder
  621.                  Eintrag zeigt auf ein von Ihnen erstelltes Gadget in
  622.                  der Reihenfolge der Erstellung.
  623.                  Das Feld geht von 0 bis actgad-1.
  624.       gadlists   Ein Zeiger auf die von GUITools erstellte Gadget-Liste.
  625.                  Dieser Zeiger darf nur zwischen SetGUI und FreeGUI oder
  626.                  dazu Σhnlichen Funktionen verwendet werden.
  627.                  Damit kann z.B. eine Refresh-Funktion realisiert werden.
  628.  
  629.       actmenu    EnthΣlt die Nummer des Menⁿ-Eintrages, der als nΣchstes
  630.                  erstellt wird.
  631.       newMenus   Zeiger auf ein Feld mit NewMenu-Strukturen. Wollen Sie
  632.                  mehr angeben als ⁿber MakeMenuEntry m÷glich, fⁿhren
  633.                  Sie erst MakeMenuEntry aus und greifen Sie dann ⁿber
  634.                  newmenus^[actmenu-1] auf die NewMenu-Struktur zu und
  635.                  verΣndern Sie entsprechend ! Ab (V38.0) k÷nnen Sie
  636.                  auch menuAdr dafⁿr benutzen.
  637.       menus      Ein Zeiger auf das von SetGUI erstellte Menu.
  638.  
  639.       im         IntuiMessage-Struktur, die bei Aufruf von WaitIntMsg
  640.                  oder GetIntMsg eine Kopie der IntuiMessage enthΣlt.
  641.  
  642.       msgClass   Liefert i.A. eine Kopie von im.Class
  643.                  (siehe HandleIntMsg)
  644.  
  645.       gadID      Liefert bei entsprechenden Msgs die Gadget-ID.
  646.       gadget     Liefert bei entsprechenden Msgs eine Zeiger auf das
  647.                  Event-Gadget.
  648.                  Ab (V38.0) wird nach einem Aufruf von CreateGadget
  649.                  ein Zeiger auf das erstellte Gadget geliefert.
  650.  
  651.       menuNum,   In diesen Feldern werden bei entsprechenden Intui-Msgs
  652.       itemNum,   automatisch die entsprechenden Nummern zur Verfⁿgung
  653.       subNum     gestellt, um eine eigene Umrechnung zu ersparen.
  654.  
  655.       cardCode,  In diesem Feld wird ab (V38.0) i.A. eine Kopie des
  656.       intCode,   im.Code-Feldes abgeliefert.
  657.       boolCode,  ▄ber diesen Eintrag kann man unter UmstΣnden leichter
  658.       charCode   auf die entsprechenden Werte zugreifen.
  659.                  (siehe HandleIntMsg)
  660.  
  661.       gadNbr     liefert ab (V38.0) die Gadget-Nummer innerhalb des gadgets-
  662.                  Feldes, so da▀ man auf das Gadget leichter zugreifen
  663.                  kann, wenn Gadget-ID und Gadget-Nummer nicht ⁿberein-
  664.                  stimmen sollten
  665.       itemAdr    liefert ab (V38.0) einen Zeiger auf die MenuItem-Struktur
  666.                  des Items, das bei IDCMP_MenuPick bzw IDCMP_MenuHelp
  667.                  ausgewΣhlt wurde.
  668.       menuAdr    liefert ab (V38.0) nach einem Aufruf von MakeMenuEntry
  669.                  einen Zeiger auf die soeben erstellte NewMenu-Struktur.
  670.  
  671.  
  672.       vanKeyHook Zeiger ab (V38.0) auf eine Benutzer-Spezifizierte Funktion,
  673.                  zur Auswertung der Key-Equivalente. (s. ConvKMsgToGMsg )
  674.  
  675.       Ab (V38.0) sollte diese Funktion durch CreateGUIInfoTags ersetzt
  676.       werden, da sie einen kleinen Fehler enthΣlt. (Siehe Probleme)
  677.  
  678.  
  679. 1.4.2 CreateGUIInfoTags  (V38.0)  / CreateGUIInfoTagList  (V38.0)
  680.  
  681.       Es wird eine GUIInfo-Struktur erstellt und alle wichtigen Felder
  682.       werden automatisch gesetzt.
  683.  
  684.       struct GUIInfo *CreateGUIInfoTags(struct Window *window{A0},
  685.                                         WORD   maxGads{D0},
  686.                                         WORD   maxMenus{D1},
  687.                                         ULONG  tagitem, tagdata,...{A1});
  688.  
  689.           oder
  690.  
  691.       struct GUIInfo *CreateGUIInfoTagList(struct Window *window{A0},
  692.                                            WORD   maxGads{D0},
  693.                                            WORD   maxMenus{D1},
  694.                                            struct TagItem *tags{A1});
  695.  
  696.       Funktioniert genau wie CreateGUIInfo, nur da▀ zusΣtzlich noch einige
  697.       spezielle Tags mit ⁿbergeben werden k÷nnen.
  698.       Des weiteren wird der menuFont-Eintrag auf den Font des Screens ge-
  699.       setzt. Wenn Sie also nun die font-TextAttr-Struktur abΣndern, be-
  700.       trifft das nur noch die Gadgets, aber nicht mehr die Menⁿleiste !
  701.       Ab (V38.0) sollte diese Funktions anstelle von CreateGUIInfo benutzt
  702.       werden.
  703.  
  704.       Folgende Tags sind m÷glich:
  705.  
  706.       GUI_ResizableGads : 1 oder 0, Voreinstellung ist 0.
  707.                           Wenn Sie GUI_ResizableGads auf 1 setzen, merkt
  708.                           sich GUITools nun das Aussehen aller Gadgets.
  709.                           Damit ist GUITools in der Lage gr÷▀enverΣnderbare-
  710.                           Gadgets zu behandeln.
  711.                           Da das Merken von Aussehen, Form und Gr÷▀e der
  712.                           Gadgets sehr aufwendig ist, mu▀ es extra mit
  713.                           diesem Flag angefordert werden.
  714.       GUI_Flags         : ULONG, Voreinstellung 0
  715.                           Hier k÷nnen Sie die Flags angeben, die sofort ge-
  716.                           setzt werden sollen. Diese werden nach gui->flags
  717.                           kopiert.
  718.       GUI_GadFont       : struct *TextAttr, Voreinstellung window->font
  719.                           Hiermit k÷nnen Sie den Font-Eintrag der NewGadget-
  720.                           Struktur gui->newgad mit Ihrem eigenen Font vor-
  721.                           belegen.
  722.       GUI_MenuFont      : struct *TextAttr, Voreinstellung screen->font
  723.                           Hiermit k÷nnen Sie der Menⁿleiste einen anderen
  724.                           als den beim Screen verwendeten Font ⁿbergeben.
  725.                           Dieser wird unter gui->menuFont eingetragen.
  726.       GUI_VanKeyFct     : VanKeyFct, Voreinstellung NULL
  727.                           Angabe der Hook-Funktion, die in gui->vanKeyFct
  728.                           eingetragen wird.
  729.       GUI_CreateError   : *LONG, Voreinstellung NULL
  730.                           Hier k÷nnen Sie einen Zeiger auf eine LONG-
  731.                           Variable angeben, die bei einem Fehler eine
  732.                           genauere Angabe ⁿber den Fehlergrund anzeigt.
  733.                           Diese Fehlernummer gilt nur fⁿr CreateGUIInfoTags/
  734.                           CreateGUIInfoTagList.
  735.                           Folgende Werte k÷nnen auftreten:
  736.  
  737.                            cgiNoError       Kein Fehler aufgetreten.
  738.                            cgiNoWindow      Window-Zeiger war NULL.
  739.                            cgiNoVisualInfo  VisualInfo konnte nicht erstellt
  740.                                             werden.
  741.                            cgiNoMemory      Nicht genⁿgend Speicher.
  742.                            cgiNoDrawInfo    DrawInfo konnte nicht erstellt
  743.                                             werden.
  744.                            cgiCreateContext Der Aufruf von CreateContext
  745.                                             schlug fehl.
  746.  
  747.       GUI_SetProcessWindow     : 1 oder 0, Voreinstellung: 0
  748.                                  Ist dieses Flag gesetzt, so wird der
  749.                                  pr_WindowPtr-Eintrag der Process-Struktur
  750.                                  auf das Window gesetzt.
  751.  
  752.       GUI_RestoreProcessWindow : 1 oder 0, Voreinstellung: 0
  753.  
  754.                                  Wenn dieses Flag gesetzt ist, so wird bei
  755.                                  FreeGUIInfo der Wert in den pr_WindowPtr-
  756.                                  Eintrag der Process-Struktur eingetragen,
  757.                                  der vor dem Aufruf von CreateGUIInfoTags/
  758.                                  CreateGUIInfoTagList dort stand.
  759.  
  760.       GUI_RefreshWindowFrame   : 1 oder 0.
  761.                                  Dieses Flag erhΣlt normalerweise den Wert,
  762.                                  den das Flag GUI_ResizableGads hat.
  763.                                  Sie k÷nnen, wenn Sie dieses Tagitem NACH
  764.                                  den GUI_Resizable-Tagitem benutzen, den
  765.                                  Wert Σndern.
  766.                                  Ist dieses Flag gesetzt, so wird bei
  767.                                  EndRefresh auch noch die Intuition-Funktion
  768.                                  RefreshWindowFrames aufgerufen.
  769.  
  770.  
  771. 1.4.3 FreeGUIInfo
  772.  
  773.       Freigeben des mit CreateGUIInfo bzw ab (V38.0) mit CreateGUIInfoTags/
  774.       CreateGUIInfoTagList erstellten GUIInfos. Entfernen der Gadgets und
  775.       des Menⁿs.
  776.  
  777.       void FreeGUIInfo(struct GUIInfo *gui{A0});
  778.  
  779.       Haben Sie die GUIInfo-Struktur ⁿber CreateGUIInfoTags/CreateGUIInfo-
  780.       TagList (V38.0) erstellt, und dabei das GUI_RestoreProcessWindow-Tag
  781.       mit dem Wert 1 angegeben, so wird nun der pr_WindowPtr-Eintrag der
  782.       Process-Struktur wieder auf den alten Wert zurⁿck gesetzt.
  783.  
  784.  
  785. 1.4.4 SetGUI
  786.  
  787.       Setzen der Gadgets und des Menⁿs
  788.  
  789.       WORD SetGUI(struct GUIInfo *gui{A0});
  790.  
  791.       M÷gliche Rⁿckgabewerte:
  792.  
  793.         guiSet        Alles klar, weiter geht's.
  794.         gadgetError   Fehler beim Erstellen der Gadgets.
  795.         menuError     Fehler beim Erstellen des Menⁿs.
  796.         memError      Zuwenig Speicher.
  797.  
  798.         gadKeyDefTwice     (V38.0) Gleiches Key-Equivalent fⁿr 2 Gadgets.
  799.         menuSetError       (V38.0) Fehler beim internen Aufruf von SetMenuStrip.
  800.         menuLayoutError    (V38.0) Fehler beim internen Aufruf von LayoutMenusA.
  801.         gadKeyNotAllowed   (V38.0) Key-Equivalent ist kein Buchstabe.
  802.         tooManyGadsError   (V38.0) mehr Gadgets als bei CreateGUIInfo ange-
  803.                                    geben.
  804.         tooManyMenusError  (V38.0) wie tooManyGadsError, nur fⁿr Menⁿs.
  805.         gadKeyNotFound     (V38.0) GA_Underscore-Tag vorhanden, fehlt aber im
  806.                                    Text und GFLG_VanillaKeysNotify ist gesetzt.
  807.         noGadToolsGadKind  (V38.0) Das Gadget-Kind ist kein GadTools-Gadget.
  808.         noGUIToolsGadKind  (V38.0) Das Gadget-Kind ist kein GUITools-Gadget.
  809.  
  810.       Nur beim Erhalten von guiSet kann weiterfortgefahren werden, ansonsten
  811.       kann nicht auf das GUI mehr zugegriffen werden.
  812.       Erneute Aufrufe von CreateGadget, MakeMenuEntry etc sind wirkungslos.
  813.       Auf keinem Fall darf SetGUI noch einmal aufgerufen werden. Hingegen mu▀
  814.       FreeGUIInfo trotz des Fehlerfolges noch aufgerufen werden.
  815.       Nach einem Aufruf von SetGUI ist es nicht mehr m÷glich weitere Gadgets
  816.       oder Menⁿpunkte hinzuzufⁿgen.
  817.       Ab (V38.0) kann SetGUI auch mehrmals aufgerufen werden, um z.B. erst
  818.       ein Menⁿ und spΣter dann die Gadgets zu erstellen. Dazu erstellt man
  819.       erst das Menⁿ (ⁿber MakeMenuEntry (s.u)), ruft SetGUI auf, erstellt
  820.       dann irgendwann die Gadgets ⁿber CreateGadget und ruft wieder SetGUI auf.
  821.       Allerdings k÷nnen Sie damit nicht an ein bestehendes Menⁿ ein neues
  822.       anhΣngen oder Gadgets hinzufⁿgen.
  823.  
  824.  
  825. 1.4.5 CreateGadget / CreateGadgetTag
  826.  
  827.       Erstellt das angegebene GadTools-Gadget
  828.  
  829.       void CreateGadget(struct GUIInfo *gui{A0},
  830.                         WORD   left{D0},
  831.                         WORD   top{D1},
  832.                         WORD   width{D2},
  833.                         WORD   height{D3},
  834.                         ULONG  kind{D4},
  835.                         ULONG  tagitem, tagdata, ...{A1});
  836.  
  837.           oder
  838.  
  839.       void CreateGadgetTag(struct GUIInfo *gui{A0},
  840.                            WORD   left{D0},
  841.                            WORD   top{D1},
  842.                            WORD   width{D2},
  843.                            WORD   height{D3},
  844.                            ULONG  kind{D4},
  845.                            struct TagItem *tags{A1});
  846.  
  847.  
  848.       Ersetzt im Prinzip GadToolsL.CreateGadgetA. Der Unterschied ist, da▀
  849.       hier die Gr÷▀e/Position direkt angegeben wird und nicht ⁿber eine
  850.       NewGadget-Struktur.
  851.       Ein mit CreateGadget/CreateGadgetTag erstelltes Gadget besitzt keinen
  852.       Text, au▀er Sie haben Ihn explizit ⁿber gui->newgad.ng_GadgetText
  853.       vorher angegeben.
  854.       Es wird keine Fehlermeldung ausgegeben, falls das Gadget nicht erstellt
  855.       werden konnte. Dies geschieht spΣter ⁿber SetGUI().
  856.       Fⁿr jedes Gadget wird im userData-Eintrag der Gadget-Struktur noch
  857.       ein Zeiger auf folgende Struktur angelegt ab (V38.0):
  858.  
  859.       struct GUIGadgetInfo {
  860.         APTR  userData;       hier k÷nnen eigene Daten eingetragen werden
  861.         ULONG kind;           Gadget-Kind
  862.       };
  863.  
  864.       Dieser Zeiger darf nicht verΣndert werden. Wird der userData-Eintrag
  865.       selber ben÷tigt, so mu▀ der userData->userData-Eintrag dafⁿr genutzt
  866.       werden ! GUITools setzt diesen userData-Eintrag automatisch auf den
  867.       in der NewGadget-Struktur angegebenen.
  868.       ▄ber kind k÷nnen Sie selber nachfragen, um was fⁿr ein Gadget es
  869.       sich eigentlich handelt.
  870.  
  871.       Ab (V38.0) macht GUITools folgende Ersetzungen:
  872.  
  873.         CHECKBOX_KIND : width == 0, dann width = CHECKBOX_WIDTH
  874.                       : height== 0, dann height= CHECKBOX_HEIGHT
  875.         MX_KIND       : width == 0, dann width = MX_WIDTH
  876.                         height== 0, dann height= MX_HEIGHT
  877.         STRING_KIND   : height== 0, dann height= Font->ta_YSize + 4
  878.         INTEGER_KIND  : wie stringKind
  879.  
  880.       Ist GFLG_AddBorderDims in gui->flags gesetzt, so wird zu left noch
  881.       window->BorderLeft und zu top noch window->BorderTop hinzuaddiert,
  882.       damit die Gadgets, egal welchen Font Sie benutzen, immer im inneren
  883.       des Windows liegen.
  884.       Sie k÷nnen nun nach einem Aufruf von CreateGadget auf das soeben
  885.       erstellte Gadget ⁿber gui->gadgets->allGadgets[gui->actgad-1] bzw ab
  886.       (V38.0) ⁿber gui->gadget zugreifen. Testen Sie aber bei der ersten
  887.       Methode, ob actgad gr÷▀er 0 ist. Bei beiden Methoden mⁿ▀en Sie noch
  888.       den Zeiger auf NULL testen!
  889.  
  890.  
  891. 1.4.6 CreateGadgetText / CreateGadgetTextTag
  892.  
  893.       Wie CreateGadget, nur wird noch der Text mit angegeben.
  894.  
  895.       void CreateGadgetText(struct GUIInfo *gui{A0},
  896.                             WORD   left{D0},
  897.                             WORD   top{D1},
  898.                             WORD   width{D2},
  899.                             WORD   height{D3},
  900.                             ULONG  kind{D4},
  901.                             STRPTR text{A1},
  902.                             ULONG  tagitem, tagdata, ...{A2});
  903.  
  904.           oder
  905.  
  906.       void CreateGadgetTextTag(struct GUIInfo *gui{A0},
  907.                                WORD   left{D0},
  908.                                WORD   top{D1},
  909.                                WORD   width{D2},
  910.                                WORD   height{D3},
  911.                                ULONG  kind{D4},
  912.                                STRPTR text{A1},
  913.                                struct TagItem *tags{A2});
  914.  
  915.  
  916. 1.4.7 CreateGadgetFull
  917.  
  918.       Wie CreateGadgetText, nur zusΣtzlich wird auch noch die
  919.       Positionierung des Gadget-Textes mit angegeben.
  920.  
  921.       void CreateGadgetFull(struct GUIInfo *gui{A0},
  922.                             WORD   left{D0},
  923.                             WORD   top{D1},
  924.                             WORD   width{D2},
  925.                             WORD   height{D3},
  926.                             ULONG  kind{D4},
  927.                             STRPTR text{A1},
  928.                             ULONG  place{D5},
  929.                             ULONG  tagitem, tagdata, ...{A2});
  930.  
  931.           oder
  932.  
  933.       void CreateGadgetFullTag(struct GUIInfo *gui{A0},
  934.                                WORD   left{D0},
  935.                                WORD   top{D1},
  936.                                WORD   width{D2},
  937.                                WORD   height{D3},
  938.                                ULONG  kind{D4},
  939.                                STRPTR text{A1},
  940.                                ULONG  place{D5},
  941.                                struct TagItem *tags{A2});
  942.  
  943.  
  944. 1.4.8 RemoveGadgets  (V38.0)
  945.  
  946.       Entfernt alle Gadgets aus der Liste.
  947.  
  948.       void RemoveGadgets(struct GUIInfo *gui{A0},
  949.                          UBYE   erase{D0});
  950.  
  951.       Die Gadgets sind aber immer noch zu sehen. Es sollte dann also noch
  952.       ClearWindow aufgerufen werden. Wenn Sie erase auf 1 setzen, werden
  953.       die Gadgets fⁿr immer entfernt. Bei 0 hingegen, k÷nnen Sie die
  954.       Gadgets mit einem Aufruf von SetGUI wieder auf den Bildschirm bringen.
  955.       Zwischenzeitlich dⁿrfen Sie aber keinen CreateGadget-Aufruf getΣtigt
  956.       haben, um z.B. neue Gadgets hinzuzufⁿgen !
  957.       Bei erase = 1 k÷nnen Sie mit CreateGadget neue Gadgets definieren
  958.       und diese dann mit SetGUI wieder auf den Bildschirm bringen, so da▀ Ihr
  959.       Window mehrere Menⁿ-Masken haben kann.
  960.       ACHTUNG: Alle Informationen ⁿber die alten Gadgets gehen verloren,
  961.                wenn erase auf 1 gesetzt wird !
  962.  
  963.  
  964. 1.4.9 MakeMenuEntry
  965.  
  966.       Erstellen eines Menⁿ-Eintrages.
  967.  
  968.       void MakeMenuEntry(struct GUIInfo *gui{A0},
  969.                          UBYTE  type{D0},
  970.                          STRPTR text{A1},
  971.                          STRPTR key{A2});
  972.  
  973.       type     NM_TITLE, NM_ITEM, NM_SUB etc
  974.       text     Zeiger auf den Menⁿ-Text
  975.       key      Zeiger auf einen Tastaturkⁿrzel oder NULL
  976.  
  977.       Nach dem Aufruf k÷nnen Sie ⁿber gui->newmenus->allMenus[gui->actmenu-1]
  978.       oder aber ab (V38.0) ⁿber gui->menuAdr-> auf die soeben erstellte
  979.       NewMenu-Struktur zugreifen und diese verΣndern.
  980.  
  981.  
  982. 1.4.10 RemoveMenu  (V38.0)
  983.  
  984.        Entfernt nur das Menⁿ.
  985.  
  986.        void RemoveMenu(struct GUIInfo *gui{A0},
  987.                        UBYTE  erase{D0});
  988.  
  989.        Wenn Sie erase auf 1 setzen, wird das Menⁿ vollkommen gel÷scht,
  990.        sie k÷nnen jetzt ⁿber MakeMenuEntry ein neues Menⁿ definieren und
  991.        dieses dann ⁿber SetGUI auf den Bildschirm bringen.
  992.        Setzen Sie erase auf 0, wird das Menⁿ lediglich abgehΣngt. Sie
  993.        k÷nnen es mit SetGUI jederzeit wieder sichtbar machen. Ein zwischen-
  994.        zeitlicher Aufruf von MakeMenuEntry ist aber nicht erlaubt !
  995.        ACHTUNG: Alle Informationen ⁿber das alte Menⁿ gehen verloren, wenn
  996.                 Sie erase auf 1 setzen!
  997.  
  998.  
  999. 1.5 GUI-Abfrage
  1000.     -----------
  1001.  
  1002.  
  1003. 1.5.1 WaitIntMsg
  1004.  
  1005.       Wartet auf eine Msg am eingetragenen Port.
  1006.  
  1007.       void WaitIntMsg(struct GUIInfo *gui{A0});
  1008.  
  1009.       Wartet auf eine IntuiMessage und beantwortet diese dann und
  1010.       liefert eine Kopie in gui->im an.
  1011.       Gleichzeitig wird HandleIntMsg ausgefⁿhrt, falls GFLG_NoHandleIntMsgCall
  1012.       im flags-Feld nicht gesetzt ist (V38.0).
  1013.       Ab (V38.0) kann es sein, da▀ wenn GFLG_InternMsgHandling gesetzt ist,
  1014.       WaitIntMsg mehrere Messages bekommt und auswertet, bevor diese dann
  1015.       ans Anwenderprogramm gesendet wird, da HandleIntMsg die vorhergehenden
  1016.       intern auswerten konnte.
  1017.       ACHTUNG: Ohne einen Aufruf von HandleIntMsg sind alle zusΣtzlichen
  1018.                Informationen der GUIInfo-Struktur ungⁿltig und dⁿrfen
  1019.                nicht abgefragt werden ! (z.B gadID oder menuNum)
  1020.  
  1021.  
  1022.  
  1023. 1.5.2 GetIntMsg
  1024.  
  1025.       Holt eine Msg vom eingetragenen Port ab.
  1026.  
  1027.       UBYTE GetIntMsg(struct GUIInfo *gui{A0});
  1028.  
  1029.       Versucht eine Msg abzuholen, ist sie vorhanden wird diese beantwortet,
  1030.       nach gui->im kopiert, HandleIntMsg aufgerufen, falls nicht
  1031.       GFLG_NoHandleIntMsgCall ab (V38.0) gesetzt ist und 1 zurⁿckgeliefert.
  1032.       Sollte eine Msg vorliegen, aber GFLG_InternMsgHandling (V38.0) gesetzt
  1033.       sein und HandleIntMsg diese intern verarbeiten k÷nnen, so wird
  1034.       ebenfalls 0 zurⁿckgeliefert !
  1035.       ACHTUNG: Ohne einen Aufruf von HandleIntMsg sind alle zusΣtzlichen
  1036.                Informationen der GUIInfo-Struktur ungⁿltig und dⁿrfen
  1037.                nicht abgefragt werden ! (z.B gadID oder menuNum)
  1038.  
  1039.  
  1040.  
  1041. 1.5.3 EmptyIntMsgPort
  1042.  
  1043.       Entfernt alle anliegenden IntuiMessages.
  1044.  
  1045.       void EmptyIntMsgPort(struct GUIInfo *gui{A0});
  1046.  
  1047.  
  1048. 1.5.4 HandleIntMsg
  1049.  
  1050.       Bearbeitung von IntuiMessages und deren Auswertung
  1051.  
  1052.       void HandleIntMsg(struct GUIInfo *gui{A0});
  1053.  
  1054.       Das Kernstⁿck von GUITools. Wird automatisch von GetIntMsg und
  1055.       WaitIntMsg aufgerufen, falls ab (V38.0) nicht GFLG_NoHandleIntMsgCall
  1056.       gesetzt ist.
  1057.       Ist also nur wichtig, wenn die Msg selber geholt werden oder
  1058.       man bevor GUITools etwas tut, die Msg auswerten ggf verΣndern
  1059.       will. Dann mu▀ diese aber vorher nach gui->im kopiert worden sein !
  1060.  
  1061.       HandleIntMsg bearbeitet die IntuiMessages folgenderma▀en:
  1062.  
  1063.       In gui->msgClass wird eine Kopie von gui->im.Class abgelegt. In den
  1064.       cardCode, intCode etc. Feldern wird eine Kopie von gui->im.Code
  1065.       abgelegt.
  1066.       Wenn GUITools die Msg entsprechend selber auswerten konnte.
  1067.       z.B. Key-Equivalente, so enthalten gui->msgClass und gui->cardCode
  1068.       verΣnderte Werte. Die gui->im-Struktur hingegen enthΣlt immer
  1069.       nur die Original-Msg. (Au▀nahme siehe Listview-Kind)
  1070.       Zur einfacheren Handhabung sollten Sie also immer auf msgClass
  1071.       zugreifen. (cardCode gibt es erst ab (V38.0) )
  1072.  
  1073.       HandleIntMsg fⁿhrt folgende Aktionen aus:
  1074.  
  1075.         Msg-Class                  Auswirkungen
  1076.       -------------------------------------------------------------------
  1077.  
  1078.       IDCMP_GADGETUP  gui->gadget enthΣlt Zeiger auf das Gadget
  1079.                       gui->gadID  enthΣlt die GadgetID
  1080.                       (V38.0) gui->gadNbr enthΣlt die Gadget-Nummer inner-
  1081.                               halb des gadgets-Feldes
  1082.  
  1083.                       INTEGER_KIND, : Ist GFLG_AutoUpdateEGads in gui->flags
  1084.                       STRING_KIND     gesetzt, so wird, falls fⁿr dieses
  1085.                                       Gadget ein Notify gesetzt wurde, der
  1086.                                       Inhalt des Gadgets in die entsprechende
  1087.                                       Variable kopiert. War beim Erstellen
  1088.                                       der Gadgets GFLG_LinkEntryGads aktiviert,
  1089.                                       so wird nun das nΣchste EntryGadget akti-
  1090.                                       viert. Eine eigene Abfrage wird somit
  1091.                                       ⁿberflⁿssig.
  1092.  
  1093.                       CYCLE_KIND    : War bei dem Gadget GFLG_CycleNotify an,
  1094.                                       so wird die Variable automatisch auf den
  1095.                                       neuesten Stand gebracht. Eine eigene
  1096.                                       Abfrage wird somit praktisch ⁿberflⁿssig.
  1097.  
  1098.                       CHECKBOX_KIND : War bei dem Gadget GFLG_CheckboxNotify an,
  1099.                                       so wird die Variable automatisch auf den
  1100.                                       neuesten Stand gebracht. Eine eigene
  1101.                                       Abfrage wird somit praktisch ⁿber-
  1102.                                       flⁿssig.
  1103.                                       Ab (V38.0) wird in gui->boolCode der
  1104.                                       Status des Gadgets geliefert.
  1105.  
  1106.                       SLIDER_KIND   : Ab (V38.0) wird, wenn bei dem Gadget
  1107.                                       GFLG_SliderNotify gesetzt war, das
  1108.                                       code-Feld in die angegebene Variable
  1109.                                       kopiert. Eine eigene Abfrage wird somit
  1110.                                       ⁿberflⁿssig.
  1111.  
  1112.                       SCROLLER_KIND : Ab (V38.0) wird, wenn bei dem Gadget
  1113.                                       GFLG_ScrollerNotify gesetzt war,
  1114.                                       das code-Feld in die angegebene Variable
  1115.                                       kopiert. Eine eigene Abfrage wird somit
  1116.                                       ⁿberflⁿssig.
  1117.  
  1118.                       LISTVIEW_KIND : Ab (V38.0) wird, wenn bei dem Gadget
  1119.                                       GFLG_ListviewNotify gesetzt war, das
  1120.                                       code-Feld in die angegebene Variable
  1121.                                       kopiert. Eine eigene Abfrage wird somit
  1122.                                       ⁿberflⁿssig.
  1123.  
  1124.                       PALETTE_KIND  : Ab (V38.0) wird, wenn bei dem Gadget
  1125.                                       GFLG_PaletteNotify gesetzt war, das
  1126.                                       code.Feld in die angegebene Variable
  1127.                                       kopiert. Eine eigene Abfrage wird somit
  1128.                                       ⁿberflⁿssig.
  1129.  
  1130.       IDCMP_GADGETDOWN   gui->gadget enthΣlt Zeiger auf das Gadget
  1131.                          gui->gadID enthΣlt die GadgetID
  1132.                          (V38.0) gui->gadNbr enthΣlt die Gadget-Nummer inner-
  1133.                                  halb des gadgets-Feldes
  1134.  
  1135.                          MX_KIND  : War bei dem Gadget GFLG_MXNotify an, so
  1136.                                     wird die Variable automatisch auf den
  1137.                                     neuesten Stand gebracht. Eine eigene
  1138.                                     Abfrage wird somit praktisch ⁿberflⁿssig.
  1139.  
  1140.                          SLIDER_KIND : Ab (V38.0) wird, wenn bei dem Gadget
  1141.                                        GFLG_SliderNotify gesetzt war, das
  1142.                                        code-Feld in die angegebene Variable
  1143.                                        kopiert. Eine eigene Abfrage wird somit
  1144.                                        ⁿberflⁿssig.
  1145.  
  1146.                          SCROLLER_KIND : Ab (V38.0) wird, wenn bei dem Gadget
  1147.                                          GFLG_ScrollerNotify gesetzt war, das
  1148.                                          code-Feld in die angegebene Variable
  1149.                                          kopiert. Eine eigene Abfrage wird
  1150.                                          somit ⁿberflⁿssig.
  1151.  
  1152.       IDCMP_MOUSEMOVE   gui->gadget enthΣlt Zeiger auf das Gadget
  1153.                         gui->gadID enthΣlt die GadgetID
  1154.                         (V38.0) gui->gadNbr enthΣlt die Gadget-Nummer inner-
  1155.                                 halb des gadgets-Feldes
  1156.  
  1157.                         SLIDER_KIND   : Ab (V38.0) wird, wenn bei dem Gadget
  1158.                                         GFLG_SliderNotify gesetzt war, das
  1159.                                         code-Feld in die angegebene Variable
  1160.                                         kopiert. Eine eigene Abfrage wird
  1161.                                         somit ⁿberflⁿssig.
  1162.  
  1163.                         SCROLLER_KIND : Ab (V38.0) wird, wenn bei dem Gadget
  1164.                                         GFLG_ScrollerNotify gesetzt war, das
  1165.                                         code-Feld in die angegebene Variable
  1166.                                         kopiert. Eine eigene Abfrage wird
  1167.                                         somit ⁿberflⁿssig.
  1168.  
  1169.       IDCMP_MENUPICK   gui->menuNum enthΣlt MenuNummer
  1170.                        gui->itemNum enthΣlt ItemNummer
  1171.                        gui->subNum  enthΣlt SubItemNummer
  1172.                        gui->itemAdr enthΣlt die Item-Adresse der MenuItem-
  1173.                                     Struktur ab (V38.0)
  1174.  
  1175.                        Ist ab (V38.0) GFLG_CallMenuData in flags gesetzt, so
  1176.                        wird automatisch die in userData angegebene Funktion
  1177.                        aufgerufen. Diese sollte 1 zurⁿckliefern, falls
  1178.                        weitere Messages bearbeitet werden sollen oder aber
  1179.                        0, wenn zurⁿck ins Hauptprogramm gesprungen werden
  1180.                        soll.
  1181.                        Ab (V38.0) werden IDCMP_MenuNull-Messages ignoriert,
  1182.                        d.h. in gui->msgClass wird 0 zurⁿckgeliefert.
  1183.  
  1184.       IDCMP_MENUHELP   Ab (V38.0) :
  1185.                         gui->menuNum enthΣlt MenuNummer
  1186.                         gui->itemNum enthΣlt ItemNummer
  1187.                         gui->subNum  enthΣlt SubItemNummer
  1188.                         gui->itemAdr enthΣlt die Item-Adresse der MenuItem-
  1189.                                      Struktur, falls m÷glich
  1190.  
  1191.       IDCMP_VANILLAKEY Ab (V38.0) Ist GFLG_ConvertKeys in flags gesetzt, so
  1192.                                   wird nun automatisch ConvKMsgToGMsg aufge-
  1193.                                   rufen-
  1194.  
  1195.       IDCMP_REFRESHWINDOW  Ist ab (V38.0) GFLG_DoRefresh in flags gesetzt,
  1196.                            so wird nun BeginRefresh, gefolgt von
  1197.                            EndRefresh(, 1) aufgerufen.
  1198.  
  1199.  
  1200. 1.5.5 ConvKMsgToGMsg  (V38.0)
  1201.  
  1202.       Holt sich die Taste aus dem gui->im.Code-Feld und ruft dann
  1203.       GadWithKey mit dem entsprechenden Gadget auf.
  1204.  
  1205.       void ConvKMsgToGMsg(struct GUIInfo *gui{A0});
  1206.  
  1207.       Diese Funktion ist nur von Interesse, wenn GFLG_NoHandleIntMsgCall
  1208.       gesetzt ist und man die Konversionen selber ⁿberwachen will.
  1209.       Oder wenn man RawKey-Tasten abfragt und diese vorher in
  1210.       VanillaKeys umwandeln mu▀ oder Σhnliches. Fⁿr diese Funktion
  1211.       mu▀ in gui->im.Code der VanillaKey-Code stehen und in gui->msgClass
  1212.       IDCMP_VANILLAKEY !
  1213.       CreateGadget merkt sich, wenn GFLG_VanillaKeyNotify gesetzt ist, selber
  1214.       alle Key-Equivalente, die aus Buchstaben bestehen. Wenn Sie nun aber
  1215.       auch Tasten, die keine Buchstaben sind verwenden wollen, so mⁿssen Sie
  1216.       die Zuordnung Taste->Gadget selber machen. Dafⁿr  mⁿssen Sie zuerst
  1217.       GFGL_AllowAllVanillaKeys in flags setzen. Des weiteren ins eine
  1218.       VanKeyFct im vanKeyHook-Feld einzutragen. Diese Funktion wird von
  1219.       ConvKMsgToGMsg immer dann aufgerufen, wenn kein Buchstabe dort ankommt,
  1220.       sondern irgend eine andere Taste.
  1221.       Die VanKeyFct hat folgendes Format:
  1222.  
  1223.       ULONG VanKeyFct(register __d0 char key,
  1224.                       register __a0 WORD *nbr,
  1225.                       register __a1 WORD *shift);
  1226.  
  1227.       In D0 erhalten Sie den Vanilla-Code der Taste. In A0 kommt ein
  1228.       Zeiger auf ein WORD. Hier tragen Sie die entsprechende Nummer
  1229.       des Gadgets ein. A1 zeigt auch auf ein WORD. Hier geben Sie
  1230.       an, ob das Gadget mit SHIFT oder ohne behandelt werden soll.
  1231.       Eine 0 bedeutet nein, eine 1 ja.
  1232.       Konnte Ihre Funktion eine Zuordnung machen, liefern Sie 1 zurⁿck,
  1233.       ansonsten 0.
  1234.  
  1235.  
  1236. 1.5.6 GadWithKey   (V38.0)
  1237.  
  1238.       Tut so, als ob fⁿr das bestehende Gadget ein Key-Equivalent bestehen
  1239.       wⁿrde und fⁿhrt intern einige Funktionen aus.
  1240.  
  1241.       void GadWithKey(struct GUIInfo *gui{A0},
  1242.                       WORD   nbr{D0},
  1243.                       UBYTE  shift{D1});
  1244.  
  1245.         nbr    Gadget-Nummer
  1246.         shift  War die Taste mit Shift gedrⁿckt ?
  1247.  
  1248.       Diese Funktion kann benutzt werden, um Sondertasten, den entsprechenden
  1249.       Gadgets zuzuordnen, z.B. (F-Tasten).
  1250.       Folgende Aktionen werden ausgefⁿhrt, zusΣtzlich werden bei den Gadgets
  1251.       (abgesehen von STRING_KIND und INTEGER_KIND) noch die Notify-Aufrufe,
  1252.       die auch HandleIntMsg ausfⁿhrt, benutzt. gadNbr enthΣlt die
  1253.       Gadget-Nummer, gadID die entsprechende ID.
  1254.       Ist das Gadget deaktiviert (disabled), so wird keine Aktion ausge-
  1255.       fⁿhrt und in msgClass wird 0 zurⁿckgeliefert.
  1256.       Die VerΣnderungen werden automatisch sichtbar gemacht.
  1257.  
  1258.         BUTTON_KIND   : msgClass = IDCMP_GADGETUP
  1259.                         cardCode = 0
  1260.  
  1261.         STRING_KIND   : Es wird das entsprechende Gadget aktiviert
  1262.                         msgClass = IDCMP_GADGETDOWN
  1263.                         cardCode = 0
  1264.  
  1265.         INTEGER_KIND  : Es wird das entsprechende Gadget aktiviert
  1266.                         msgClass = IDCMP_GADGETDOWN
  1267.                         cardCode = 0
  1268.  
  1269.         CHECKBOX_KIND : Es wird der Zustand des Gadgets geΣndert.
  1270.                         msgClass = IDCMP_GADGETUP
  1271.                         boolCode enthΣlt den neuen Zustand
  1272.  
  1273.         MX_KIND       : Ohne shift wird der nΣchste Eintrag ausgewΣhlt, mit
  1274.                         shift der vorherige.
  1275.                         msgClass = IDCMP_GADGETDOWN
  1276.                         cardCode = Nummer des neu gewΣhlten Eintrages
  1277.  
  1278.         CYCLE_KIND    : Ohne shift wird der nΣchste Eintrag ausgewΣhlt, mit
  1279.                         shift der vorherige.
  1280.                         msgClass = IDCMP_GADGETUP
  1281.                         cardCode = Nummer des neu gewΣhlten Eintrages
  1282.  
  1283.         SLIDER_KIND   : Ohne shift eine Position nach "vorwΣrts", mit shift
  1284.                         eine rⁿckwΣrts.
  1285.                         msgClass = IDCMP_GADGETUP
  1286.                         intCode  = neue Position (neuer Level)
  1287.  
  1288.         SCROLLER_KIND : Ohne shift eine Position nach "vorwΣrts", mit shift
  1289.                         eine rⁿckwΣrts.
  1290.                         msgClass = IDCMP_GADGETUP
  1291.                         intCode  = neue Position (neues Top)
  1292.  
  1293.         LISTVIEW_KIND : Ohne shift nΣchsten Eintrag, mit shift vorherigen.
  1294.                         War noch keiner aktiv, wird ohne shift der erste
  1295.                         ausgewΣhlt und mit shift der letzte.
  1296.                         msgClass = IDCMP_GADGETUP
  1297.                         cardCode = Nummer des neu gewΣhlten Eintrages
  1298.  
  1299.                         War GFLG_LVKeyClearTime beim Erstellen dieses Gadgets
  1300.                         gesetzt, so wird nun der der Sekunden und der
  1301.                         Mikrosekunden-Eintrag der original IntuiMessage
  1302.                         (im im-Feld der GUI-Struktur) auf 0 gesetzt, um
  1303.                         Probleme beim Abfragen ⁿber DoubleClick zu ver-
  1304.                         meiden. Hier mu▀ man dann vorher nur die Felder
  1305.                         auf 0 ⁿberprⁿfen.
  1306.  
  1307.         PALETTE_KIND  : Ohne shift wird die nΣchste Farbe ausgewΣhlt, mit
  1308.                         shift die vorhergehende
  1309.  
  1310. 1.6 GUI-Bearbeitung
  1311.     ---------------
  1312.  
  1313. 1.6.1 GadgetStatus
  1314.  
  1315.       Aktivieren, deaktivieren eines Gadgets.
  1316.  
  1317.       void GadgetStatus(struct GUIInfo *gui{A0},
  1318.                         WORD   nbr{D0},
  1319.                         UBYTE  status{D1});
  1320.  
  1321.       nbr     gibt die GadgetNummer des gadget-Feldes an
  1322.       status  1 : Gadget aktivieren
  1323.               0 : Gadget deaktivieren
  1324.  
  1325.       GadTools-Gadgets werden ⁿber das GA_Disabled-Tag an bzw aus-ge-
  1326.       schaltet. Bei GENERIC_KIND-Gadgets werden die Funktionen
  1327.       OnGadget/OffGadget der Intuition-Library benutzt !
  1328.  
  1329.  
  1330. 1.6.2 ModifyGadget / ModifyGadgetTag
  1331.  
  1332.       Ersetzt GadToolsL.GTSetGadgetAttrs. Dient zum VerΣndern einiger
  1333.       Gadget-Attribute.
  1334.  
  1335.       void ModifyGadget(struct GUIInfo *gui{A0},
  1336.                         WORD   nbr{D0},
  1337.                         ULONG  tagitem, tagdata, ...{A1});
  1338.  
  1339.           oder
  1340.  
  1341.       void ModifyGadgetTag(struct GUIInfo *gui{A0},
  1342.                            WORD   nbr{D0},
  1343.                            struct TagItem *tags{A1});
  1344.  
  1345.       nbr     gibt die GadgetNummer des gadget-Feldes an
  1346.  
  1347.  
  1348. 1.6.3 UpdateEGad
  1349.  
  1350.       Kopiert den Inhalt eines EntryGadgets in die entsprechende Variable.
  1351.  
  1352.       void UpdateEGad(struct GUIInfo *gui{A0},
  1353.                       WORD   nbr{D0});
  1354.  
  1355.       nbr     gibt die GadgetNummer des gadgetFeldes an.
  1356.  
  1357.  
  1358. 1.6.4 UpdateEntryGadgets
  1359.  
  1360.       Wie UpdateEGad nur fⁿr alle Gadgets.
  1361.  
  1362.       void UpdateEntryGadgets(struct GUIInfo *gui{A0});
  1363.  
  1364.       Damit kann leicht das Problem umgangen werden, wenn ein Benutzer
  1365.       in einem EntryGadget Eingaben macht und dann ohne RETURN zu be-
  1366.       tΣtigen eine Aktion auswΣhlt.
  1367.       Leider schickt Intuition dann keine GadgetUp-Message, so da▀
  1368.       man beim Erhalten dieser Aktion erst alle EntryGadgets abfragen
  1369.       mu▀, um die richtigen Inhalte zu haben.
  1370.       UpdateEntryGadgets erledigt das ganz einfach fⁿr einen, dank
  1371.       der GFLG_StringNotify und GFLG_IntegerNotify-Funktionen.
  1372.  
  1373.  
  1374. 1.6.5 VarToGad  (V38.0)
  1375.  
  1376.       ▄bergibt den Inhalt einer Variablen an das zugeh÷rige Gadget.
  1377.  
  1378.       void VarToGad(struct GUIInfo *gui{A0},
  1379.                     WORD   nbr{D0});
  1380.  
  1381.       Wenn Sie fⁿr dieses Gadget das entsprechende Notify eingeschaltet
  1382.       haben, dann k÷nnen Sie nun ganz einfach Ihre dazugeh÷rige Variable
  1383.       verΣndern und dann VarToGad mit dem entsprechenden Gadget aufrufen.
  1384.       GUITools nimmt den Wert der Variablen und Σndert entsprechend das
  1385.       Gadget ab.
  1386.  
  1387.  
  1388. 1.6.6 AllVarsToGad  (V38.0)
  1389.  
  1390.       Funktioniert wie VarToGad, nur fⁿr alle Gadgets.
  1391.  
  1392.       void AllVarsToGad(struct GUIInfo *gui{A0});
  1393.  
  1394.       GUITools ⁿbergibt allen Gadgets, bei denn ein Notify eingeschaltet
  1395.       ist, denn aktuellen Wert der dazugeh÷rigen Variable.
  1396.  
  1397.  
  1398. 1.6.7 RedrawMenu  (V38.0)
  1399.  
  1400.       Aktuelle Menⁿleiste entfernen und erneut wieder darstellen.
  1401.  
  1402.       WORD RedrawMenu(struct GUIInfo *gui{A0});
  1403.  
  1404.       Zuerst wird das alte Menⁿ entfernt und dann mit den alten Werten
  1405.       wieder erneut aufgebaut unter Berⁿcksichtigung des menuFont-Eintrages,
  1406.       der geΣndert werden konnte, um das Menⁿ an einen neuen Font anzu-
  1407.       passen oder fⁿr einige Menⁿpunkte neue Texte darzustellen.
  1408.       Sie mⁿssen dazu vorher die newMenus-EintrΣge entsprechend abgeΣndert
  1409.       haben.
  1410.       DerRⁿckgabewert entspricht dem von SetGUI.
  1411.       ACHTUNG: Sie k÷nnen hiermit nicht die Menⁿstruktur an sich verΣndern,
  1412.                Sie k÷nnen nur den Font oder die Menⁿ-Texte Σndern !
  1413.  
  1414.  
  1415. 1.6.8 RedrawGadgets  (V38.0)
  1416.  
  1417.       Alle Gadgets entfernen, Position und Gr÷▀e neu berechnen und wieder
  1418.       darstellen.
  1419.  
  1420.       void RedrawGadgets(struct GUIInfo *gui{A0},
  1421.                          UBYTE  setGads{D0});
  1422.  
  1423.       Es werden alle Gadgets entfernt und dann unter Berⁿcksichtigung der
  1424.       mit Hilfe von ResizeGadget / NewGadgetFont / NewFontAllGadgets und
  1425.       NewGadgetText gemachten ─nderungen, auf den Bildschirm gebracht.
  1426.       Ist setGads gleich 0, so kann die Gadget-Liste, wie bei CreateGadget
  1427.       noch vorher selber abgeΣndert werden (z.B. fⁿr GENERIC_KIND).
  1428.       Diese Funktion kann nur seinen Dienst verrichten, wenn mit Hilfe
  1429.       von CreateGUIInfoTags/CreateGUIInfoTagList  GUI_ResizableGads auf 1
  1430.       gesetzt worden ist.
  1431.       Der Rⁿckgabewert entspricht dem von SetGUI. Man sollte aber beachten,
  1432.       da▀ wenn setGads == 0 ist, Sie trotzdem guiSet zurⁿckbekommen !
  1433.       ZusΣtzlich kann noch folgender Wert zurⁿckgeliefert werden :
  1434.  
  1435.       rdGUIContextError   Der erneute Aufruf von CreateContext schlug fehl.
  1436.  
  1437.       Erhalten Sie nicht guiSet zurⁿck, sollten Sie FreeGUIInfo ausfⁿhren,
  1438.       und ggf alles noch einmal von vorne versuchen bzw Ihr Programm ab-
  1439.       brechen.
  1440.  
  1441.  
  1442. 1.6.9 ResizeGadget  (V38.0)
  1443.  
  1444.       Definieren von neuer Position und Gr÷▀e eines Gadgets
  1445.  
  1446.       void ResizeGadget(struct GUIInfo *gui{A0},
  1447.                         WORD   nbr{D0},
  1448.                         WORD   left{D1},
  1449.                         WORD   top{D2},
  1450.                         WORD   width{D3},
  1451.                         WORD   height{D4});
  1452.  
  1453.       Hiermit geben Sie dem angegebenen Gadget eine neue Position und
  1454.       Gr÷▀e, die erst nach einem Aufruf von RedrawGadgets wirksam wird.
  1455.       Sie k÷nnen auch fⁿr die einzelnen Werte preserve = -1 angeben,
  1456.       um den Wert beizubehalten.
  1457.  
  1458.  
  1459. 1.6.10 NewGadgetText  (V38.0)
  1460.  
  1461.        Definieren eines neuen Gadget-Textes
  1462.  
  1463.        void NewGadgetText(struct GUIInfo gui{A0},
  1464.                           WORD   nbr{D0},
  1465.                           STRPTR text{A1});
  1466.  
  1467.        Hiermit geben Sie dem angegebenen Gadget einen neuen Text. Die
  1468.        ─nderung wird aber erst nach einem Aufruf von RedrawGadgets wirksam.
  1469.  
  1470.  
  1471. 1.6.11 NewGadgetFont  (V38.0)
  1472.  
  1473.        Neuer Font fⁿr ein Gadget
  1474.  
  1475.        void NewGadgetFont(struct GUIInfo *gui{A0},
  1476.                           WORD   nbr{D0},
  1477.                           struct TextAttr *font{A1});
  1478.  
  1479.        ─ndert den Font des Gadgets. Diese ─nderung wird erst nach
  1480.        einem Aufruf von RedrawGadgets wirksam.
  1481.  
  1482.  
  1483. 1.6.12 NewFontAllGadgets  (V38.0)
  1484.  
  1485.        ─ndert den Font fⁿr alle Gadgets.
  1486.  
  1487.        void NewFontAllGadgets(struct GUIInfo *gui{A0},
  1488.                               struct TextAttr *font{A1});
  1489.  
  1490.        ─ndert den Font der Gadgets. Diese ─nderung wird erst nach
  1491.        einem Aufruf von RedrawGadgets wirksam.
  1492.  
  1493.  
  1494. 1.6.13 DrawBox  (V38.0)
  1495.  
  1496.        Zeichnet die BevelBox mit den angegebenen Ma▀en ggf. recessed.
  1497.  
  1498.        void DrawBox(struct GUIInfo *gui{A0},
  1499.                     WORD   left{D0},
  1500.                     WORD   top{D1},
  1501.                     WORD   width{D2},
  1502.                     WORD   height{D3},
  1503.                     UBYTE  recessed{D4});
  1504.  
  1505.  
  1506. 1.6.14 ShowRequester  (V38.0)  / ShowRequesterTag
  1507.  
  1508.        Zeigt den entsprechenden Requester an.
  1509.  
  1510.        LONG ShowRequester(struct GUIInfo *gui{A0},
  1511.                           STRPTR text{A1},
  1512.                           ULONG  kind{D0},
  1513.                           ULONG  tagitem, tagdata, ...{A2});
  1514.  
  1515.           oder
  1516.  
  1517.        LONG ShowRequesterTag(struct GUIInfo *gui{A0},
  1518.                              STRPTR text{A1},
  1519.                              ULONG  kind{D0},
  1520.                              struct TagItem *tags{A2});
  1521.  
  1522.          text  EnthΣlt den Gadget-Text. Dieser kann aus mehreren Zeilen be-
  1523.                stehen, die durch '\n' getrennt werden.
  1524.          kind  Requester-Kind
  1525.          tags  Zeiger auf Tag-Liste. Folgende Tags sind m÷glich:
  1526.  
  1527.                 SR_Gadgets   Zeiger auf String, der die Gadget-Text enthΣlt.
  1528.                              Die einzelnen Texte werden durch '|' getrennt.
  1529.                 SR_Args      Zeiger auf Argumente, falls vorhandne
  1530.                 SR_Flags     Flags (32 Bit). momentan unbenutzt, daher
  1531.                              nicht auf einen Wert ungleich 0 setzen !
  1532.                 SR_Title     Zeiger auf String. EnthΣlt den Titel des
  1533.                              Requesters. Voreingestellt ist NULL, d.h. der
  1534.                              Requester bekommt den des Referenzwindows.
  1535.                 SR_IDCMP     Zeiger auf LONG. Voreinstellung : NULL
  1536.                              Hier k÷nnen Sie IDCMPFlags angeben, bei denen
  1537.                              der Requester beendet wird. Es wird dann -1
  1538.                              zurⁿck geliefert und in der Variable, auf
  1539.                              die SR_IDCMP zeigt, steht dann das IDCMPFlag,
  1540.                              das den Requester beendet hat.
  1541.                 SR_ReqWindow Hier k÷nnen Sie einen Window-Zeiger angeben, der
  1542.                              bestimmt, auf welchem Window der Requester er-
  1543.                              scheint.
  1544.  
  1545.        DefaultmΣ▀ig erscheint der Requester auf dem Window, das ⁿber das
  1546.        GUIInfo angegeben wird. Sie k÷nnen hier aber auch fⁿr gui NULL an-
  1547.        geben, dann wird der Window-Zeiger aus der Process-Struktur be-
  1548.        nutzt. Des weiteren haben Sie die M÷glichkeit, den Zeiger noch
  1549.        ⁿber das SR_ReqWindow-Tag zu Σndern.
  1550.  
  1551.  
  1552. 1.6.15 SetProcessWindow  (V38.0)
  1553.  
  1554.        Umleiten der Requester
  1555.  
  1556.        struct Window *SetProcessWindow(struct Window *window{A0});
  1557.  
  1558.        Es wird der pr_WindowPtr-Eintrag der Process-Struktur auf window ge-
  1559.        setzt und der alte Wert wird zurⁿckgeliefert. Sie sollten sich
  1560.        diesen Wert merken und am Ende des Programm diesen wieder herstellen.
  1561.        (siehe auch CreateGUIInfoTags und set/restore-ProcessWindow)
  1562.  
  1563.  
  1564. 1.6.16 SimpleReq  (V38.0)
  1565.  
  1566.        Zeigt den entsprechenden Requester an.
  1567.  
  1568.        LONG SimpleReq(STRPTR text{A0},
  1569.                       ULONG  kind{D0});
  1570.  
  1571.        Es wird ShowRequester aufgerufen mit den Parametern:
  1572.  
  1573.          ShowRequester(NULL, text, kind, NULL)
  1574.  
  1575.  
  1576. 1.7 GUITools-Gadgets
  1577.     ----------------
  1578.  
  1579. 1.7.1 CreateSpecialGadget (V38)  / CreateSpecialGadgetTag (V38)
  1580.  
  1581.       GUITools-Gadgets erstellen
  1582.  
  1583.       void CreateSpecialGadget(struct GUIInfo *gui{A0},
  1584.                                WORD   left{D0},
  1585.                                WORD   top{D1},
  1586.                                WORD   width{D2},
  1587.                                WORD   height{D3},
  1588.                                ULONG  kind{D4},
  1589.                                ULONG  tagitem, tagdata, ...{A1});
  1590.  
  1591.            oder
  1592.  
  1593.       void CreateSpecialGadgetTag(struct GUIInfo *gui{A0},
  1594.                                   WORD   left{D0},
  1595.                                   WORD   top{D1},
  1596.                                   WORD   width{D2},
  1597.                                   WORD   height{D3},
  1598.                                   ULONG  kind{D4},
  1599.                                   struct TagItem tags{A1});
  1600.  
  1601.       Es wird eins der GUITools-eigenen Gadgets erstellt, das Sie im
  1602.       weiteren genauso wie die GadTools-Gadgets behandlen k÷nnen.
  1603.       Es wird keine Fehlermeldung ausgegeben, falls das Gadget
  1604.       nicht erstellt werden konnte. Dies geschieht spΣter ⁿber SetGUI().
  1605.       Fⁿr jedes Gadget wird im UserData-Eintrag der Gadget-Struktur noch
  1606.       ein Zeiger auf folgende Struktur angelegt ab (V38.0):
  1607.  
  1608.       struct GUIGadgetInfo {
  1609.         APTR  userData;      hier k÷nnen eigene Daten eingetragen werden
  1610.         ULONG kind;          Gadget-Kind
  1611.       };
  1612.  
  1613.       Dieser Zeiger darf nicht verΣndert werden. Wird der userData-Eintrag
  1614.       selber ben÷tigt, so mu▀ der userData^.userData-Eintrag dafⁿr genutzt
  1615.       werden ! GUITools setzt diesen userData-Eintrag automatisch auf den in
  1616.       der NewGadget-Struktur angegebenen.
  1617.       ▄ber kind k÷nnen Sie selber nachfragen, um was fⁿr ein Gadget es
  1618.       sich eigentlich handelt.
  1619.  
  1620.       Ist GFLG_AddBorderDims in gui->flags gesetzt, so wird zu left noch
  1621.       window->BorderLeft und zu top noch window->BorderTop hinzuaddiert,
  1622.       damit die Gadgets, egal welchen Font Sie benutzen, immer im inneren
  1623.       des Windows liegen.
  1624.  
  1625.  
  1626. 1.8 Refresh-Funktionen
  1627.     ------------------
  1628.  
  1629. 1.8.1 BeginRefresh  (V38)
  1630.  
  1631.       Ersatz fⁿr GadTools.GTBeginRefresh
  1632.  
  1633.       void BeginRefresh(struct GUIInfo *gui{A0});
  1634.  
  1635.       Diese Funktion mu▀ anstelle von GadTools.GTEndRefresh benutzt
  1636.       werden, da GUITools noch einige Refresh-Funktionen ausfⁿhrt, um
  1637.       z.B. die GUITools-Gadgets zu refreshen.
  1638.  
  1639.  
  1640. 1.8.2 EndRefresh  (V38)
  1641.  
  1642.       Ersatz fⁿr GadTools.GTEndRefresh
  1643.  
  1644.       void EndRefresh(struct GUIInfo *gui{A0},
  1645.                       UBYTE  complete{D0});
  1646.  
  1647.       Diese Funktion mu▀ anstelle von GadTools.GTEndRefresh benutzt
  1648.       werden, da GUITools noch einige Refresh-Funktionen ausfⁿhrt, um
  1649.       z.B. die GUITools-Gadgets zu refreshen.
  1650.       Haben Sie beim Aufruf von CreateGUIInfoTags noch GUI_RefreshWindow-
  1651.       Frame gesetzt bzw GUI_ResizableGads gesetzt, dann wird nun auch
  1652.       noch zusΣtzlich der Window-Rahmen erneuert mit Hilfe der Refresh-
  1653.       WindowFrame-Funktion von Intuition.
  1654.  
  1655.  
  1656.  
  1657. 2. Arbeiten mit GUITools
  1658.    =====================
  1659.  
  1660. 2.1 Richtlinien
  1661.     -----------
  1662.  
  1663.     Die GUIInfo-Struktur, die bei fast allen Prozeduren mit ⁿbergeben
  1664.     werden mu▀, enthΣlt alle wichtigen Werte. Diese Struktur ist aber
  1665.     teilweise PRIVATE, d.h. es gibt einige Felder, die Sie nicht be-
  1666.     rⁿhren dⁿrfen ! Des weiteren ist die enthΣlt die Struktur am Ende
  1667.     noch weitere private EintrΣge, auf die Sie nicht zugreifen k÷nnen.
  1668.     Daraus resultiert, da▀ diese Struktur NIE von Hand erstellt werden
  1669.     darf, immer nur ⁿber CreateGUIInfo / CreateGUIInfoTags ab (V38.0).
  1670.     Genauso mu▀ sie, ob SetGUI erfolgreich war oder nicht, immer ⁿber
  1671.     FreeGUIInfo freigegeben werden !
  1672.     Die GUIInfo-Struktur wird sich im Aufbau, d.h. die PRIVATE Felder,
  1673.     und auch in der LΣnge verΣndern. Solange Sie nur die dokumentier-
  1674.     ten EintrΣge benutzen, kann nichts passieren.
  1675.     Setzen Sie bei den Flags nur die bekannten, alle anderen mⁿ▀en
  1676.     wegen der AufwΣrtskompatibilitΣt gel÷scht sein !
  1677.  
  1678.     Benutzen Sie bitte keine Prozeduren aus der GadTools.library zu-
  1679.     sammen mit GUITools. GUITools bietet fⁿr fast alle Funktionen der
  1680.     GadTools-Library Ersatz an (bis auf die Filter-Funktionen und
  1681.     die GTGetGadgetAttrsA-Funktion der Version 39).
  1682.  
  1683.     ACHTUNG: Bis auf FreeGUIInfo fⁿhrt keine der Prozeduren, die einen
  1684.              GUIInfoPtr erwarten, einen NULL-Check fⁿr diesen durch.
  1685.     Dieses mu▀ nach dem Aufruf von CreateGUIInfo / CreateGUIInfoTags
  1686.     ab (V38.0) selber durchgefⁿhrt werden !
  1687.     Genauso wird kein RangeCheck bei den Funktionen durchgefⁿhrt, die
  1688.     eine Gadget-Nummer erwarten !
  1689.  
  1690.     GUITools benutzt zum Merken eigener interner Werte fⁿr die Gadgets
  1691.     den userData-Eintrag der Gadget-Struktur. D.h. dieser kann nicht
  1692.     mehr direkt zur Speicherung von eigenen Daten verwendet werden,
  1693.     ansonsten kommt es zu folgenschweren Kollisionen. Sie k÷nnen aber
  1694.     trotzdem eigene Daten zu jedem Gadget in der von GUITools erstell-
  1695.     ten Struktur mit speichern. (s. CreateGadget)
  1696.  
  1697.     Obwohl es m÷glich ist, den Gadgets willkⁿrlich IDs zuzuordnen, ist
  1698.     es sinnvoller, die normale Reihenfolge (also erstes Gadget die ID 0,
  1699.     zweites ID 1 usw.) einzuhalten. Denn einige Prozeduren zur Manipu-
  1700.     lation von Gadgets erwarten als Argument nicht die ID sondern die
  1701.     Nummer (z.B ModifyGadget, GadgetStatus etc).
  1702.     Wenn diese beiden Zahlen aber nicht ⁿbereinstimmen, mⁿssen Sie selber
  1703.     fⁿr die entsprechende Umrechnung sorgen. Ab (V38.0) erhalten Sie bei
  1704.     IntuiMessages automatisch nicht nur die Gadget-ID, sondern auch noch
  1705.     die Gadget-Nummer, so da▀ hier eine Umrechnung entfallen kann.
  1706.  
  1707.     Wenn Sie irgendetwas (Screens, Windows, Fonts etc) ⁿber GUITools
  1708.     anfordern, mⁿssen Sie diese auch wieder mit Funktionen von GUITools
  1709.     zurⁿckgeben.
  1710.  
  1711.  
  1712. 2.2 Resourcenfreigabe (V38.0)
  1713.     -------------------------
  1714.  
  1715.     Generell gilt, alles was Sie ⁿber GUITools anfordern, mⁿssen Sie auch
  1716.     spΣter wieder zurⁿckgeben ⁿber entsprechende Funktionen.
  1717.     Es gibt hier aber zwei kleine nⁿtzliche Ausnahmen:
  1718.  
  1719.     1. Fⁿr mit OpenIntWindow / OpenIntWindowTags angeforderte Windows reicht
  1720.        es aus, CloseIntWindow aufzurufen. Sie ben÷tigen dann keinen Aufruf
  1721.        vorher von FreeGUIInfo.
  1722.  
  1723.     2. Fⁿr mit OpenIntScreen angeforderte Screens reicht es aus, diese wieder
  1724.        ⁿber CloseIntScreen zu schlie▀en. Alle Windows die zu dem Zeitpunkt
  1725.        noch ge÷ffnet sind werden automatisch vorher mit Hilfe von
  1726.        CloseIntWindow geschlossen.
  1727.  
  1728.     Dadurch ersparen Sie beim Schlie▀en die Abfragen, ob das vorherige
  1729.     ÷ffnen ⁿberhaupt erfolgreich war. Eine Abfrage, ob der Screen auf ist,
  1730.     reicht aus, bzw das Window, wenn kein eigener Screen benutzt wird.
  1731.  
  1732.  
  1733. 2.3 Menⁿ-Erstellung
  1734.     ---------------
  1735.  
  1736.     Will man folgendes Menⁿ erstellen, genⁿgen die darauf folgenden
  1737.     Aufrufe: (GUI steht fⁿr einen vorher erstellen Zeiger auf eine GUIInfo-
  1738.     Struktur !)
  1739.  
  1740.         PROJEKT     EDIT
  1741.       -------------------------------------------------
  1742.         LOAD        CUT
  1743.         SAVE        PASTE
  1744.         QUIT
  1745.  
  1746.       MakeMenuEntry(GUI, NM_TITLE, "PROJEKT", NULL);
  1747.       MakeMenuEntry(GUI, NM_ITEM,  "LOAD", "L");
  1748.       MakeMenuEntry(GUI, NM_ITEM,  "SAVE", "S");
  1749.       MakeMenuEntry(GUI, NM_ITEM,  "QUIT", "Q");
  1750.       MakeMenuEntry(GUI, NM_TITLE, "EDIT", NULL);
  1751.       MakeMenuEntry(GUI, NM_ITEM,  "CUT", "C");
  1752.       MakeMenuEntry(GUI, NM_ITEM,  "PASTE", "V");
  1753.  
  1754.  
  1755.     Bei der Abfrage ist zu beachten, da▀, wenn Sie unter (V37.3) arbeiten
  1756.     oder aber nicht GetIntMsg bzw WaitIntMsg benutzen, Sie selber dafⁿr
  1757.     verantwortlich sind, die Mehrfachauswahl von Menu-(Sub-)Items zu ver-
  1758.     arbeiten.
  1759.     Ab (V38.0) erhalten Sie ⁿber mehrfachen Aufruf von GetIntMsg/WaitIntMsg
  1760.     automatisch nacheinander alle Auswahlen der Mehrfachauswahl, so als
  1761.     wΣren die Items nicht gleichzeitig, sondern nacheinander ausgewΣhlt
  1762.     worden.
  1763.     Sie k÷nnen nun nach jedem Aufruf von MakeMenuEntry die soeben erstellte
  1764.     NewMenu-Struktur ⁿber GUI->newmenu->allMenus[GUI->actmenu-1] bzw ab
  1765.     (V38.0) ⁿber GUI->menuAdr erreichen und dort weitere Werte eintragen,
  1766.     z.B. den userData-Eintrag belegen.
  1767.  
  1768.  
  1769. 2.4 Font-Behandlung
  1770.     ---------------
  1771.  
  1772.     Der von TopazAttr() gelieferte Zeiger auf den topaz/8-Font kann
  1773.     z.B. bei OpenIntScreen/OpenIntScreenTags (V38.0) benutzt werden,
  1774.     um sicher zu gehen, welchen Font Ihr Screen benutzt.
  1775.     Sehr nⁿtzlich ist dieser Zeiger aber auch zur Erstellung von
  1776.     Gadgets auf einem Public-Screen, indem man diesen Zeiger in das
  1777.     newgad.ng_TextAttr-Feld der GUIInfo-Struktur eintrΣgt. Dadurch
  1778.     l÷st man das Problem, sein GUI an einen unbekannten Font anzu-
  1779.     passen. Dieses tut z.B. die gesamte Systemsoftware.
  1780.     Man mu▀ sich nur noch an den Font anpassen, der in der Titel-
  1781.     zeile benutzt wird.
  1782.     Sehr einfach geht dies durch Benutzung von CreateGUIInfoTags (V38.0)
  1783.     und dem setzen von GFLG_AddBorderDims im flags-Feld. Dadurch sind die
  1784.     Gadgets immer im inneren des Windows. Gleichzeitig gibt man bei den
  1785.     Tags unter GUI_GadFont TopazAttr() an.  Nun sollte man vorher beim
  1786.     ╓ffnen des Windows noch die Tags WA_InnerWidth, WA_InnerHeight und
  1787.     WA_AutoAdjust benutzt haben mit Hilfe von OpenIntWindowTags (V38.0).
  1788.     Und schon haben Sie immer, egal welche Voreinstellungen fⁿr den
  1789.     Public-Screen wirksam sind, ein vernⁿnftig aussehendes GUI, das
  1790.     immer auf den Screen pa▀t.
  1791.  
  1792.  
  1793. 2.5 Key-Equivalente (V38.0)
  1794.     -----------------------
  1795.  
  1796.     Es ist sehr schade, da▀ GadTools die Key-Equivalente nur dadurch
  1797.     unterstⁿtzt, da▀ die entsprechenden Zeichen optisch hervorgehoben
  1798.     werden.
  1799.     GUITools geht hier ein paar entscheidene Schritte weiter:
  1800.     Setzen Sie vor dem Erstellen Ihrer Gadgets das Flag GFLG_VanillaKeyNo-
  1801.     tify und nun merkt sich GUITools alle Buchstaben-Key-Equivalente.
  1802.     Setzen Sie noch zusΣtzlich das GFLG_ConvertKeys-Flag und nun erhalten
  1803.     Sie nach einem Aufruf von WaitIntMsg / GetIntMsg nur noch Intui-
  1804.     Messages fⁿr Gadgets. GUITools wandelt automatisch die IDCMP_VANILLAKEY-
  1805.     Messages in die entsprechenden Gadget-Messages um.
  1806.     Dabei mⁿssen Sie aber beachten, da▀ GUITools nur die entsprechenden
  1807.     Felder in der GUIInfo-Struktur abΣndert, die Felder im im-Feld
  1808.     bleiben unverΣndert ! Sie mⁿssen also immer die Felder der GUIInfo-
  1809.     Struktur abfragen (msgClass, cardCode etc.)
  1810.     Was macht man aber, wenn man Key-Equivalente haben will, die nicht
  1811.     (nur) aus Buchstaben bestehen, wie z.B. der AmigaGuide (> und <) ?
  1812.     Wenn Sie nicht das Flag GFLG_AllowAllVanillaKeys gesetzt haben, wird
  1813.     sich GUITools weigern, diese ⁿberhaupt zu verarbeiten. Ist dieses
  1814.     Flag gesetzt, so k÷nnen Sie solche Gadgets zwar generieren, aber
  1815.     die Abfrage geschieht noch nicht von selbst.
  1816.     Dafⁿr wurde die VanKeyFct geschaffen. Diese Funktion wird, wenn
  1817.     vorher das Flag GFLG_CallVanillaKeyFct gesetzt wurde, und im vanKeyHook-
  1818.     Feld der GUIInfo-Struktur ein Zeiger auf eine entsprechende Funktion
  1819.     angegeben wurde, automatisch aufgerufen.
  1820.     Sie bekommt in D0 den VanillaKey-Code und in A0 und A1 einen Zeiger
  1821.     auf ein WORD.
  1822.     Diese Funktion mu▀ nun schauen, ob die Taste zu einem Gadget pa▀t,
  1823.     diese Nummer dann in den WORD-Wert auf den A0 zeigt, eintragen
  1824.     und noch in dem WORD-Wert auf den A1 zeigt, angeben, ob die das
  1825.     Gadget so ausgewertet werden soll, als ob SHIFT gedrⁿckt wurde,
  1826.     oder ganz normal. Fⁿr ganz normal geben Sie eine 0 an, ansonsten
  1827.     eine 1. Wenn Sie die Taste verwerten konnten, liefern Sie 1 zurⁿck,
  1828.     ansonsten FALSE.
  1829.     Beispiel: Angenommen, Sie wollen den AmigaGuide nachprogrammieren.
  1830.               Abgesehen von vielen anderen Gadgets haben Sie das
  1831.               'Browse _<'- und das 'Browse _>' - Gadget. Das erstere
  1832.               davon habe die ID 5 und das zweite die ID 6.
  1833.               Ihre VanKeyFct k÷nnte dann so aussehen:
  1834.  
  1835.       ULONG KeyFctDemo(register __d0 char key ;
  1836.                        register __a0 WORD *nbr;
  1837.                        register __a1 WORD *shift);
  1838.       /* geta4 ist nicht notwendig, da keine globalen Variablen ben÷tigt
  1839.          werden ! */
  1840.       {
  1841.         if (key == '<')
  1842.         {
  1843.           *nbr   = 5;
  1844.           *shift = 0;
  1845.           return 1;
  1846.         }
  1847.         if (key == '>')
  1848.         {
  1849.           *nbr   = 6;
  1850.           *shift = 0;
  1851.           return 1;
  1852.         }
  1853.         return 0;
  1854.       }
  1855.  
  1856.       Mit dieser Hook-Funktion k÷nnen Sie jede X-beliebige Taste jedem
  1857.       Gadget zuordnen und Sie brauchen sich ⁿberhaupt nicht mehr darum
  1858.       zu kⁿmmern, ob die Taste gedrⁿckt wurde oder das Gadget. Fⁿr die
  1859.       Abfrage sieht beides gleich aus.
  1860.  
  1861.  
  1862. 2.6 Resizable Gadgets (V38.0)
  1863.     -------------------------
  1864.  
  1865. 2.6.1 Einleitung
  1866.  
  1867.       In letzter Zeit kommt es immer mehr in Mode, die OberflΣchen Font-
  1868.       Sensitive und gr÷▀enverΣnderbar zu gestalten.
  1869.       Das ist auch mit GUITools m÷glich. Sie werden dabei durch mehrere
  1870.       Funktionen unterstⁿtzt, die es erlauben, die OberflΣche an neue
  1871.       Situationen anzupassen.
  1872.  
  1873. 2.6.2 Font-Sensitive
  1874.  
  1875.       Die Gr÷▀e des Windows mⁿ▀en Sie zuerst selber berechnen. Rufen Sie
  1876.       dann OpenIntWindowTags mit den Tags WA_InnerWidth, WA_InnerHeight und
  1877.       WA_AutoAdjust, 1 auf.
  1878.       Damit Ihre Gadgets immer im Inneren liegen, setzen Sie das Flag
  1879.       GFLG_AddBorderDims und schon sind alle Probleme verschwunden. Benutzen
  1880.       Sie auf jedem Fall CreateGUIInfoTags und nicht CreateGUIInfo.
  1881.       (s. Font-Behandlung)
  1882.  
  1883. 2.6.3 Resizable-Gadgets
  1884.  
  1885.       Zuerst mⁿ▀en Sie beim Aufruf von CreateGUIInfoTags das Tag
  1886.       GUI_ResizableGads mit dem Wert 1 angeben.
  1887.       Wenn Sie nun die Nachricht bekommen, da▀ sich die Gr÷▀e des Windows
  1888.       geΣndert hat, rufen Sie fⁿr jedes Gadget ResizeGadget auf und
  1889.       ⁿbergeben dort die neuen Werte.
  1890.       Danach reicht der Aufruf von RedrawGadgets und Ihre OberflΣche fⁿllt
  1891.       wieder das Window optimal aus.
  1892.       GUITools unterstⁿtzt Sie momentan noch nicht in der Berechnung der
  1893.       neuen Positionen und Gr÷▀en der Gadgets. Darum mⁿssen Sie sich noch
  1894.       selber kⁿmmern.
  1895.       Verwenden Sie Gadgets vom Typ GENERIC_KIND oder solche bei denen Sie
  1896.       nach dem Aufruf von CreateGadget noch selber Hand anlegen und Werte
  1897.       hinzufⁿgen (meistens eben bei GENERIC_KIND), dann mⁿssen Sie auf
  1898.       jedem Fall RedrawGadgets(GUI, 0) aufrufen, da sich GUITools die
  1899.       VerΣnderungen, die Sie sozusagen von Hand gemacht haben, nicht
  1900.       merken kann. Fⁿgen Sie nach diesem Aufruf also noch die VerΣnderungen
  1901.       der betroffenen Gadgets ein und rufen dann SetGUI auf.
  1902.  
  1903.  
  1904. 2.7 GUITools-Gadgets (V38.0)
  1905.     ------------------------
  1906.  
  1907. 2.7.1 Einfⁿhrung
  1908.  
  1909.       GUITools stellt Ihnen einige nⁿtzliche Gadgets zur Verfⁿgung, mit
  1910.       denen das Erstellen und VerΣndern der OberflΣche einfacher wird.
  1911.       In Wirklichkeit sind die GUITools-Gadgets keine echten Gadgets,
  1912.       sie werden nur simuliert.
  1913.       Sie k÷nnen die Gadgets mit CreateSpecialGadget erstellen. ▄ber
  1914.       die Tags k÷nnen Sie das Aussehen folgenderma▀en verΣndern:
  1915.  
  1916.         SG_GadgetText : Hier k÷nnen Sie einen Zeiger auf den Gadget-Text
  1917.                         angeben.
  1918.         SG_GadgetFlags: Geben Sie hier die Flags fⁿr NewGadget an.
  1919.  
  1920.       Nach dem Erstellen k÷nnen Sie mit den Gadgets genauso verfahren,
  1921.       wie mit den GadTools-Gadgets, d.h. ModifyGadget, ResizeGadget usw
  1922.       k÷nnen ohne weiteres benutzt werden. Es darf nur nicht der
  1923.       Gadget-Zeiger aus der Gadget-Liste (gui->gadgets->allGadgets[x]) benutzt
  1924.       werden, da dieser auf eine Dummy-Gadget-Struktur zeigt !
  1925.  
  1926.  
  1927. 2.7.2 ProgressIndicator-Kind
  1928.  
  1929.       Dieses Gadget bietet einen Balken, der z.B. anzeigt, wie weit
  1930.       ein entsprechender Vorgang schon fortgeschritten ist.
  1931.  
  1932.         kind = progressIndicatorKind
  1933.  
  1934.       Sie k÷nnen folgende Tags angeben (Erstellen und ─ndern):
  1935.  
  1936.         SGPI_MaxValue : (Default 100) Gibt an, in wieviele Teile das
  1937.                        Gadget eingeteilt werden soll.
  1938.         SGPI_CurrentValue : (Default 0) Gibt an, wieviel schon erreicht
  1939.                            ist.
  1940.  
  1941.       Der Gadget-Text sollte nicht in das Gadget geschrieben werden und
  1942.       er darf keinen Underscore enthalten.
  1943.       Dieses Gadget ist ein reines Anzeige-Gadget, d.h. es sendet nie-
  1944.       mals IntuiMessages.
  1945.  
  1946.  
  1947. 2.7.3 BevelBox-Kind
  1948.  
  1949.       Dieses Gadget stellt eine BevelBox dar, die entweder recessed ist
  1950.       oder nicht.
  1951.  
  1952.         kind = bevelboxKind
  1953.  
  1954.       Beim Erstellen k÷nnen Sie folgende Tags angeben:
  1955.  
  1956.         SGBB_Recessed : (Default 0) Gibt an, ob die Box recessed sein
  1957.                         soll oder nicht.
  1958.  
  1959.       BevelBox-Gadgets sollten in der aktuellen Version nicht mit Text
  1960.       versehen werden.
  1961.       Da das BevelBox-Gadget in Wirklichkeit kein echtes Gadget ist,
  1962.       k÷nnen sich innerhalb der Box ruhig andere Gadgets befinden !
  1963.       Dieses Gadget ist ein reines Anzeige-Gadget, d.h. es sendet nie-
  1964.       mals IntuiMessages.
  1965.  
  1966.  
  1967. 2.8 Requester (V38.0)
  1968.     -----------------
  1969.  
  1970. 2.8.1 Requester umleiten (V38.0)
  1971.  
  1972.       Wenn Sie ab (V38.0) CreateGUIInfoTags benutzen, so haben Sie die
  1973.       M÷glichkeit, automatisch den pr_WindowPtr-Eintrag der Process-Struktur
  1974.       auf das Window zu setzen, so da▀ alle Requester nun an der richtigen
  1975.       Stelle erscheinen.
  1976.       Genauso k÷nnen Sie erreichen, da▀ bei einem Aufruf von FreeGUIInfo
  1977.       automatisch der alte Wert, der vor dem Aufruf von CreateGUIInfoTags dort
  1978.       war, in den pr_WindowPtr-Eintrag der Process-Struktur zurⁿckgeschrieben
  1979.       wird.
  1980.       Solange Sie nur ein einziges Window benutzen gibt es hier keine Probleme.
  1981.       Sobald Sie aber mehrere Windows benutzen, sollten Sie folgendes beachten,
  1982.       wenn Sie GUI_SetProcessWindow und GUI_RestoreProcessWindow eingeschaltet
  1983.       haben:
  1984.       Sie ÷ffnen das erste Window, der Eintrag in der Process-Struktur wird
  1985.       geΣndert, der alte Wert wird gemerkt. Sie ÷ffnen nun ein weiteres
  1986.       Window, nun wird wieder der Eintrag der Process-Struktur geΣndert und
  1987.       der alte Wert, also ein Zeiger auf das erste Window (!), gemerkt.
  1988.       Beim Schlie▀en der Windows bzw beim freigeben ⁿber FreeGUIInfo (das
  1989.       ja automatisch ⁿber CloseIntWindow ausgefⁿhrt wird) mⁿ▀ten Sie also
  1990.       in umgekehrter Reihenfolge vorgehen, um den richtigen Wert wieder
  1991.       in der Process-Struktur zu haben.
  1992.       Wenn Sie nun aber schlau (?) waren und benutzen CloseIntScreen, um
  1993.       alle Windows zu entfernen (oder eine Σhnliche Methode), so haben
  1994.       Sie keine Kontrolle mehr darⁿber, in welcher Reihenfolge die Windows
  1995.       geschlossen werden ! Also sollten Sie bei mehreren Windows immer nur
  1996.       bei einem einzigen Window das GUI_RestoreProcessWindow-Tag setzen und
  1997.       bei allen anderen l÷schen.
  1998.  
  1999.       Eigene Requester k÷nnen Sie bequem mit ShowRequester (V38.0) auf den
  2000.       Screen des Windows bringen, dafⁿr mⁿssen Sie nicht den Eintrag in der
  2001.       Process-Struktur verΣndern. Lediglich fⁿr System-Requester ist dieses
  2002.       angebracht.
  2003.  
  2004. 2.8.2 Eigene Requester (V38.0)
  2005.  
  2006.       Sie k÷nnen eigene Requester leicht mit der ShowRequester-Funktion
  2007.       erstellen. Dabei kennt GUITools schon ein paar vordefinierte Re-
  2008.       quester:
  2009.  
  2010.        okReqKind    : Dieser Requester enthΣlt nur ein Gadget mit dem Text
  2011.                       "OK". Im normalfall wird dann reqOK zurⁿckgeliefert.
  2012.        doitReqKind  : Dieser Requester enthΣlt die Gadgets "YES" und "NO".
  2013.                       Es wird entweder reqDo fⁿr "YES" oder reqLeave fⁿr
  2014.                       "NO" zurⁿckgeliefert.
  2015.        yncReqKind   : Yes-No-Cancel-Requester. Er enthΣlt die Gadgets
  2016.                       "YES", "NO" und "CANCEL" und liefert entsprechend
  2017.                       reqYes, reqNo oder reqCancel zurⁿck.
  2018.  
  2019.      Bei den vordefinierten Requester mⁿ▀en Sie das SR_Gadgets-Tag nicht
  2020.      mehr mit angeben. Sie k÷nnen es aber tun, um z.B. deutsche Texte
  2021.      anzuzeigen.
  2022.      Wollen Sie einen absolut eigenen Requester haben, benutzen Sie den
  2023.      generalReqKind. Jetzt mu▀ aber unbedingt das SR_Gadgets-Tag angegeben
  2024.      werden. Intern wird die EasyRequestArgs-Funktion von Intuition be-
  2025.      nutzt. Sie k÷nnen ⁿber entsprechende Tags alle Werte der EasyStruct-
  2026.      Struktur angeben.
  2027.      ShowRequester liefert den Wert von EasyRequestArgs zurⁿck.
  2028.      ▄bergeben Sie einen GUIInfo-Zeiger, so erscheint der Requester auf
  2029.      dem damit spezifizierten Window. Bei NULL dafⁿr wird der Eintrag der
  2030.      Process-Struktur benutzt.
  2031.      Diesen k÷nnen Sie mit der SetProcessWindow-Funktion verΣndern. Aber
  2032.      setzen Sie ihn immer am Ende des Programms zurⁿck !
  2033.  
  2034.      Einfacher geht es mit der SimpleReq - Funktion. Hier k÷nnen Sie nur
  2035.      einen Text und den Requester-Kind ⁿbergeben. Der Requester erscheint
  2036.      immer auf dem ⁿber die Process-Struktur angegebenen Window.
  2037.  
  2038.  
  2039. 3. Fehler / Bugs / Probleme
  2040.    ========================
  2041.  
  2042. 3.1 Probleme bei V37.3
  2043.     ------------------
  2044.  
  2045. 3.1.1 CreateGUIInfo - CreateGUIInfoTags / CreateGUIInfoTagList
  2046.       (Menu-Font-Behandlung)
  2047.  
  2048.       Zu spΣt erkannte ich, da▀ es nicht sehr sinnvoll ist, fⁿr die Menⁿleiste
  2049.       den Font des Windows zu benutzen. Solange man - wie ich - immer einen
  2050.       eigenen Screen benutzt, der denselben Font wie das Window hat, gibt es
  2051.       logischerweise keine Probleme.
  2052.       ╓ffnet man hingegen ein Window auf dem Public-Screen (Workbench), so
  2053.       kann das doch unter UmstΣnden unsch÷n aussehen.
  2054.       Also mⁿ▀te man fⁿr die Menⁿs den Screen-Font benutzen. Nun einfach
  2055.       gesagt, aber so wie die GUIInfo-Struktur aufgebaut war in (V37.3), so
  2056.       war es nicht mehr so einfach m÷glich, dieses auf einem kompatiblen Weg
  2057.       in (V38.0) zu beheben.
  2058.       Also tritt dieses Problem weiterhin auf, wenn Sie CreateGUIInfo benutzen,
  2059.       um eben bei gleichen Eingaben die gleichen Ausgaben zu haben (wenn diese
  2060.       auch nicht immer sinnvoll sind). Dann mⁿ▀en Sie von Hand die Font-Zeiger
  2061.       verbiegen.
  2062.       Ab (V38.0) mⁿssen Sie nur noch CreateGUIInfoTags/CreateGUIInfoTagList
  2063.       benutzen, diese Routine erledigt das dann von selbst.
  2064.  
  2065.  
  2066. 3.1.2 OpenIntWindow - OpenIntWindowTags / OpenIntWindowTagList (Screen-Titel)
  2067.  
  2068.       Genauso, wie bei dem Menu-Font, erkannte ich spΣter, da▀ es bei Windows
  2069.       auf dem Public-Screen (Workbench) nicht immer Sinn macht, den Screen-
  2070.       Titel auf den eigenen Window-Titel zu setzen.
  2071.       Um aber kompatibel zu bleiben, wurde diese Funktion nicht ausgebaut.
  2072.       OpenIntWindow setzt immer noch das WA_ScreenTitle-Tag auf den Titel des
  2073.       Windows. Wenn Sie ab (V38.0) OpenIntWindowTags/OpenIntWindowTagList
  2074.       benutzen, so ist dieses nicht mehr der Fall. (Sie k÷nnen dann aber
  2075.       selber das Tag mit angeben.)
  2076.  
  2077.  
  2078. 3.1.3 IDCMP_MenuPick-Messages
  2079.  
  2080.       Unter (V37.3) wurde bei IDCMP_MenuPick-Messages nicht berⁿcksichtigt,
  2081.       da▀ es auch m÷glich ist, mehrere Menu-(Sub-)Items gleichzeitig auszu-
  2082.       wΣhlen. Man mu▀ sich dann selber darum kⁿmmern.
  2083.       Ab (V38.0) entfΣllt dieses, solange Sie GetIntMsg bzw WaitIntMsg benutzen.
  2084.       Tun Sie dieses nicht und rufen HandleIntMsg selber auf, so erhalten
  2085.       Sie nur die erste Auswahl von m÷glicherweise mehreren. Dieses mⁿssen Sie
  2086.       dann selber abfragen.
  2087.  
  2088.  
  2089. 3.2 Bekannte Fehler
  2090.     ---------------
  2091.  
  2092.     Bis jetzt sind keine Fehler oder Probleme mit GUITools aufgetreten und
  2093.     bei mir lΣuft  die Library tΣglich in vielen verschiedenen Programmen.
  2094.     Das hei▀t natⁿrlich nicht, da▀ wirklich alle Fehler gefunden sind. Ich
  2095.     hoffe aber, da▀ ich mittlerweile alle GRO▀EN FEHLER behoben habe.
  2096.     Solange man sich an die Richtlinien hΣlt  und sich sΣmtliche Beschrei-
  2097.     bungen genau durchgelesen hat, mⁿ▀te eigentlich alles klappen.
  2098.     Sollte aber doch einmal ein Fehler oder ein Problem auftreten, verfah-
  2099.     ren Sie bitte wie folgt:
  2100.  
  2101.     1.  Lokalisieren Sie den Fehler so genau wie m÷glich.
  2102.     2.  Benachrichtigen Sie mich bitte und teilen Sie mir bitte (falls
  2103.         m÷glich) eine genaue Fehlerbeschreibung und falls vorhanden auch
  2104.         Fehlerursachen bzw Fehlerbehebung mit.
  2105.  
  2106.     Sobald mir ein Fehler bekannt wird,  werde ich mich bemⁿhen, diesen zu
  2107.     beseitigen.
  2108.  
  2109.  
  2110. 3.3 Autor
  2111.     -----
  2112.  
  2113.     VorschlΣge, Fehlerberichte, Verbesserungen, Erweiterungen und natⁿr-
  2114.     lich auch Anerkennung k÷nnen an die folgende Adresse gesendet werden:
  2115.  
  2116.     Carsten Ziegeler
  2117.     Augustin-Wibbelt-Str. 7
  2118.     D-33106 Paderborn
  2119.     Germany
  2120.  
  2121.     Bitte beachten Sie, da▀ ich fⁿr zugeschickte Unterlagen keine Haftung
  2122.     ⁿbernehme und Ihnen diese nur dann zurⁿcksenden kann, wenn ausreichend
  2123.     Rⁿckporto beigefⁿgt ist. Jede Zusendung erfolgt freiwillig.
  2124.  
  2125.     Sie k÷nnen mich auch unter folgender EMail-Adresse ereichen:
  2126.  
  2127.          tarot@uni-paderborn.de
  2128.  
  2129.  
  2130.     Enjoy it !
  2131.  
  2132.