home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Monster Media 1994 #1
/
monster.zip
/
monster
/
PROG_GEN
/
GUITLS38.ZIP
/
GUITOOLS.DOK
< prev
next >
Wrap
Text File
|
1994-02-27
|
94KB
|
2,132 lines
GUITools
Version 38.0
SASC-Dokument
============================================================================
Feb 1994 Carsten Ziegeler
Augustin-Wibbelt-Str.7
D-33106 Paderborn
Germany
============================================================================
Inhalt:
=======
1. Funktionsbeschreibungen
1.1 Funktionsⁿbersicht
1.2 Screen/Window
1.3 Fonts
1.4 GUI-Erstellung
1.5 GUI-Abfrage
1.6 GUI-Bearbeitung
1.7 GUITools-Gadgets
1.8 Refresh-Funktionen
2. Arbeiten mit GUITools
2.1 Richtlinien
2.2 Resourcenfreigabe
2.3 Menⁿ-Erstellung
2.4 Font-Behandlung
2.5 Key-Equivalente
2.6 Resizable-Gadgets
2.7 GUITools-Gadgets
2.8 Requester
3. Fehler / Bugs / Probleme
3.1 Probleme bei V37.3
3.2 Bekannte Fehler
3.3 Autor
1. Funktionsbeschreibung
=====================
1.1 Funktionsⁿbersicht (V38.0)
--------------------------
Funktion Kapitel Bemerkung
-----------------------------------------------------------------------
AllVarsToGad 1.6.6 (V38.0)
BeginRefresh 1.8.1 (V38.0)
ClearWindow 1.2.7 (V38.0)
CloseIntWindow 1.2.5
CloseIntScreen 1.2.6
ConvKMsgToGMsg 1.5.5 (V38.0)
CreateGadget 1.4.5
CreateGadgetFull 1.4.7
CreateGadgetFullTag 1.4.7
CreateGadgetTag 1.4.5
CreateGadgetText 1.4.6
CreateGadgetTextTag 1.4.6
CreateGUIInfo 1.4.1
CreateGUIInfoTagList 1.4.2 (V38.0)
CreateGUIInfoTags 1.4.2 (V38.0)
CreateSpecialGadget 1.7.1 (V38.0)
CreateSpecialGadgetTag 1.7.1 (V38.0)
DrawBox 1.6.13 (V38.0)
EmptyIntMsgPort 1.5.3
EndRefresh 1.8.2 (V38.0)
FreeGUIInfo 1.4.3
GadgetStatus 1.6.1
GadWithKey 1.5.6 (V38.0)
GetIntMsg 1.5.2
GetOwnFont 1.3.1
HandleIntMsg 1.5.4
MakeMenuEntry 1.4.9
ModifyGadget 1.6.2
ModifyGadgetTag 1.6.2
NewFontAllGadgets 1.6.12 (V38.0)
NewGadgetFont 1.6.11 (V38.0)
NewGadgetText 1.6.10 (V38.0)
OpenIntScreen 1.2.1
OpenIntScreenTagList 1.2.2 (V38.0)
OpenIntScreenTags 1.2.2 (V38.0)
OpenIntWindow 1.2.3
OpenIntWindowTagList 1.2.4 (V38.0)
OpenIntWindowTags 1.2.4 (V38.0)
RedrawGadgets 1.6.8 (V38.0)
RedrawMenu 1.6.7 (V38.0)
RemoveGadgets 1.4.8 (V38.0)
RemoveMenu 1.4.10 (V38.0)
RemOwnFont 1.3.2
ResizeGadget 1.6.9 (V38.0)
SetGUI 1.4.4
SetProcessWindow 1.6.15 (V38.0)
ShowRequester 1.6.14 (V38.0)
ShowRequesterTag 1.6.14 (V38.0)
SimpleReq 1.6.16 (V38.0)
TopazAttr 1.3.3
UpdateEGad 1.6.3
UpdateEntryGadgets 1.6.4
VarToGad 1.6.5 (V38.0)
WaitIntMsg 1.5.1
Bei der Beschreibung der Funktionen werden nur die wichtigsten Para-
meter erwΣhnt. Die Bedeutung der meisten ergibt sich aus dem Namen.
Steht bei irgendeiner Funktion, Konstanten, Struktur etc. eine Ver-
sionsnummer mit angegeben, so ist diese erst ab dieser Version im-
plementiert und darf unter Σlteren Versionen nicht benutzt werden !
Gegebenenfalls mu▀ Ihr Programm vorher testen, ob die vorhandene
Version der guitools.library fⁿr Ihre Zwecke ausreicht!
Weitere Beschreibungen, Hilfestellungen und Tips erfahren Sie in dem
Kapitel "Arbeiten mit GUITools".
Bei den Parametern der Funktion steht in den {}-Klammern das Register,
in dem der Parameter ⁿbergeben wird. Dieses ist keine C-Notation und
dient lediglich zur Bekanntgabe der ▄bergaberegister !
1.2 Screens / Windows
-----------------
1.2.1 OpenIntScreen
Es wird versucht einen Screen mit den entsprechenden Angaben zu
÷ffnen.
struct Screen *OpenIntScreen(ULONG id{D0},
WORD depth{D1},
STRPTR name{A0},
struct TextAttr * font{A1});
id Screen-Display-ID aus graphics/displayinfo.h oder eine der
vordefinierten:
hiresPalID = HIRES_KEY + PAL_MONITOR_ID
hiresID = HIRES_KEY + DEFAULT_MONITOR_ID
loresPalID = LORES_KEY + PAL_MONITOR_ID
loresID = LORES_KEY + DEFAULT_MONITOR_ID
font NULL fⁿr Default-Font oder eigene TextAttr-Struktur
Intern wird folgende Tag-Liste fⁿr den Screen erzeugt:
SA_Pens = -1
SA_Depth = depth
SA_DisplayID = id
SA_Title = name
SA_Font = font
1.2.2 OpenIntScreenTags (V38.0) / OpenIntScreenTagList (V38.0)
Es wird versucht einen Screen mit den entsprechenden Angaben zu
÷ffnen.
struct Screen *OpenIntScreenTags(ULONG id{D0},
WORD depth{D1},
STRPTR name{A0},
struct TextAttr * font{A1},
ULONG tagitem, tagdata, ...{A2});
oder
struct Screen *OpenIntScreenTagList(ULONG id{D0},
WORD depth{D1},
STRPTR name{A0},
struct TextAttr * font{A1},
strcut TagItem * tags{A2});
id Screen-Display-ID aus graphics/displayinfo.h oder eine der
vordefinierten:
hiresPalID = HIRES_KEY + PAL_MONITOR_ID
hiresID = HIRES_KEY + DEFAULT_MONITOR_ID
loresPalID = LORES_KEY + PAL_MONITOR_ID
loresID = LORES_KEY + DEFAULT_MONITOR_ID
font NULL fⁿr Default-Font oder eigene TextAttr-Struktur
tags Zeiger auf eine eigene Tag-Liste (oder NULL) um den Screen
noch genauer zu beschreiben.
OpenIntScreenTags/OpenIntScreenTagList erzeugt eine TagListe intern,
wie bei OpenIntScreen angegeben, und hΣngt an diese, die unter tags
angegebene.
1.2.3 OpenIntWindow
Versucht ein Fenster auf dem angegebenen Screen zu ÷ffnen.
struct Window *OpenIntWindow(WORD left{D0},
WORD top{D1},
WORD width{D2},
WORD height{D3},
STRPTR name{A0},
ULONG idcmpFlags{D4},
ULONG windowFlags{D5},
struct Screen *screen{A1});
width Breite oder asScreen fⁿr Breite bis zum Screen-Rand
height H÷he oder asScreen fⁿr H÷he bis zum Screen-Rand
screen Zeiger auf eigenen Screen oder NULL fⁿr PublicScreen.
Intern wird folgende TagListe fⁿr das Window erzeugt:
WA_Title = name
WA_ScreenTitle = name
WA_Left = left
WA_Top = top
WA_Width = width (bzw screen->Width -left bei asScreen)
WA_Height = height (bzw screen->height -top bei asScreen)
WA_IDCMP = idcmpFlags
WA_Flags = windowFlags
Bei eigenem Screen
WA_CustomScreen = screen
Bei NULL fⁿr Screen
WA_PubScreen = aktueller Public-Screen
WA_BubScreenFallBack = TRUE
1.2.4 OpenIntWindowTags (V38.0) / OpenIntWindowTagList (V38.0)
Versucht ein Fenster auf dem angegebenen Screen zu ÷ffnen.
struct Window *OpenIntWindowTagList(WORD left{D0},
WORD top{D1},
WORD width{D2},
WORD height{D3},
STRPTR name{A0},
ULONG idcmpFlags{D4},
ULONG windowFlags{D5},
struct Screen *screen{A1},
struct TagItem *tags{A2});
oder
struct Window *OpenIntWindowTags(WORD left{D0},
WORD top{D1},
WORD width{D2},
WORD height{D3},
STRPTR name{A0},
ULONG idcmpFlags{D4},
ULONG windowFlags{D5},
struct Screen *screen{A1},
ULONG tagitem, tagdata,...{A2});
width Breite oder asScreen fⁿr Breite bis zum Screen-Rand
height H÷he oder asScreen fⁿr H÷he bis zum Screen-Rand
screen Zeiger auf eigenen Screen oder NULL fⁿr PublicScreen.
tags Zeiger auf eine eigene Tag-Liste (oder NULL) um das Window
noch genauer zu beschreiben.
Intern wird folgende TagListe fⁿr das Window erzeugt:
WA_Title = name
WA_Left = left
WA_Top = top
WA_Width = width (bzw screen->Width -left bei asScreen)
WA_Height = height (bzw screen->Height -top bei asScreen)
WA_IDCMP = idcmpFlags
WA_Flags = windowFlags
Bei eigenem Screen
WA_CustomScreen = screen
Bei NULL fⁿr Screen
WA_PubScreen = aktueller Public-Screen
WA_BubScreenFallBack = TRUE
OpenIntWindowTags / OpenIntWindowTagList erzeugt diese TagListe
intern und hΣngt die unter tags angegebene an diese.
ACHTUNG: Im Gegensatz zu OpenIntWindows erzeugt OpenIntWindowTags/
OpenIntWindowTagList NICHT mehr das WA_ScreenTitle-Tag
mit dem Wert name !
1.2.5 CloseIntWindow
Schlie▀t ein Window "sicher". D.h. es werden vorher alle IntuiMsg
beantwortet.
void CloseIntWindow(struct Window *window{A0});
Ab (V38.0) wird auch noch ⁿberprⁿft, ob fⁿr das Fenster noch eine
GUIInfo-Struktur besteht und diese wird dann ggf vorher auch noch
entfernt. Da es auch m÷glich ist, mehrere GUIInfo-Strukturen mit
verschiedenen OberflΣchen fⁿr ein Window zu erstellen, ⁿberprⁿft
CloseIntWindow, ob es fⁿr das Window mehrere GUIInfo-Strukturen
gibt und entfernt alle.
1.2.6 CloseIntScreen
Schlie▀t einen Screen "sicher". D.h. es werden vorher alle dort
noch ge÷ffneten Windows mit Hilfe von CloseIntWindow entfernt.
void CloseIntScreen(struct Screen *screen{A0});
Somit reicht fⁿr Windows die alle auf einem eigenen Screen erzeugt
wurden am Ende ein Aufruf von CloseIntScreen. Explizite Aufrufe
von CloseIntWindow kann man sich sparen.
Ab (V38.0) kann man sich auch die FreeGUIInfo-Aufrufe sparen, da
diese von CloseIntWindow ebenfalls ausgefⁿhrt werden !
1.2.7 ClearWindow (V38.0)
L÷scht den Window-Inhalt des ⁿber gui->window spezifizierten Windows.
void ClearWindow(struct GUIInfo *gui{A0});
1.3 Fonts
-----
1.3.1 GetOwnFont
Versucht den spezifizierten Font zu ÷ffnen.
struct TextFont *GetOwnFont(STRPTR name{A0},
UWORD size{D0},
struct TextAttr *font{A1});
font Zeiger auf eine TextAttr-Struktur, die automatisch von
GetOwnFont ausgefⁿllt wird oder NULL falls nicht erwⁿnscht
1.3.2 RemOwnFont
Schlie▀t den ⁿber GetOwnFont ge÷ffneten.
void RemOwnFont(struct TextFont *font{A0});
1.3.3 TopazAttr
Liefert einen Zeiger auf eine initialisierte TextAttr-Struktur
fⁿr den Topaz/8 font.
struct TextAttr *TopazAttr(void);
1.4 GUI-Erstellung
--------------
1.4.1 CreateGUIInfo
Es wird eine GUIInfo-Struktur erstellt und alle wichtigen Felder
werden automatisch gesetzt.
struct GUIInfo *CreateGUIInfo(struct Window *window{A0},
WORD maxGads{D0},
WORD maxMenus{D1});
window Fⁿr welches Fenster soll das GUI sein
maxGads Maximale Anzahl an Gadgets oder noGadgets ( = 0)
maxMenus Maximale Anzahl an Menⁿs oder noMenu ( = 0)
maxGads und maxMenus sind notwendig, da CreateGUIInfo entsprechend
Speicher anfordert, um z.B. die Gadgets in einem Feld speichern zu
k÷nnen, um spΣter einfacher darauf zugreifen zu k÷nnen.
Leider k÷nnen diese Werte spΣter nicht mehr erh÷ht werden, so da▀
hier genⁿgend gro▀e Zahlen angegeben werden mⁿssen. Geben Sie 0 an,
so sind Gadgets bzw. Menⁿs fⁿr dieses Window nicht mehr m÷glich.
Die GUIInfo-Struktur sieht folgenderma▀en aus:
struct GUIInfo {
struct Window *window; /* read only */
struct Screen *screen; /* read only */
struct TextAttr font; /* read/write */
APTR visual; /* read only */
struct MsgPort *port; /* read/write */
struct Gadget *gadlist; /* read only */
struct DrawInfo *drawinfo; /* read only (V38.0) */
struct NewGadget newgad; /* read/write */
WORD actgad; /* read only */
WORD private0; /* PRIVATE */
struct GUIGadList *gadgets; /* read only */
struct Menu *menus; /* read only */
WORD actmenu; /* read only */
WORD private1; /* PRIVATE */
struct GUIMenuList *newMenus; /* read/write */
struct IntuiMessage im; /* read only */
union {
struct gadmsg gm; /* read only */
struct menumsg mm; /* read only */
} im_un;
ULONG flags; /* read/write */
union { /* read only (V38.0) */
UWORD cardCode;
UWORD intCode;
struct oc {
UBYTE boolCode;
char charCode;
};
} mc_un;
WORD gadNbr; /* read only (V38.0) */
struct TextAttr *menuFont; /* read/write (V38.0) */
APTR vanKeyHook; /* read/write (V38.0) */
ULONG msgClass; /* read only */
union {
struct MenuItem *itemAdr; /* read only (V38.0) */
struct NewMenu *menuAdr; /* read only (V38.0) */
} ma_un;
};
Mit "PRIVATE" gekennzeichnete Felder dⁿrfen nicht berⁿhrt werden.
Die Verwendung dieser Felder kann in spΣteren Versionen anders
sein !
Mit "read only" gekennzeichnete Felder dⁿrfen nur ausgelesen
werden.
Beachten Sie, da▀ nicht alle Felder in Σlteren Versionen zur Ver-
fⁿgung stehen. Prⁿfen Sie also vorher die Versionsnummer der
Library !
Dabei kommen folgende Strukturen innerhalb von GUIInfo vor:
struct gadmsg {
WORD gadID; /* read only */
struct Gadget *gadget; /* read only */
};
struct menumsg {
WORD menuNum; /* read only */
WORD itemNum; /* read only */
WORD subNum; /* read only */
};
struct GUIGadlist {
struct Gadget *allGadgets[256]; /* read only */
};
struct GUIMenulist {
struct NewMenu allMenus[256]; /* read only */
};
Die Bedeutung der EntrΣge im einzelnen: (Bei den Union-EintrΣgen wird
jeweils nur der letzte Teil des Namens angegeben)
flags Hier geben Sie an, wie sich GUITools bei den einzelnen
Gadgets und den IntuiMessages verhalten sollen.
Voreingestellt sind alle flags gel÷scht ! Sie mⁿssen
also von Hand gesetzt werden. Man sollte dieses gleich
nach CreateGUIInfo tun. Es ist aber auch erlaubt, die
Flags zu verΣndern, damit sie nur auf bestimmte
Gadgets greifen.
Folgende Flags kennt GUITools:
GFLG_StringNotify : Beim Erstellen eines String-Gadgets
wird in gtstString ein Zeiger auf
eine String-Variabel angegeben.
GUITools merkt sich diese und spΣter
kann GUITools dann automatisch den
eingegebenen String in Ihre Variable
kopieren.
GFLG_IntegerNotify : Funktioniert wie stringNotify, nur da▀
bei GTIN_Number ein Zeiger auf eine
LONG-Variable ⁿbergeben wird.
GFLG_LinkEntryGads : VerlΣ▀t der Anwender ein EntryGadget
mit RETURN, so wird automatisch das
nΣchste EntryGadget aktiviert.
Nur beim Erstellen wirksam.
GFLG_CycleEntryGads : Wird das letzte EntryGadget verlassen,
so wird wieder das erste aktiviert.
Funktioniert nur mit linkEntryGads.
GFLG_ActivateFirstEGad : Aktiviert nach dem Erstellen des
GUI ⁿber SetGUI() automatisch das
erste EntryGadget.
GFLG_AutoUpdateEGads : Sobald in einem EntryGadget RETURN
gedrⁿckt wird, wird der entsprechende
Wert in die angegebene Variable kopiert
und steht somit sofort zur Verfⁿgung.
GFLG_AutoUpdateEGads ist nur beim
Abfragen
interessant und funktioniert nur in Zu-
sammenhang mit GFLG_IntegerNotify bzw
GFLG_StringNotify.
GFLG_CycleNotify : Beim Erstellen eines Cycle-Gadgets wird
in GTCY_Active die Adresse einer UWORD-
Variable ⁿbergeben. Wird nun das Cycle-
Gadget betΣtigt, wird automatisch der
Status in die Variable kopiert.
GFLG_MXNotify : Funktioniert genauso wie GFLG_Cycle-
Notify, nur da▀ in GTMX_Active die
Adresse ⁿbergeben wird.
GFLG_CheckboxNotify : Genau wie GFLG_MXNotify, nur wird in
GTCB_Checked die Adresse einer UBYTE-
Variable erwartet.
GFLG_SliderNotify : (V38.0) Genau wie GFLG_MXNotify, nur
wird in GTSLLevel die Adresse einer
WORD-Variablen geliefert.
GFLG_ScrollerNotify : (V38.0) Wie GFLG_SliderNotify, nur in
GTSC_Top wird die Adresse ⁿbergeben.
GFLG_ListviewNotify : (V38.0) In GTLV_Selected wird die
Adresse einer UWORD-Variablen ⁿbergeben.
GFLG_VanillaKeysNotify : (V38.0) Beim CreateGadget Aufruf wird
geprⁿft, ob fⁿr das Gadget ein Key-Equi-
valent angegeben wurde.
Ist dies der Fall wird dieser gemerkt.
GFLG_ConvertKeys : (V38.0) Ist GFLG_VanillaKeysNotify
eingeschaltet, so wird beim Drⁿcken
eines Key-Equivalents automatisch
die IDCMP-Msg umgeΣndert, so als wΣre
das Gadget betΣtigt worden.
Nur wirksam beim Abfragen der Msgs.
GFLG_NoHandleIntMsgCall : (V38.0) Unterbindet den automatischen
Aufruf von HandleIntMsg. Nur wirksam
beim Abfragen der Msgs
GFLG_InternMsgHandling : (V38.0) Alle IDCMP-Msg, die GUITools
selber auswerten kann, werden nicht mehr
weitergesendet.
Dieses Flag gilt nur beim Erstellen der
Gadgets, so da▀ man bestimmte Gadgets
sozusagen unter den Tisch fallen lassen
kann
GFLG_LVKeyClearTime : Setzt den IntuiMessage-Sekunden Eintrag
auf 0, falls das Key-Equivalent fⁿr
dieses LV-Gadget betΣtigt wurde, um
Probleme mit Double-Klicks zu vermeiden.
Gilt nur beim Erstellen. (V38.0)
GFLG_AllowAllVanillaKeys : (V38.0) Normalerweise k÷nnen nur
Key-Equivalente von GUITools bearbeitet
werden, die Buchstaben sind. Wollen
Sie andere aber auch benutzen, wie z.B.
die Ziffern etc. so gibt SetGUI eine
Fehlermeldung aus. Setzen Sie dieses
Flag, so wird keine Fehlermeldung aus-
gegeben. GUITools aber unterstⁿtzt
trotzdem diese Equivalente NICHT !
Das mu▀ von Hand aus ⁿber GadWithKey
gemacht werden !
GFLG_AddBorderDims : (V38.0) Bei CreateGadget wird automatisch
zum left-Eintrag noch window->BorderLeft
und zum top-Eintrag window->BorderTop ad-
diert, so da▀ die Gadgets, egal welchen
Font Sie benutzen, immer im inneren des
Windows liegen.
GFLG_CallVanillaKeyFct : (V38.0) Wenn dieses Flag gesetzt ist und
der Benutzer drⁿckt eine Taste, dann
wird die unter vanKeyHook angegeben
Funktion angesprungen.
(s. ConvKMsgToGMsg )
GFLG_CallMenuData : (V38.0) Wenn eine IDCMP_MenuPick-Message
vorliegt, ruft HandleIntMsg automatisch
die Funktion auf, die im userData-Feld
angegeben ist.
GFLG_DoRefresh : (V38.0) HandleIntMsg ruft automatisch
BeginRefresh und EndRefresh auf, sobald
eine IDCMP_RefreshWindow-Msg vorliegt.
GFLG_AddStdUnderscore : (V38.0) Zu der Liste der Tags wird bei
CreateGadget automatisch das Tag
GT_Underscore mit dem Wert '_' hinzu-
gefⁿgt, so da▀ Sie dieses selber nicht
mehr mit angeben mⁿssen.
GFLG_PaletteNotify : (V38.0) In GTPA_Color wird die Adresse
einer UWORD-Variable angeliefert.
screen Merker fⁿr GUITools auf den Screen des Windows
visual Zeiger auf die VisualInfo-Struktur des Screens
drawinfo Zeiger auf eine Kopie der DrawInfo-Struktur des Screens
ab (V38.0). Diese Struktur darf nur gelesen werden !
font Eine TextAttr-Struktur die standartmΣ▀ig mit
dem aktuellen im Fenster gesetzten Font ausgefⁿllt
wird. Dieser Font wird spΣter fⁿr die Gadgets ver-
wendet.
Fⁿr einen anderen Font bei Gadgets Σndern Sie ent-
weder diese Struktur oder den Eintrag der newgad-
Struktur (s.u.).
StandardmΣ▀ig zeigt der font-Eintrag der newgad-
Struktur auf diese Attr-Struktur.
Wenn Sie CreateGUIInfo benutzen, so zeigt auch der
menuFont-Zeiger (s.u.) auf diese Struktur, so da▀ Sie
beim AbΣndern dieser Struktur auch den Menⁿ-Font mit
Σndern !
menuFont Zeiger auf eine TextAttr-Struktur, die beim Erstellen der
Menⁿs benutzt wird. StandardmΣ▀ig zeigt dieser Eintrag font.
Ab (38.0) zeigt dieser Zeiger, wenn Sie CreateGUIInfoTags
benutzen auf den Font des Screens.
window hier merkt sich GUITools den Zeiger auf ihr Window
port Zeiger auf den IDCMP-Port, an dem die Msgs ankommen,
wird dieser verΣndert, z.B. durch ModifyIDCMP, so
mu▀ dieser Eintrag auch mit geΣndert werden !
newgad NewGadget-Struktur, die zum Erstellen der Gadgets
benutzt wird. Sie kann nach belieben verΣndert
werden. Die EintrΣge ng_TextAttr und ng_VisualInfo
werden automatisch vorgesetzt. Die wichtigsten
EintrΣge werden durch die CreateGadget-Prozeduren
vorgenommen.
Bei textAttr kann ein eigener Font fⁿr die Gadgets
angegeben werden. ─ndern Sie einfach den Zeiger auf
Ihre eigene TextAttr-Struktur. (s. auch font)
actgad EnthΣlt die Gadget-Nummer (0 ist das Erste !) von
dem Gadget, das als nΣchstes erstellt wird. Nach
SetGUI steht hier die Anzahl der Gadgets!
gadgets Ein Zeiger auf ein Feld mit Gadget-Pointer. Jeder
Eintrag zeigt auf ein von Ihnen erstelltes Gadget in
der Reihenfolge der Erstellung.
Das Feld geht von 0 bis actgad-1.
gadlists Ein Zeiger auf die von GUITools erstellte Gadget-Liste.
Dieser Zeiger darf nur zwischen SetGUI und FreeGUI oder
dazu Σhnlichen Funktionen verwendet werden.
Damit kann z.B. eine Refresh-Funktion realisiert werden.
actmenu EnthΣlt die Nummer des Menⁿ-Eintrages, der als nΣchstes
erstellt wird.
newMenus Zeiger auf ein Feld mit NewMenu-Strukturen. Wollen Sie
mehr angeben als ⁿber MakeMenuEntry m÷glich, fⁿhren
Sie erst MakeMenuEntry aus und greifen Sie dann ⁿber
newmenus^[actmenu-1] auf die NewMenu-Struktur zu und
verΣndern Sie entsprechend ! Ab (V38.0) k÷nnen Sie
auch menuAdr dafⁿr benutzen.
menus Ein Zeiger auf das von SetGUI erstellte Menu.
im IntuiMessage-Struktur, die bei Aufruf von WaitIntMsg
oder GetIntMsg eine Kopie der IntuiMessage enthΣlt.
msgClass Liefert i.A. eine Kopie von im.Class
(siehe HandleIntMsg)
gadID Liefert bei entsprechenden Msgs die Gadget-ID.
gadget Liefert bei entsprechenden Msgs eine Zeiger auf das
Event-Gadget.
Ab (V38.0) wird nach einem Aufruf von CreateGadget
ein Zeiger auf das erstellte Gadget geliefert.
menuNum, In diesen Feldern werden bei entsprechenden Intui-Msgs
itemNum, automatisch die entsprechenden Nummern zur Verfⁿgung
subNum gestellt, um eine eigene Umrechnung zu ersparen.
cardCode, In diesem Feld wird ab (V38.0) i.A. eine Kopie des
intCode, im.Code-Feldes abgeliefert.
boolCode, ▄ber diesen Eintrag kann man unter UmstΣnden leichter
charCode auf die entsprechenden Werte zugreifen.
(siehe HandleIntMsg)
gadNbr liefert ab (V38.0) die Gadget-Nummer innerhalb des gadgets-
Feldes, so da▀ man auf das Gadget leichter zugreifen
kann, wenn Gadget-ID und Gadget-Nummer nicht ⁿberein-
stimmen sollten
itemAdr liefert ab (V38.0) einen Zeiger auf die MenuItem-Struktur
des Items, das bei IDCMP_MenuPick bzw IDCMP_MenuHelp
ausgewΣhlt wurde.
menuAdr liefert ab (V38.0) nach einem Aufruf von MakeMenuEntry
einen Zeiger auf die soeben erstellte NewMenu-Struktur.
vanKeyHook Zeiger ab (V38.0) auf eine Benutzer-Spezifizierte Funktion,
zur Auswertung der Key-Equivalente. (s. ConvKMsgToGMsg )
Ab (V38.0) sollte diese Funktion durch CreateGUIInfoTags ersetzt
werden, da sie einen kleinen Fehler enthΣlt. (Siehe Probleme)
1.4.2 CreateGUIInfoTags (V38.0) / CreateGUIInfoTagList (V38.0)
Es wird eine GUIInfo-Struktur erstellt und alle wichtigen Felder
werden automatisch gesetzt.
struct GUIInfo *CreateGUIInfoTags(struct Window *window{A0},
WORD maxGads{D0},
WORD maxMenus{D1},
ULONG tagitem, tagdata,...{A1});
oder
struct GUIInfo *CreateGUIInfoTagList(struct Window *window{A0},
WORD maxGads{D0},
WORD maxMenus{D1},
struct TagItem *tags{A1});
Funktioniert genau wie CreateGUIInfo, nur da▀ zusΣtzlich noch einige
spezielle Tags mit ⁿbergeben werden k÷nnen.
Des weiteren wird der menuFont-Eintrag auf den Font des Screens ge-
setzt. Wenn Sie also nun die font-TextAttr-Struktur abΣndern, be-
trifft das nur noch die Gadgets, aber nicht mehr die Menⁿleiste !
Ab (V38.0) sollte diese Funktions anstelle von CreateGUIInfo benutzt
werden.
Folgende Tags sind m÷glich:
GUI_ResizableGads : 1 oder 0, Voreinstellung ist 0.
Wenn Sie GUI_ResizableGads auf 1 setzen, merkt
sich GUITools nun das Aussehen aller Gadgets.
Damit ist GUITools in der Lage gr÷▀enverΣnderbare-
Gadgets zu behandeln.
Da das Merken von Aussehen, Form und Gr÷▀e der
Gadgets sehr aufwendig ist, mu▀ es extra mit
diesem Flag angefordert werden.
GUI_Flags : ULONG, Voreinstellung 0
Hier k÷nnen Sie die Flags angeben, die sofort ge-
setzt werden sollen. Diese werden nach gui->flags
kopiert.
GUI_GadFont : struct *TextAttr, Voreinstellung window->font
Hiermit k÷nnen Sie den Font-Eintrag der NewGadget-
Struktur gui->newgad mit Ihrem eigenen Font vor-
belegen.
GUI_MenuFont : struct *TextAttr, Voreinstellung screen->font
Hiermit k÷nnen Sie der Menⁿleiste einen anderen
als den beim Screen verwendeten Font ⁿbergeben.
Dieser wird unter gui->menuFont eingetragen.
GUI_VanKeyFct : VanKeyFct, Voreinstellung NULL
Angabe der Hook-Funktion, die in gui->vanKeyFct
eingetragen wird.
GUI_CreateError : *LONG, Voreinstellung NULL
Hier k÷nnen Sie einen Zeiger auf eine LONG-
Variable angeben, die bei einem Fehler eine
genauere Angabe ⁿber den Fehlergrund anzeigt.
Diese Fehlernummer gilt nur fⁿr CreateGUIInfoTags/
CreateGUIInfoTagList.
Folgende Werte k÷nnen auftreten:
cgiNoError Kein Fehler aufgetreten.
cgiNoWindow Window-Zeiger war NULL.
cgiNoVisualInfo VisualInfo konnte nicht erstellt
werden.
cgiNoMemory Nicht genⁿgend Speicher.
cgiNoDrawInfo DrawInfo konnte nicht erstellt
werden.
cgiCreateContext Der Aufruf von CreateContext
schlug fehl.
GUI_SetProcessWindow : 1 oder 0, Voreinstellung: 0
Ist dieses Flag gesetzt, so wird der
pr_WindowPtr-Eintrag der Process-Struktur
auf das Window gesetzt.
GUI_RestoreProcessWindow : 1 oder 0, Voreinstellung: 0
Wenn dieses Flag gesetzt ist, so wird bei
FreeGUIInfo der Wert in den pr_WindowPtr-
Eintrag der Process-Struktur eingetragen,
der vor dem Aufruf von CreateGUIInfoTags/
CreateGUIInfoTagList dort stand.
GUI_RefreshWindowFrame : 1 oder 0.
Dieses Flag erhΣlt normalerweise den Wert,
den das Flag GUI_ResizableGads hat.
Sie k÷nnen, wenn Sie dieses Tagitem NACH
den GUI_Resizable-Tagitem benutzen, den
Wert Σndern.
Ist dieses Flag gesetzt, so wird bei
EndRefresh auch noch die Intuition-Funktion
RefreshWindowFrames aufgerufen.
1.4.3 FreeGUIInfo
Freigeben des mit CreateGUIInfo bzw ab (V38.0) mit CreateGUIInfoTags/
CreateGUIInfoTagList erstellten GUIInfos. Entfernen der Gadgets und
des Menⁿs.
void FreeGUIInfo(struct GUIInfo *gui{A0});
Haben Sie die GUIInfo-Struktur ⁿber CreateGUIInfoTags/CreateGUIInfo-
TagList (V38.0) erstellt, und dabei das GUI_RestoreProcessWindow-Tag
mit dem Wert 1 angegeben, so wird nun der pr_WindowPtr-Eintrag der
Process-Struktur wieder auf den alten Wert zurⁿck gesetzt.
1.4.4 SetGUI
Setzen der Gadgets und des Menⁿs
WORD SetGUI(struct GUIInfo *gui{A0});
M÷gliche Rⁿckgabewerte:
guiSet Alles klar, weiter geht's.
gadgetError Fehler beim Erstellen der Gadgets.
menuError Fehler beim Erstellen des Menⁿs.
memError Zuwenig Speicher.
gadKeyDefTwice (V38.0) Gleiches Key-Equivalent fⁿr 2 Gadgets.
menuSetError (V38.0) Fehler beim internen Aufruf von SetMenuStrip.
menuLayoutError (V38.0) Fehler beim internen Aufruf von LayoutMenusA.
gadKeyNotAllowed (V38.0) Key-Equivalent ist kein Buchstabe.
tooManyGadsError (V38.0) mehr Gadgets als bei CreateGUIInfo ange-
geben.
tooManyMenusError (V38.0) wie tooManyGadsError, nur fⁿr Menⁿs.
gadKeyNotFound (V38.0) GA_Underscore-Tag vorhanden, fehlt aber im
Text und GFLG_VanillaKeysNotify ist gesetzt.
noGadToolsGadKind (V38.0) Das Gadget-Kind ist kein GadTools-Gadget.
noGUIToolsGadKind (V38.0) Das Gadget-Kind ist kein GUITools-Gadget.
Nur beim Erhalten von guiSet kann weiterfortgefahren werden, ansonsten
kann nicht auf das GUI mehr zugegriffen werden.
Erneute Aufrufe von CreateGadget, MakeMenuEntry etc sind wirkungslos.
Auf keinem Fall darf SetGUI noch einmal aufgerufen werden. Hingegen mu▀
FreeGUIInfo trotz des Fehlerfolges noch aufgerufen werden.
Nach einem Aufruf von SetGUI ist es nicht mehr m÷glich weitere Gadgets
oder Menⁿpunkte hinzuzufⁿgen.
Ab (V38.0) kann SetGUI auch mehrmals aufgerufen werden, um z.B. erst
ein Menⁿ und spΣter dann die Gadgets zu erstellen. Dazu erstellt man
erst das Menⁿ (ⁿber MakeMenuEntry (s.u)), ruft SetGUI auf, erstellt
dann irgendwann die Gadgets ⁿber CreateGadget und ruft wieder SetGUI auf.
Allerdings k÷nnen Sie damit nicht an ein bestehendes Menⁿ ein neues
anhΣngen oder Gadgets hinzufⁿgen.
1.4.5 CreateGadget / CreateGadgetTag
Erstellt das angegebene GadTools-Gadget
void CreateGadget(struct GUIInfo *gui{A0},
WORD left{D0},
WORD top{D1},
WORD width{D2},
WORD height{D3},
ULONG kind{D4},
ULONG tagitem, tagdata, ...{A1});
oder
void CreateGadgetTag(struct GUIInfo *gui{A0},
WORD left{D0},
WORD top{D1},
WORD width{D2},
WORD height{D3},
ULONG kind{D4},
struct TagItem *tags{A1});
Ersetzt im Prinzip GadToolsL.CreateGadgetA. Der Unterschied ist, da▀
hier die Gr÷▀e/Position direkt angegeben wird und nicht ⁿber eine
NewGadget-Struktur.
Ein mit CreateGadget/CreateGadgetTag erstelltes Gadget besitzt keinen
Text, au▀er Sie haben Ihn explizit ⁿber gui->newgad.ng_GadgetText
vorher angegeben.
Es wird keine Fehlermeldung ausgegeben, falls das Gadget nicht erstellt
werden konnte. Dies geschieht spΣter ⁿber SetGUI().
Fⁿr jedes Gadget wird im userData-Eintrag der Gadget-Struktur noch
ein Zeiger auf folgende Struktur angelegt ab (V38.0):
struct GUIGadgetInfo {
APTR userData; hier k÷nnen eigene Daten eingetragen werden
ULONG kind; Gadget-Kind
};
Dieser Zeiger darf nicht verΣndert werden. Wird der userData-Eintrag
selber ben÷tigt, so mu▀ der userData->userData-Eintrag dafⁿr genutzt
werden ! GUITools setzt diesen userData-Eintrag automatisch auf den
in der NewGadget-Struktur angegebenen.
▄ber kind k÷nnen Sie selber nachfragen, um was fⁿr ein Gadget es
sich eigentlich handelt.
Ab (V38.0) macht GUITools folgende Ersetzungen:
CHECKBOX_KIND : width == 0, dann width = CHECKBOX_WIDTH
: height== 0, dann height= CHECKBOX_HEIGHT
MX_KIND : width == 0, dann width = MX_WIDTH
height== 0, dann height= MX_HEIGHT
STRING_KIND : height== 0, dann height= Font->ta_YSize + 4
INTEGER_KIND : wie stringKind
Ist GFLG_AddBorderDims in gui->flags gesetzt, so wird zu left noch
window->BorderLeft und zu top noch window->BorderTop hinzuaddiert,
damit die Gadgets, egal welchen Font Sie benutzen, immer im inneren
des Windows liegen.
Sie k÷nnen nun nach einem Aufruf von CreateGadget auf das soeben
erstellte Gadget ⁿber gui->gadgets->allGadgets[gui->actgad-1] bzw ab
(V38.0) ⁿber gui->gadget zugreifen. Testen Sie aber bei der ersten
Methode, ob actgad gr÷▀er 0 ist. Bei beiden Methoden mⁿ▀en Sie noch
den Zeiger auf NULL testen!
1.4.6 CreateGadgetText / CreateGadgetTextTag
Wie CreateGadget, nur wird noch der Text mit angegeben.
void CreateGadgetText(struct GUIInfo *gui{A0},
WORD left{D0},
WORD top{D1},
WORD width{D2},
WORD height{D3},
ULONG kind{D4},
STRPTR text{A1},
ULONG tagitem, tagdata, ...{A2});
oder
void CreateGadgetTextTag(struct GUIInfo *gui{A0},
WORD left{D0},
WORD top{D1},
WORD width{D2},
WORD height{D3},
ULONG kind{D4},
STRPTR text{A1},
struct TagItem *tags{A2});
1.4.7 CreateGadgetFull
Wie CreateGadgetText, nur zusΣtzlich wird auch noch die
Positionierung des Gadget-Textes mit angegeben.
void CreateGadgetFull(struct GUIInfo *gui{A0},
WORD left{D0},
WORD top{D1},
WORD width{D2},
WORD height{D3},
ULONG kind{D4},
STRPTR text{A1},
ULONG place{D5},
ULONG tagitem, tagdata, ...{A2});
oder
void CreateGadgetFullTag(struct GUIInfo *gui{A0},
WORD left{D0},
WORD top{D1},
WORD width{D2},
WORD height{D3},
ULONG kind{D4},
STRPTR text{A1},
ULONG place{D5},
struct TagItem *tags{A2});
1.4.8 RemoveGadgets (V38.0)
Entfernt alle Gadgets aus der Liste.
void RemoveGadgets(struct GUIInfo *gui{A0},
UBYE erase{D0});
Die Gadgets sind aber immer noch zu sehen. Es sollte dann also noch
ClearWindow aufgerufen werden. Wenn Sie erase auf 1 setzen, werden
die Gadgets fⁿr immer entfernt. Bei 0 hingegen, k÷nnen Sie die
Gadgets mit einem Aufruf von SetGUI wieder auf den Bildschirm bringen.
Zwischenzeitlich dⁿrfen Sie aber keinen CreateGadget-Aufruf getΣtigt
haben, um z.B. neue Gadgets hinzuzufⁿgen !
Bei erase = 1 k÷nnen Sie mit CreateGadget neue Gadgets definieren
und diese dann mit SetGUI wieder auf den Bildschirm bringen, so da▀ Ihr
Window mehrere Menⁿ-Masken haben kann.
ACHTUNG: Alle Informationen ⁿber die alten Gadgets gehen verloren,
wenn erase auf 1 gesetzt wird !
1.4.9 MakeMenuEntry
Erstellen eines Menⁿ-Eintrages.
void MakeMenuEntry(struct GUIInfo *gui{A0},
UBYTE type{D0},
STRPTR text{A1},
STRPTR key{A2});
type NM_TITLE, NM_ITEM, NM_SUB etc
text Zeiger auf den Menⁿ-Text
key Zeiger auf einen Tastaturkⁿrzel oder NULL
Nach dem Aufruf k÷nnen Sie ⁿber gui->newmenus->allMenus[gui->actmenu-1]
oder aber ab (V38.0) ⁿber gui->menuAdr-> auf die soeben erstellte
NewMenu-Struktur zugreifen und diese verΣndern.
1.4.10 RemoveMenu (V38.0)
Entfernt nur das Menⁿ.
void RemoveMenu(struct GUIInfo *gui{A0},
UBYTE erase{D0});
Wenn Sie erase auf 1 setzen, wird das Menⁿ vollkommen gel÷scht,
sie k÷nnen jetzt ⁿber MakeMenuEntry ein neues Menⁿ definieren und
dieses dann ⁿber SetGUI auf den Bildschirm bringen.
Setzen Sie erase auf 0, wird das Menⁿ lediglich abgehΣngt. Sie
k÷nnen es mit SetGUI jederzeit wieder sichtbar machen. Ein zwischen-
zeitlicher Aufruf von MakeMenuEntry ist aber nicht erlaubt !
ACHTUNG: Alle Informationen ⁿber das alte Menⁿ gehen verloren, wenn
Sie erase auf 1 setzen!
1.5 GUI-Abfrage
-----------
1.5.1 WaitIntMsg
Wartet auf eine Msg am eingetragenen Port.
void WaitIntMsg(struct GUIInfo *gui{A0});
Wartet auf eine IntuiMessage und beantwortet diese dann und
liefert eine Kopie in gui->im an.
Gleichzeitig wird HandleIntMsg ausgefⁿhrt, falls GFLG_NoHandleIntMsgCall
im flags-Feld nicht gesetzt ist (V38.0).
Ab (V38.0) kann es sein, da▀ wenn GFLG_InternMsgHandling gesetzt ist,
WaitIntMsg mehrere Messages bekommt und auswertet, bevor diese dann
ans Anwenderprogramm gesendet wird, da HandleIntMsg die vorhergehenden
intern auswerten konnte.
ACHTUNG: Ohne einen Aufruf von HandleIntMsg sind alle zusΣtzlichen
Informationen der GUIInfo-Struktur ungⁿltig und dⁿrfen
nicht abgefragt werden ! (z.B gadID oder menuNum)
1.5.2 GetIntMsg
Holt eine Msg vom eingetragenen Port ab.
UBYTE GetIntMsg(struct GUIInfo *gui{A0});
Versucht eine Msg abzuholen, ist sie vorhanden wird diese beantwortet,
nach gui->im kopiert, HandleIntMsg aufgerufen, falls nicht
GFLG_NoHandleIntMsgCall ab (V38.0) gesetzt ist und 1 zurⁿckgeliefert.
Sollte eine Msg vorliegen, aber GFLG_InternMsgHandling (V38.0) gesetzt
sein und HandleIntMsg diese intern verarbeiten k÷nnen, so wird
ebenfalls 0 zurⁿckgeliefert !
ACHTUNG: Ohne einen Aufruf von HandleIntMsg sind alle zusΣtzlichen
Informationen der GUIInfo-Struktur ungⁿltig und dⁿrfen
nicht abgefragt werden ! (z.B gadID oder menuNum)
1.5.3 EmptyIntMsgPort
Entfernt alle anliegenden IntuiMessages.
void EmptyIntMsgPort(struct GUIInfo *gui{A0});
1.5.4 HandleIntMsg
Bearbeitung von IntuiMessages und deren Auswertung
void HandleIntMsg(struct GUIInfo *gui{A0});
Das Kernstⁿck von GUITools. Wird automatisch von GetIntMsg und
WaitIntMsg aufgerufen, falls ab (V38.0) nicht GFLG_NoHandleIntMsgCall
gesetzt ist.
Ist also nur wichtig, wenn die Msg selber geholt werden oder
man bevor GUITools etwas tut, die Msg auswerten ggf verΣndern
will. Dann mu▀ diese aber vorher nach gui->im kopiert worden sein !
HandleIntMsg bearbeitet die IntuiMessages folgenderma▀en:
In gui->msgClass wird eine Kopie von gui->im.Class abgelegt. In den
cardCode, intCode etc. Feldern wird eine Kopie von gui->im.Code
abgelegt.
Wenn GUITools die Msg entsprechend selber auswerten konnte.
z.B. Key-Equivalente, so enthalten gui->msgClass und gui->cardCode
verΣnderte Werte. Die gui->im-Struktur hingegen enthΣlt immer
nur die Original-Msg. (Au▀nahme siehe Listview-Kind)
Zur einfacheren Handhabung sollten Sie also immer auf msgClass
zugreifen. (cardCode gibt es erst ab (V38.0) )
HandleIntMsg fⁿhrt folgende Aktionen aus:
Msg-Class Auswirkungen
-------------------------------------------------------------------
IDCMP_GADGETUP gui->gadget enthΣlt Zeiger auf das Gadget
gui->gadID enthΣlt die GadgetID
(V38.0) gui->gadNbr enthΣlt die Gadget-Nummer inner-
halb des gadgets-Feldes
INTEGER_KIND, : Ist GFLG_AutoUpdateEGads in gui->flags
STRING_KIND gesetzt, so wird, falls fⁿr dieses
Gadget ein Notify gesetzt wurde, der
Inhalt des Gadgets in die entsprechende
Variable kopiert. War beim Erstellen
der Gadgets GFLG_LinkEntryGads aktiviert,
so wird nun das nΣchste EntryGadget akti-
viert. Eine eigene Abfrage wird somit
ⁿberflⁿssig.
CYCLE_KIND : War bei dem Gadget GFLG_CycleNotify an,
so wird die Variable automatisch auf den
neuesten Stand gebracht. Eine eigene
Abfrage wird somit praktisch ⁿberflⁿssig.
CHECKBOX_KIND : War bei dem Gadget GFLG_CheckboxNotify an,
so wird die Variable automatisch auf den
neuesten Stand gebracht. Eine eigene
Abfrage wird somit praktisch ⁿber-
flⁿssig.
Ab (V38.0) wird in gui->boolCode der
Status des Gadgets geliefert.
SLIDER_KIND : Ab (V38.0) wird, wenn bei dem Gadget
GFLG_SliderNotify gesetzt war, das
code-Feld in die angegebene Variable
kopiert. Eine eigene Abfrage wird somit
ⁿberflⁿssig.
SCROLLER_KIND : Ab (V38.0) wird, wenn bei dem Gadget
GFLG_ScrollerNotify gesetzt war,
das code-Feld in die angegebene Variable
kopiert. Eine eigene Abfrage wird somit
ⁿberflⁿssig.
LISTVIEW_KIND : Ab (V38.0) wird, wenn bei dem Gadget
GFLG_ListviewNotify gesetzt war, das
code-Feld in die angegebene Variable
kopiert. Eine eigene Abfrage wird somit
ⁿberflⁿssig.
PALETTE_KIND : Ab (V38.0) wird, wenn bei dem Gadget
GFLG_PaletteNotify gesetzt war, das
code.Feld in die angegebene Variable
kopiert. Eine eigene Abfrage wird somit
ⁿberflⁿssig.
IDCMP_GADGETDOWN gui->gadget enthΣlt Zeiger auf das Gadget
gui->gadID enthΣlt die GadgetID
(V38.0) gui->gadNbr enthΣlt die Gadget-Nummer inner-
halb des gadgets-Feldes
MX_KIND : War bei dem Gadget GFLG_MXNotify an, so
wird die Variable automatisch auf den
neuesten Stand gebracht. Eine eigene
Abfrage wird somit praktisch ⁿberflⁿssig.
SLIDER_KIND : Ab (V38.0) wird, wenn bei dem Gadget
GFLG_SliderNotify gesetzt war, das
code-Feld in die angegebene Variable
kopiert. Eine eigene Abfrage wird somit
ⁿberflⁿssig.
SCROLLER_KIND : Ab (V38.0) wird, wenn bei dem Gadget
GFLG_ScrollerNotify gesetzt war, das
code-Feld in die angegebene Variable
kopiert. Eine eigene Abfrage wird
somit ⁿberflⁿssig.
IDCMP_MOUSEMOVE gui->gadget enthΣlt Zeiger auf das Gadget
gui->gadID enthΣlt die GadgetID
(V38.0) gui->gadNbr enthΣlt die Gadget-Nummer inner-
halb des gadgets-Feldes
SLIDER_KIND : Ab (V38.0) wird, wenn bei dem Gadget
GFLG_SliderNotify gesetzt war, das
code-Feld in die angegebene Variable
kopiert. Eine eigene Abfrage wird
somit ⁿberflⁿssig.
SCROLLER_KIND : Ab (V38.0) wird, wenn bei dem Gadget
GFLG_ScrollerNotify gesetzt war, das
code-Feld in die angegebene Variable
kopiert. Eine eigene Abfrage wird
somit ⁿberflⁿssig.
IDCMP_MENUPICK gui->menuNum enthΣlt MenuNummer
gui->itemNum enthΣlt ItemNummer
gui->subNum enthΣlt SubItemNummer
gui->itemAdr enthΣlt die Item-Adresse der MenuItem-
Struktur ab (V38.0)
Ist ab (V38.0) GFLG_CallMenuData in flags gesetzt, so
wird automatisch die in userData angegebene Funktion
aufgerufen. Diese sollte 1 zurⁿckliefern, falls
weitere Messages bearbeitet werden sollen oder aber
0, wenn zurⁿck ins Hauptprogramm gesprungen werden
soll.
Ab (V38.0) werden IDCMP_MenuNull-Messages ignoriert,
d.h. in gui->msgClass wird 0 zurⁿckgeliefert.
IDCMP_MENUHELP Ab (V38.0) :
gui->menuNum enthΣlt MenuNummer
gui->itemNum enthΣlt ItemNummer
gui->subNum enthΣlt SubItemNummer
gui->itemAdr enthΣlt die Item-Adresse der MenuItem-
Struktur, falls m÷glich
IDCMP_VANILLAKEY Ab (V38.0) Ist GFLG_ConvertKeys in flags gesetzt, so
wird nun automatisch ConvKMsgToGMsg aufge-
rufen-
IDCMP_REFRESHWINDOW Ist ab (V38.0) GFLG_DoRefresh in flags gesetzt,
so wird nun BeginRefresh, gefolgt von
EndRefresh(, 1) aufgerufen.
1.5.5 ConvKMsgToGMsg (V38.0)
Holt sich die Taste aus dem gui->im.Code-Feld und ruft dann
GadWithKey mit dem entsprechenden Gadget auf.
void ConvKMsgToGMsg(struct GUIInfo *gui{A0});
Diese Funktion ist nur von Interesse, wenn GFLG_NoHandleIntMsgCall
gesetzt ist und man die Konversionen selber ⁿberwachen will.
Oder wenn man RawKey-Tasten abfragt und diese vorher in
VanillaKeys umwandeln mu▀ oder Σhnliches. Fⁿr diese Funktion
mu▀ in gui->im.Code der VanillaKey-Code stehen und in gui->msgClass
IDCMP_VANILLAKEY !
CreateGadget merkt sich, wenn GFLG_VanillaKeyNotify gesetzt ist, selber
alle Key-Equivalente, die aus Buchstaben bestehen. Wenn Sie nun aber
auch Tasten, die keine Buchstaben sind verwenden wollen, so mⁿssen Sie
die Zuordnung Taste->Gadget selber machen. Dafⁿr mⁿssen Sie zuerst
GFGL_AllowAllVanillaKeys in flags setzen. Des weiteren ins eine
VanKeyFct im vanKeyHook-Feld einzutragen. Diese Funktion wird von
ConvKMsgToGMsg immer dann aufgerufen, wenn kein Buchstabe dort ankommt,
sondern irgend eine andere Taste.
Die VanKeyFct hat folgendes Format:
ULONG VanKeyFct(register __d0 char key,
register __a0 WORD *nbr,
register __a1 WORD *shift);
In D0 erhalten Sie den Vanilla-Code der Taste. In A0 kommt ein
Zeiger auf ein WORD. Hier tragen Sie die entsprechende Nummer
des Gadgets ein. A1 zeigt auch auf ein WORD. Hier geben Sie
an, ob das Gadget mit SHIFT oder ohne behandelt werden soll.
Eine 0 bedeutet nein, eine 1 ja.
Konnte Ihre Funktion eine Zuordnung machen, liefern Sie 1 zurⁿck,
ansonsten 0.
1.5.6 GadWithKey (V38.0)
Tut so, als ob fⁿr das bestehende Gadget ein Key-Equivalent bestehen
wⁿrde und fⁿhrt intern einige Funktionen aus.
void GadWithKey(struct GUIInfo *gui{A0},
WORD nbr{D0},
UBYTE shift{D1});
nbr Gadget-Nummer
shift War die Taste mit Shift gedrⁿckt ?
Diese Funktion kann benutzt werden, um Sondertasten, den entsprechenden
Gadgets zuzuordnen, z.B. (F-Tasten).
Folgende Aktionen werden ausgefⁿhrt, zusΣtzlich werden bei den Gadgets
(abgesehen von STRING_KIND und INTEGER_KIND) noch die Notify-Aufrufe,
die auch HandleIntMsg ausfⁿhrt, benutzt. gadNbr enthΣlt die
Gadget-Nummer, gadID die entsprechende ID.
Ist das Gadget deaktiviert (disabled), so wird keine Aktion ausge-
fⁿhrt und in msgClass wird 0 zurⁿckgeliefert.
Die VerΣnderungen werden automatisch sichtbar gemacht.
BUTTON_KIND : msgClass = IDCMP_GADGETUP
cardCode = 0
STRING_KIND : Es wird das entsprechende Gadget aktiviert
msgClass = IDCMP_GADGETDOWN
cardCode = 0
INTEGER_KIND : Es wird das entsprechende Gadget aktiviert
msgClass = IDCMP_GADGETDOWN
cardCode = 0
CHECKBOX_KIND : Es wird der Zustand des Gadgets geΣndert.
msgClass = IDCMP_GADGETUP
boolCode enthΣlt den neuen Zustand
MX_KIND : Ohne shift wird der nΣchste Eintrag ausgewΣhlt, mit
shift der vorherige.
msgClass = IDCMP_GADGETDOWN
cardCode = Nummer des neu gewΣhlten Eintrages
CYCLE_KIND : Ohne shift wird der nΣchste Eintrag ausgewΣhlt, mit
shift der vorherige.
msgClass = IDCMP_GADGETUP
cardCode = Nummer des neu gewΣhlten Eintrages
SLIDER_KIND : Ohne shift eine Position nach "vorwΣrts", mit shift
eine rⁿckwΣrts.
msgClass = IDCMP_GADGETUP
intCode = neue Position (neuer Level)
SCROLLER_KIND : Ohne shift eine Position nach "vorwΣrts", mit shift
eine rⁿckwΣrts.
msgClass = IDCMP_GADGETUP
intCode = neue Position (neues Top)
LISTVIEW_KIND : Ohne shift nΣchsten Eintrag, mit shift vorherigen.
War noch keiner aktiv, wird ohne shift der erste
ausgewΣhlt und mit shift der letzte.
msgClass = IDCMP_GADGETUP
cardCode = Nummer des neu gewΣhlten Eintrages
War GFLG_LVKeyClearTime beim Erstellen dieses Gadgets
gesetzt, so wird nun der der Sekunden und der
Mikrosekunden-Eintrag der original IntuiMessage
(im im-Feld der GUI-Struktur) auf 0 gesetzt, um
Probleme beim Abfragen ⁿber DoubleClick zu ver-
meiden. Hier mu▀ man dann vorher nur die Felder
auf 0 ⁿberprⁿfen.
PALETTE_KIND : Ohne shift wird die nΣchste Farbe ausgewΣhlt, mit
shift die vorhergehende
1.6 GUI-Bearbeitung
---------------
1.6.1 GadgetStatus
Aktivieren, deaktivieren eines Gadgets.
void GadgetStatus(struct GUIInfo *gui{A0},
WORD nbr{D0},
UBYTE status{D1});
nbr gibt die GadgetNummer des gadget-Feldes an
status 1 : Gadget aktivieren
0 : Gadget deaktivieren
GadTools-Gadgets werden ⁿber das GA_Disabled-Tag an bzw aus-ge-
schaltet. Bei GENERIC_KIND-Gadgets werden die Funktionen
OnGadget/OffGadget der Intuition-Library benutzt !
1.6.2 ModifyGadget / ModifyGadgetTag
Ersetzt GadToolsL.GTSetGadgetAttrs. Dient zum VerΣndern einiger
Gadget-Attribute.
void ModifyGadget(struct GUIInfo *gui{A0},
WORD nbr{D0},
ULONG tagitem, tagdata, ...{A1});
oder
void ModifyGadgetTag(struct GUIInfo *gui{A0},
WORD nbr{D0},
struct TagItem *tags{A1});
nbr gibt die GadgetNummer des gadget-Feldes an
1.6.3 UpdateEGad
Kopiert den Inhalt eines EntryGadgets in die entsprechende Variable.
void UpdateEGad(struct GUIInfo *gui{A0},
WORD nbr{D0});
nbr gibt die GadgetNummer des gadgetFeldes an.
1.6.4 UpdateEntryGadgets
Wie UpdateEGad nur fⁿr alle Gadgets.
void UpdateEntryGadgets(struct GUIInfo *gui{A0});
Damit kann leicht das Problem umgangen werden, wenn ein Benutzer
in einem EntryGadget Eingaben macht und dann ohne RETURN zu be-
tΣtigen eine Aktion auswΣhlt.
Leider schickt Intuition dann keine GadgetUp-Message, so da▀
man beim Erhalten dieser Aktion erst alle EntryGadgets abfragen
mu▀, um die richtigen Inhalte zu haben.
UpdateEntryGadgets erledigt das ganz einfach fⁿr einen, dank
der GFLG_StringNotify und GFLG_IntegerNotify-Funktionen.
1.6.5 VarToGad (V38.0)
▄bergibt den Inhalt einer Variablen an das zugeh÷rige Gadget.
void VarToGad(struct GUIInfo *gui{A0},
WORD nbr{D0});
Wenn Sie fⁿr dieses Gadget das entsprechende Notify eingeschaltet
haben, dann k÷nnen Sie nun ganz einfach Ihre dazugeh÷rige Variable
verΣndern und dann VarToGad mit dem entsprechenden Gadget aufrufen.
GUITools nimmt den Wert der Variablen und Σndert entsprechend das
Gadget ab.
1.6.6 AllVarsToGad (V38.0)
Funktioniert wie VarToGad, nur fⁿr alle Gadgets.
void AllVarsToGad(struct GUIInfo *gui{A0});
GUITools ⁿbergibt allen Gadgets, bei denn ein Notify eingeschaltet
ist, denn aktuellen Wert der dazugeh÷rigen Variable.
1.6.7 RedrawMenu (V38.0)
Aktuelle Menⁿleiste entfernen und erneut wieder darstellen.
WORD RedrawMenu(struct GUIInfo *gui{A0});
Zuerst wird das alte Menⁿ entfernt und dann mit den alten Werten
wieder erneut aufgebaut unter Berⁿcksichtigung des menuFont-Eintrages,
der geΣndert werden konnte, um das Menⁿ an einen neuen Font anzu-
passen oder fⁿr einige Menⁿpunkte neue Texte darzustellen.
Sie mⁿssen dazu vorher die newMenus-EintrΣge entsprechend abgeΣndert
haben.
DerRⁿckgabewert entspricht dem von SetGUI.
ACHTUNG: Sie k÷nnen hiermit nicht die Menⁿstruktur an sich verΣndern,
Sie k÷nnen nur den Font oder die Menⁿ-Texte Σndern !
1.6.8 RedrawGadgets (V38.0)
Alle Gadgets entfernen, Position und Gr÷▀e neu berechnen und wieder
darstellen.
void RedrawGadgets(struct GUIInfo *gui{A0},
UBYTE setGads{D0});
Es werden alle Gadgets entfernt und dann unter Berⁿcksichtigung der
mit Hilfe von ResizeGadget / NewGadgetFont / NewFontAllGadgets und
NewGadgetText gemachten ─nderungen, auf den Bildschirm gebracht.
Ist setGads gleich 0, so kann die Gadget-Liste, wie bei CreateGadget
noch vorher selber abgeΣndert werden (z.B. fⁿr GENERIC_KIND).
Diese Funktion kann nur seinen Dienst verrichten, wenn mit Hilfe
von CreateGUIInfoTags/CreateGUIInfoTagList GUI_ResizableGads auf 1
gesetzt worden ist.
Der Rⁿckgabewert entspricht dem von SetGUI. Man sollte aber beachten,
da▀ wenn setGads == 0 ist, Sie trotzdem guiSet zurⁿckbekommen !
ZusΣtzlich kann noch folgender Wert zurⁿckgeliefert werden :
rdGUIContextError Der erneute Aufruf von CreateContext schlug fehl.
Erhalten Sie nicht guiSet zurⁿck, sollten Sie FreeGUIInfo ausfⁿhren,
und ggf alles noch einmal von vorne versuchen bzw Ihr Programm ab-
brechen.
1.6.9 ResizeGadget (V38.0)
Definieren von neuer Position und Gr÷▀e eines Gadgets
void ResizeGadget(struct GUIInfo *gui{A0},
WORD nbr{D0},
WORD left{D1},
WORD top{D2},
WORD width{D3},
WORD height{D4});
Hiermit geben Sie dem angegebenen Gadget eine neue Position und
Gr÷▀e, die erst nach einem Aufruf von RedrawGadgets wirksam wird.
Sie k÷nnen auch fⁿr die einzelnen Werte preserve = -1 angeben,
um den Wert beizubehalten.
1.6.10 NewGadgetText (V38.0)
Definieren eines neuen Gadget-Textes
void NewGadgetText(struct GUIInfo gui{A0},
WORD nbr{D0},
STRPTR text{A1});
Hiermit geben Sie dem angegebenen Gadget einen neuen Text. Die
─nderung wird aber erst nach einem Aufruf von RedrawGadgets wirksam.
1.6.11 NewGadgetFont (V38.0)
Neuer Font fⁿr ein Gadget
void NewGadgetFont(struct GUIInfo *gui{A0},
WORD nbr{D0},
struct TextAttr *font{A1});
─ndert den Font des Gadgets. Diese ─nderung wird erst nach
einem Aufruf von RedrawGadgets wirksam.
1.6.12 NewFontAllGadgets (V38.0)
─ndert den Font fⁿr alle Gadgets.
void NewFontAllGadgets(struct GUIInfo *gui{A0},
struct TextAttr *font{A1});
─ndert den Font der Gadgets. Diese ─nderung wird erst nach
einem Aufruf von RedrawGadgets wirksam.
1.6.13 DrawBox (V38.0)
Zeichnet die BevelBox mit den angegebenen Ma▀en ggf. recessed.
void DrawBox(struct GUIInfo *gui{A0},
WORD left{D0},
WORD top{D1},
WORD width{D2},
WORD height{D3},
UBYTE recessed{D4});
1.6.14 ShowRequester (V38.0) / ShowRequesterTag
Zeigt den entsprechenden Requester an.
LONG ShowRequester(struct GUIInfo *gui{A0},
STRPTR text{A1},
ULONG kind{D0},
ULONG tagitem, tagdata, ...{A2});
oder
LONG ShowRequesterTag(struct GUIInfo *gui{A0},
STRPTR text{A1},
ULONG kind{D0},
struct TagItem *tags{A2});
text EnthΣlt den Gadget-Text. Dieser kann aus mehreren Zeilen be-
stehen, die durch '\n' getrennt werden.
kind Requester-Kind
tags Zeiger auf Tag-Liste. Folgende Tags sind m÷glich:
SR_Gadgets Zeiger auf String, der die Gadget-Text enthΣlt.
Die einzelnen Texte werden durch '|' getrennt.
SR_Args Zeiger auf Argumente, falls vorhandne
SR_Flags Flags (32 Bit). momentan unbenutzt, daher
nicht auf einen Wert ungleich 0 setzen !
SR_Title Zeiger auf String. EnthΣlt den Titel des
Requesters. Voreingestellt ist NULL, d.h. der
Requester bekommt den des Referenzwindows.
SR_IDCMP Zeiger auf LONG. Voreinstellung : NULL
Hier k÷nnen Sie IDCMPFlags angeben, bei denen
der Requester beendet wird. Es wird dann -1
zurⁿck geliefert und in der Variable, auf
die SR_IDCMP zeigt, steht dann das IDCMPFlag,
das den Requester beendet hat.
SR_ReqWindow Hier k÷nnen Sie einen Window-Zeiger angeben, der
bestimmt, auf welchem Window der Requester er-
scheint.
DefaultmΣ▀ig erscheint der Requester auf dem Window, das ⁿber das
GUIInfo angegeben wird. Sie k÷nnen hier aber auch fⁿr gui NULL an-
geben, dann wird der Window-Zeiger aus der Process-Struktur be-
nutzt. Des weiteren haben Sie die M÷glichkeit, den Zeiger noch
ⁿber das SR_ReqWindow-Tag zu Σndern.
1.6.15 SetProcessWindow (V38.0)
Umleiten der Requester
struct Window *SetProcessWindow(struct Window *window{A0});
Es wird der pr_WindowPtr-Eintrag der Process-Struktur auf window ge-
setzt und der alte Wert wird zurⁿckgeliefert. Sie sollten sich
diesen Wert merken und am Ende des Programm diesen wieder herstellen.
(siehe auch CreateGUIInfoTags und set/restore-ProcessWindow)
1.6.16 SimpleReq (V38.0)
Zeigt den entsprechenden Requester an.
LONG SimpleReq(STRPTR text{A0},
ULONG kind{D0});
Es wird ShowRequester aufgerufen mit den Parametern:
ShowRequester(NULL, text, kind, NULL)
1.7 GUITools-Gadgets
----------------
1.7.1 CreateSpecialGadget (V38) / CreateSpecialGadgetTag (V38)
GUITools-Gadgets erstellen
void CreateSpecialGadget(struct GUIInfo *gui{A0},
WORD left{D0},
WORD top{D1},
WORD width{D2},
WORD height{D3},
ULONG kind{D4},
ULONG tagitem, tagdata, ...{A1});
oder
void CreateSpecialGadgetTag(struct GUIInfo *gui{A0},
WORD left{D0},
WORD top{D1},
WORD width{D2},
WORD height{D3},
ULONG kind{D4},
struct TagItem tags{A1});
Es wird eins der GUITools-eigenen Gadgets erstellt, das Sie im
weiteren genauso wie die GadTools-Gadgets behandlen k÷nnen.
Es wird keine Fehlermeldung ausgegeben, falls das Gadget
nicht erstellt werden konnte. Dies geschieht spΣter ⁿber SetGUI().
Fⁿr jedes Gadget wird im UserData-Eintrag der Gadget-Struktur noch
ein Zeiger auf folgende Struktur angelegt ab (V38.0):
struct GUIGadgetInfo {
APTR userData; hier k÷nnen eigene Daten eingetragen werden
ULONG kind; Gadget-Kind
};
Dieser Zeiger darf nicht verΣndert werden. Wird der userData-Eintrag
selber ben÷tigt, so mu▀ der userData^.userData-Eintrag dafⁿr genutzt
werden ! GUITools setzt diesen userData-Eintrag automatisch auf den in
der NewGadget-Struktur angegebenen.
▄ber kind k÷nnen Sie selber nachfragen, um was fⁿr ein Gadget es
sich eigentlich handelt.
Ist GFLG_AddBorderDims in gui->flags gesetzt, so wird zu left noch
window->BorderLeft und zu top noch window->BorderTop hinzuaddiert,
damit die Gadgets, egal welchen Font Sie benutzen, immer im inneren
des Windows liegen.
1.8 Refresh-Funktionen
------------------
1.8.1 BeginRefresh (V38)
Ersatz fⁿr GadTools.GTBeginRefresh
void BeginRefresh(struct GUIInfo *gui{A0});
Diese Funktion mu▀ anstelle von GadTools.GTEndRefresh benutzt
werden, da GUITools noch einige Refresh-Funktionen ausfⁿhrt, um
z.B. die GUITools-Gadgets zu refreshen.
1.8.2 EndRefresh (V38)
Ersatz fⁿr GadTools.GTEndRefresh
void EndRefresh(struct GUIInfo *gui{A0},
UBYTE complete{D0});
Diese Funktion mu▀ anstelle von GadTools.GTEndRefresh benutzt
werden, da GUITools noch einige Refresh-Funktionen ausfⁿhrt, um
z.B. die GUITools-Gadgets zu refreshen.
Haben Sie beim Aufruf von CreateGUIInfoTags noch GUI_RefreshWindow-
Frame gesetzt bzw GUI_ResizableGads gesetzt, dann wird nun auch
noch zusΣtzlich der Window-Rahmen erneuert mit Hilfe der Refresh-
WindowFrame-Funktion von Intuition.
2. Arbeiten mit GUITools
=====================
2.1 Richtlinien
-----------
Die GUIInfo-Struktur, die bei fast allen Prozeduren mit ⁿbergeben
werden mu▀, enthΣlt alle wichtigen Werte. Diese Struktur ist aber
teilweise PRIVATE, d.h. es gibt einige Felder, die Sie nicht be-
rⁿhren dⁿrfen ! Des weiteren ist die enthΣlt die Struktur am Ende
noch weitere private EintrΣge, auf die Sie nicht zugreifen k÷nnen.
Daraus resultiert, da▀ diese Struktur NIE von Hand erstellt werden
darf, immer nur ⁿber CreateGUIInfo / CreateGUIInfoTags ab (V38.0).
Genauso mu▀ sie, ob SetGUI erfolgreich war oder nicht, immer ⁿber
FreeGUIInfo freigegeben werden !
Die GUIInfo-Struktur wird sich im Aufbau, d.h. die PRIVATE Felder,
und auch in der LΣnge verΣndern. Solange Sie nur die dokumentier-
ten EintrΣge benutzen, kann nichts passieren.
Setzen Sie bei den Flags nur die bekannten, alle anderen mⁿ▀en
wegen der AufwΣrtskompatibilitΣt gel÷scht sein !
Benutzen Sie bitte keine Prozeduren aus der GadTools.library zu-
sammen mit GUITools. GUITools bietet fⁿr fast alle Funktionen der
GadTools-Library Ersatz an (bis auf die Filter-Funktionen und
die GTGetGadgetAttrsA-Funktion der Version 39).
ACHTUNG: Bis auf FreeGUIInfo fⁿhrt keine der Prozeduren, die einen
GUIInfoPtr erwarten, einen NULL-Check fⁿr diesen durch.
Dieses mu▀ nach dem Aufruf von CreateGUIInfo / CreateGUIInfoTags
ab (V38.0) selber durchgefⁿhrt werden !
Genauso wird kein RangeCheck bei den Funktionen durchgefⁿhrt, die
eine Gadget-Nummer erwarten !
GUITools benutzt zum Merken eigener interner Werte fⁿr die Gadgets
den userData-Eintrag der Gadget-Struktur. D.h. dieser kann nicht
mehr direkt zur Speicherung von eigenen Daten verwendet werden,
ansonsten kommt es zu folgenschweren Kollisionen. Sie k÷nnen aber
trotzdem eigene Daten zu jedem Gadget in der von GUITools erstell-
ten Struktur mit speichern. (s. CreateGadget)
Obwohl es m÷glich ist, den Gadgets willkⁿrlich IDs zuzuordnen, ist
es sinnvoller, die normale Reihenfolge (also erstes Gadget die ID 0,
zweites ID 1 usw.) einzuhalten. Denn einige Prozeduren zur Manipu-
lation von Gadgets erwarten als Argument nicht die ID sondern die
Nummer (z.B ModifyGadget, GadgetStatus etc).
Wenn diese beiden Zahlen aber nicht ⁿbereinstimmen, mⁿssen Sie selber
fⁿr die entsprechende Umrechnung sorgen. Ab (V38.0) erhalten Sie bei
IntuiMessages automatisch nicht nur die Gadget-ID, sondern auch noch
die Gadget-Nummer, so da▀ hier eine Umrechnung entfallen kann.
Wenn Sie irgendetwas (Screens, Windows, Fonts etc) ⁿber GUITools
anfordern, mⁿssen Sie diese auch wieder mit Funktionen von GUITools
zurⁿckgeben.
2.2 Resourcenfreigabe (V38.0)
-------------------------
Generell gilt, alles was Sie ⁿber GUITools anfordern, mⁿssen Sie auch
spΣter wieder zurⁿckgeben ⁿber entsprechende Funktionen.
Es gibt hier aber zwei kleine nⁿtzliche Ausnahmen:
1. Fⁿr mit OpenIntWindow / OpenIntWindowTags angeforderte Windows reicht
es aus, CloseIntWindow aufzurufen. Sie ben÷tigen dann keinen Aufruf
vorher von FreeGUIInfo.
2. Fⁿr mit OpenIntScreen angeforderte Screens reicht es aus, diese wieder
ⁿber CloseIntScreen zu schlie▀en. Alle Windows die zu dem Zeitpunkt
noch ge÷ffnet sind werden automatisch vorher mit Hilfe von
CloseIntWindow geschlossen.
Dadurch ersparen Sie beim Schlie▀en die Abfragen, ob das vorherige
÷ffnen ⁿberhaupt erfolgreich war. Eine Abfrage, ob der Screen auf ist,
reicht aus, bzw das Window, wenn kein eigener Screen benutzt wird.
2.3 Menⁿ-Erstellung
---------------
Will man folgendes Menⁿ erstellen, genⁿgen die darauf folgenden
Aufrufe: (GUI steht fⁿr einen vorher erstellen Zeiger auf eine GUIInfo-
Struktur !)
PROJEKT EDIT
-------------------------------------------------
LOAD CUT
SAVE PASTE
QUIT
MakeMenuEntry(GUI, NM_TITLE, "PROJEKT", NULL);
MakeMenuEntry(GUI, NM_ITEM, "LOAD", "L");
MakeMenuEntry(GUI, NM_ITEM, "SAVE", "S");
MakeMenuEntry(GUI, NM_ITEM, "QUIT", "Q");
MakeMenuEntry(GUI, NM_TITLE, "EDIT", NULL);
MakeMenuEntry(GUI, NM_ITEM, "CUT", "C");
MakeMenuEntry(GUI, NM_ITEM, "PASTE", "V");
Bei der Abfrage ist zu beachten, da▀, wenn Sie unter (V37.3) arbeiten
oder aber nicht GetIntMsg bzw WaitIntMsg benutzen, Sie selber dafⁿr
verantwortlich sind, die Mehrfachauswahl von Menu-(Sub-)Items zu ver-
arbeiten.
Ab (V38.0) erhalten Sie ⁿber mehrfachen Aufruf von GetIntMsg/WaitIntMsg
automatisch nacheinander alle Auswahlen der Mehrfachauswahl, so als
wΣren die Items nicht gleichzeitig, sondern nacheinander ausgewΣhlt
worden.
Sie k÷nnen nun nach jedem Aufruf von MakeMenuEntry die soeben erstellte
NewMenu-Struktur ⁿber GUI->newmenu->allMenus[GUI->actmenu-1] bzw ab
(V38.0) ⁿber GUI->menuAdr erreichen und dort weitere Werte eintragen,
z.B. den userData-Eintrag belegen.
2.4 Font-Behandlung
---------------
Der von TopazAttr() gelieferte Zeiger auf den topaz/8-Font kann
z.B. bei OpenIntScreen/OpenIntScreenTags (V38.0) benutzt werden,
um sicher zu gehen, welchen Font Ihr Screen benutzt.
Sehr nⁿtzlich ist dieser Zeiger aber auch zur Erstellung von
Gadgets auf einem Public-Screen, indem man diesen Zeiger in das
newgad.ng_TextAttr-Feld der GUIInfo-Struktur eintrΣgt. Dadurch
l÷st man das Problem, sein GUI an einen unbekannten Font anzu-
passen. Dieses tut z.B. die gesamte Systemsoftware.
Man mu▀ sich nur noch an den Font anpassen, der in der Titel-
zeile benutzt wird.
Sehr einfach geht dies durch Benutzung von CreateGUIInfoTags (V38.0)
und dem setzen von GFLG_AddBorderDims im flags-Feld. Dadurch sind die
Gadgets immer im inneren des Windows. Gleichzeitig gibt man bei den
Tags unter GUI_GadFont TopazAttr() an. Nun sollte man vorher beim
╓ffnen des Windows noch die Tags WA_InnerWidth, WA_InnerHeight und
WA_AutoAdjust benutzt haben mit Hilfe von OpenIntWindowTags (V38.0).
Und schon haben Sie immer, egal welche Voreinstellungen fⁿr den
Public-Screen wirksam sind, ein vernⁿnftig aussehendes GUI, das
immer auf den Screen pa▀t.
2.5 Key-Equivalente (V38.0)
-----------------------
Es ist sehr schade, da▀ GadTools die Key-Equivalente nur dadurch
unterstⁿtzt, da▀ die entsprechenden Zeichen optisch hervorgehoben
werden.
GUITools geht hier ein paar entscheidene Schritte weiter:
Setzen Sie vor dem Erstellen Ihrer Gadgets das Flag GFLG_VanillaKeyNo-
tify und nun merkt sich GUITools alle Buchstaben-Key-Equivalente.
Setzen Sie noch zusΣtzlich das GFLG_ConvertKeys-Flag und nun erhalten
Sie nach einem Aufruf von WaitIntMsg / GetIntMsg nur noch Intui-
Messages fⁿr Gadgets. GUITools wandelt automatisch die IDCMP_VANILLAKEY-
Messages in die entsprechenden Gadget-Messages um.
Dabei mⁿssen Sie aber beachten, da▀ GUITools nur die entsprechenden
Felder in der GUIInfo-Struktur abΣndert, die Felder im im-Feld
bleiben unverΣndert ! Sie mⁿssen also immer die Felder der GUIInfo-
Struktur abfragen (msgClass, cardCode etc.)
Was macht man aber, wenn man Key-Equivalente haben will, die nicht
(nur) aus Buchstaben bestehen, wie z.B. der AmigaGuide (> und <) ?
Wenn Sie nicht das Flag GFLG_AllowAllVanillaKeys gesetzt haben, wird
sich GUITools weigern, diese ⁿberhaupt zu verarbeiten. Ist dieses
Flag gesetzt, so k÷nnen Sie solche Gadgets zwar generieren, aber
die Abfrage geschieht noch nicht von selbst.
Dafⁿr wurde die VanKeyFct geschaffen. Diese Funktion wird, wenn
vorher das Flag GFLG_CallVanillaKeyFct gesetzt wurde, und im vanKeyHook-
Feld der GUIInfo-Struktur ein Zeiger auf eine entsprechende Funktion
angegeben wurde, automatisch aufgerufen.
Sie bekommt in D0 den VanillaKey-Code und in A0 und A1 einen Zeiger
auf ein WORD.
Diese Funktion mu▀ nun schauen, ob die Taste zu einem Gadget pa▀t,
diese Nummer dann in den WORD-Wert auf den A0 zeigt, eintragen
und noch in dem WORD-Wert auf den A1 zeigt, angeben, ob die das
Gadget so ausgewertet werden soll, als ob SHIFT gedrⁿckt wurde,
oder ganz normal. Fⁿr ganz normal geben Sie eine 0 an, ansonsten
eine 1. Wenn Sie die Taste verwerten konnten, liefern Sie 1 zurⁿck,
ansonsten FALSE.
Beispiel: Angenommen, Sie wollen den AmigaGuide nachprogrammieren.
Abgesehen von vielen anderen Gadgets haben Sie das
'Browse _<'- und das 'Browse _>' - Gadget. Das erstere
davon habe die ID 5 und das zweite die ID 6.
Ihre VanKeyFct k÷nnte dann so aussehen:
ULONG KeyFctDemo(register __d0 char key ;
register __a0 WORD *nbr;
register __a1 WORD *shift);
/* geta4 ist nicht notwendig, da keine globalen Variablen ben÷tigt
werden ! */
{
if (key == '<')
{
*nbr = 5;
*shift = 0;
return 1;
}
if (key == '>')
{
*nbr = 6;
*shift = 0;
return 1;
}
return 0;
}
Mit dieser Hook-Funktion k÷nnen Sie jede X-beliebige Taste jedem
Gadget zuordnen und Sie brauchen sich ⁿberhaupt nicht mehr darum
zu kⁿmmern, ob die Taste gedrⁿckt wurde oder das Gadget. Fⁿr die
Abfrage sieht beides gleich aus.
2.6 Resizable Gadgets (V38.0)
-------------------------
2.6.1 Einleitung
In letzter Zeit kommt es immer mehr in Mode, die OberflΣchen Font-
Sensitive und gr÷▀enverΣnderbar zu gestalten.
Das ist auch mit GUITools m÷glich. Sie werden dabei durch mehrere
Funktionen unterstⁿtzt, die es erlauben, die OberflΣche an neue
Situationen anzupassen.
2.6.2 Font-Sensitive
Die Gr÷▀e des Windows mⁿ▀en Sie zuerst selber berechnen. Rufen Sie
dann OpenIntWindowTags mit den Tags WA_InnerWidth, WA_InnerHeight und
WA_AutoAdjust, 1 auf.
Damit Ihre Gadgets immer im Inneren liegen, setzen Sie das Flag
GFLG_AddBorderDims und schon sind alle Probleme verschwunden. Benutzen
Sie auf jedem Fall CreateGUIInfoTags und nicht CreateGUIInfo.
(s. Font-Behandlung)
2.6.3 Resizable-Gadgets
Zuerst mⁿ▀en Sie beim Aufruf von CreateGUIInfoTags das Tag
GUI_ResizableGads mit dem Wert 1 angeben.
Wenn Sie nun die Nachricht bekommen, da▀ sich die Gr÷▀e des Windows
geΣndert hat, rufen Sie fⁿr jedes Gadget ResizeGadget auf und
ⁿbergeben dort die neuen Werte.
Danach reicht der Aufruf von RedrawGadgets und Ihre OberflΣche fⁿllt
wieder das Window optimal aus.
GUITools unterstⁿtzt Sie momentan noch nicht in der Berechnung der
neuen Positionen und Gr÷▀en der Gadgets. Darum mⁿssen Sie sich noch
selber kⁿmmern.
Verwenden Sie Gadgets vom Typ GENERIC_KIND oder solche bei denen Sie
nach dem Aufruf von CreateGadget noch selber Hand anlegen und Werte
hinzufⁿgen (meistens eben bei GENERIC_KIND), dann mⁿssen Sie auf
jedem Fall RedrawGadgets(GUI, 0) aufrufen, da sich GUITools die
VerΣnderungen, die Sie sozusagen von Hand gemacht haben, nicht
merken kann. Fⁿgen Sie nach diesem Aufruf also noch die VerΣnderungen
der betroffenen Gadgets ein und rufen dann SetGUI auf.
2.7 GUITools-Gadgets (V38.0)
------------------------
2.7.1 Einfⁿhrung
GUITools stellt Ihnen einige nⁿtzliche Gadgets zur Verfⁿgung, mit
denen das Erstellen und VerΣndern der OberflΣche einfacher wird.
In Wirklichkeit sind die GUITools-Gadgets keine echten Gadgets,
sie werden nur simuliert.
Sie k÷nnen die Gadgets mit CreateSpecialGadget erstellen. ▄ber
die Tags k÷nnen Sie das Aussehen folgenderma▀en verΣndern:
SG_GadgetText : Hier k÷nnen Sie einen Zeiger auf den Gadget-Text
angeben.
SG_GadgetFlags: Geben Sie hier die Flags fⁿr NewGadget an.
Nach dem Erstellen k÷nnen Sie mit den Gadgets genauso verfahren,
wie mit den GadTools-Gadgets, d.h. ModifyGadget, ResizeGadget usw
k÷nnen ohne weiteres benutzt werden. Es darf nur nicht der
Gadget-Zeiger aus der Gadget-Liste (gui->gadgets->allGadgets[x]) benutzt
werden, da dieser auf eine Dummy-Gadget-Struktur zeigt !
2.7.2 ProgressIndicator-Kind
Dieses Gadget bietet einen Balken, der z.B. anzeigt, wie weit
ein entsprechender Vorgang schon fortgeschritten ist.
kind = progressIndicatorKind
Sie k÷nnen folgende Tags angeben (Erstellen und ─ndern):
SGPI_MaxValue : (Default 100) Gibt an, in wieviele Teile das
Gadget eingeteilt werden soll.
SGPI_CurrentValue : (Default 0) Gibt an, wieviel schon erreicht
ist.
Der Gadget-Text sollte nicht in das Gadget geschrieben werden und
er darf keinen Underscore enthalten.
Dieses Gadget ist ein reines Anzeige-Gadget, d.h. es sendet nie-
mals IntuiMessages.
2.7.3 BevelBox-Kind
Dieses Gadget stellt eine BevelBox dar, die entweder recessed ist
oder nicht.
kind = bevelboxKind
Beim Erstellen k÷nnen Sie folgende Tags angeben:
SGBB_Recessed : (Default 0) Gibt an, ob die Box recessed sein
soll oder nicht.
BevelBox-Gadgets sollten in der aktuellen Version nicht mit Text
versehen werden.
Da das BevelBox-Gadget in Wirklichkeit kein echtes Gadget ist,
k÷nnen sich innerhalb der Box ruhig andere Gadgets befinden !
Dieses Gadget ist ein reines Anzeige-Gadget, d.h. es sendet nie-
mals IntuiMessages.
2.8 Requester (V38.0)
-----------------
2.8.1 Requester umleiten (V38.0)
Wenn Sie ab (V38.0) CreateGUIInfoTags benutzen, so haben Sie die
M÷glichkeit, automatisch den pr_WindowPtr-Eintrag der Process-Struktur
auf das Window zu setzen, so da▀ alle Requester nun an der richtigen
Stelle erscheinen.
Genauso k÷nnen Sie erreichen, da▀ bei einem Aufruf von FreeGUIInfo
automatisch der alte Wert, der vor dem Aufruf von CreateGUIInfoTags dort
war, in den pr_WindowPtr-Eintrag der Process-Struktur zurⁿckgeschrieben
wird.
Solange Sie nur ein einziges Window benutzen gibt es hier keine Probleme.
Sobald Sie aber mehrere Windows benutzen, sollten Sie folgendes beachten,
wenn Sie GUI_SetProcessWindow und GUI_RestoreProcessWindow eingeschaltet
haben:
Sie ÷ffnen das erste Window, der Eintrag in der Process-Struktur wird
geΣndert, der alte Wert wird gemerkt. Sie ÷ffnen nun ein weiteres
Window, nun wird wieder der Eintrag der Process-Struktur geΣndert und
der alte Wert, also ein Zeiger auf das erste Window (!), gemerkt.
Beim Schlie▀en der Windows bzw beim freigeben ⁿber FreeGUIInfo (das
ja automatisch ⁿber CloseIntWindow ausgefⁿhrt wird) mⁿ▀ten Sie also
in umgekehrter Reihenfolge vorgehen, um den richtigen Wert wieder
in der Process-Struktur zu haben.
Wenn Sie nun aber schlau (?) waren und benutzen CloseIntScreen, um
alle Windows zu entfernen (oder eine Σhnliche Methode), so haben
Sie keine Kontrolle mehr darⁿber, in welcher Reihenfolge die Windows
geschlossen werden ! Also sollten Sie bei mehreren Windows immer nur
bei einem einzigen Window das GUI_RestoreProcessWindow-Tag setzen und
bei allen anderen l÷schen.
Eigene Requester k÷nnen Sie bequem mit ShowRequester (V38.0) auf den
Screen des Windows bringen, dafⁿr mⁿssen Sie nicht den Eintrag in der
Process-Struktur verΣndern. Lediglich fⁿr System-Requester ist dieses
angebracht.
2.8.2 Eigene Requester (V38.0)
Sie k÷nnen eigene Requester leicht mit der ShowRequester-Funktion
erstellen. Dabei kennt GUITools schon ein paar vordefinierte Re-
quester:
okReqKind : Dieser Requester enthΣlt nur ein Gadget mit dem Text
"OK". Im normalfall wird dann reqOK zurⁿckgeliefert.
doitReqKind : Dieser Requester enthΣlt die Gadgets "YES" und "NO".
Es wird entweder reqDo fⁿr "YES" oder reqLeave fⁿr
"NO" zurⁿckgeliefert.
yncReqKind : Yes-No-Cancel-Requester. Er enthΣlt die Gadgets
"YES", "NO" und "CANCEL" und liefert entsprechend
reqYes, reqNo oder reqCancel zurⁿck.
Bei den vordefinierten Requester mⁿ▀en Sie das SR_Gadgets-Tag nicht
mehr mit angeben. Sie k÷nnen es aber tun, um z.B. deutsche Texte
anzuzeigen.
Wollen Sie einen absolut eigenen Requester haben, benutzen Sie den
generalReqKind. Jetzt mu▀ aber unbedingt das SR_Gadgets-Tag angegeben
werden. Intern wird die EasyRequestArgs-Funktion von Intuition be-
nutzt. Sie k÷nnen ⁿber entsprechende Tags alle Werte der EasyStruct-
Struktur angeben.
ShowRequester liefert den Wert von EasyRequestArgs zurⁿck.
▄bergeben Sie einen GUIInfo-Zeiger, so erscheint der Requester auf
dem damit spezifizierten Window. Bei NULL dafⁿr wird der Eintrag der
Process-Struktur benutzt.
Diesen k÷nnen Sie mit der SetProcessWindow-Funktion verΣndern. Aber
setzen Sie ihn immer am Ende des Programms zurⁿck !
Einfacher geht es mit der SimpleReq - Funktion. Hier k÷nnen Sie nur
einen Text und den Requester-Kind ⁿbergeben. Der Requester erscheint
immer auf dem ⁿber die Process-Struktur angegebenen Window.
3. Fehler / Bugs / Probleme
========================
3.1 Probleme bei V37.3
------------------
3.1.1 CreateGUIInfo - CreateGUIInfoTags / CreateGUIInfoTagList
(Menu-Font-Behandlung)
Zu spΣt erkannte ich, da▀ es nicht sehr sinnvoll ist, fⁿr die Menⁿleiste
den Font des Windows zu benutzen. Solange man - wie ich - immer einen
eigenen Screen benutzt, der denselben Font wie das Window hat, gibt es
logischerweise keine Probleme.
╓ffnet man hingegen ein Window auf dem Public-Screen (Workbench), so
kann das doch unter UmstΣnden unsch÷n aussehen.
Also mⁿ▀te man fⁿr die Menⁿs den Screen-Font benutzen. Nun einfach
gesagt, aber so wie die GUIInfo-Struktur aufgebaut war in (V37.3), so
war es nicht mehr so einfach m÷glich, dieses auf einem kompatiblen Weg
in (V38.0) zu beheben.
Also tritt dieses Problem weiterhin auf, wenn Sie CreateGUIInfo benutzen,
um eben bei gleichen Eingaben die gleichen Ausgaben zu haben (wenn diese
auch nicht immer sinnvoll sind). Dann mⁿ▀en Sie von Hand die Font-Zeiger
verbiegen.
Ab (V38.0) mⁿssen Sie nur noch CreateGUIInfoTags/CreateGUIInfoTagList
benutzen, diese Routine erledigt das dann von selbst.
3.1.2 OpenIntWindow - OpenIntWindowTags / OpenIntWindowTagList (Screen-Titel)
Genauso, wie bei dem Menu-Font, erkannte ich spΣter, da▀ es bei Windows
auf dem Public-Screen (Workbench) nicht immer Sinn macht, den Screen-
Titel auf den eigenen Window-Titel zu setzen.
Um aber kompatibel zu bleiben, wurde diese Funktion nicht ausgebaut.
OpenIntWindow setzt immer noch das WA_ScreenTitle-Tag auf den Titel des
Windows. Wenn Sie ab (V38.0) OpenIntWindowTags/OpenIntWindowTagList
benutzen, so ist dieses nicht mehr der Fall. (Sie k÷nnen dann aber
selber das Tag mit angeben.)
3.1.3 IDCMP_MenuPick-Messages
Unter (V37.3) wurde bei IDCMP_MenuPick-Messages nicht berⁿcksichtigt,
da▀ es auch m÷glich ist, mehrere Menu-(Sub-)Items gleichzeitig auszu-
wΣhlen. Man mu▀ sich dann selber darum kⁿmmern.
Ab (V38.0) entfΣllt dieses, solange Sie GetIntMsg bzw WaitIntMsg benutzen.
Tun Sie dieses nicht und rufen HandleIntMsg selber auf, so erhalten
Sie nur die erste Auswahl von m÷glicherweise mehreren. Dieses mⁿssen Sie
dann selber abfragen.
3.2 Bekannte Fehler
---------------
Bis jetzt sind keine Fehler oder Probleme mit GUITools aufgetreten und
bei mir lΣuft die Library tΣglich in vielen verschiedenen Programmen.
Das hei▀t natⁿrlich nicht, da▀ wirklich alle Fehler gefunden sind. Ich
hoffe aber, da▀ ich mittlerweile alle GRO▀EN FEHLER behoben habe.
Solange man sich an die Richtlinien hΣlt und sich sΣmtliche Beschrei-
bungen genau durchgelesen hat, mⁿ▀te eigentlich alles klappen.
Sollte aber doch einmal ein Fehler oder ein Problem auftreten, verfah-
ren Sie bitte wie folgt:
1. Lokalisieren Sie den Fehler so genau wie m÷glich.
2. Benachrichtigen Sie mich bitte und teilen Sie mir bitte (falls
m÷glich) eine genaue Fehlerbeschreibung und falls vorhanden auch
Fehlerursachen bzw Fehlerbehebung mit.
Sobald mir ein Fehler bekannt wird, werde ich mich bemⁿhen, diesen zu
beseitigen.
3.3 Autor
-----
VorschlΣge, Fehlerberichte, Verbesserungen, Erweiterungen und natⁿr-
lich auch Anerkennung k÷nnen an die folgende Adresse gesendet werden:
Carsten Ziegeler
Augustin-Wibbelt-Str. 7
D-33106 Paderborn
Germany
Bitte beachten Sie, da▀ ich fⁿr zugeschickte Unterlagen keine Haftung
ⁿbernehme und Ihnen diese nur dann zurⁿcksenden kann, wenn ausreichend
Rⁿckporto beigefⁿgt ist. Jede Zusendung erfolgt freiwillig.
Sie k÷nnen mich auch unter folgender EMail-Adresse ereichen:
tarot@uni-paderborn.de
Enjoy it !