Diese Funktion fordert Speicher für eine Dialog-Strukur an und initialisiert sie.
Deklaration: DIALOG *wdlg_create( HNDL_OBJ handle_exit, OBJECT *tree, void *user_data, WORD code, void *data, WORD flags ); Aufruf: dialog = wdlg_create( handle_exit, tree, user_data, code, data, WDLG_BKGD ); Variable Belegung Bedeutung Eingaben: contrl[0] 160 wdlg_create contrl[1] 2 Einträge in intin contrl[3] 4 Einträge in addrin intin[0] code wird handle_exit() in <clicks> übergeben intin[1] flags addrin[0] handle_exit Zeiger auf die Service-Funktion addrin[1] tree Zeiger auf den Objektbaum addrin[2] user_data Zeiger auf Benutzer-Informationen addrin[3] data wird handle_exit() in <data> übergeben Ausgaben: contrl[2] 0 Einträge in intout contrl[4] 1 Einträge in addrout addrout[0] dialog Zeiger auf die Dialog-Struktur
Beschreibung von <handle_exit>:
<handle_exit> ist der Zeiger auf eine Service-Routine, die u.a. von wdlg_evnt() aufgerufen wird. <handle_exit> wird aufgerufen, wenn auf ein Exit- oder Touchexit-Objekt geklickt wurde (in diesem Fall ist <obj> eine positive Objektnummer) oder wenn ein den Dialog betreffendes Ereignis eingetreten ist (dann ist <obj> negativ und enthält eine entsprechende Funktionsnummer wie z.B. HNDL_CLSD).
Die Parameter werden über den Stack übergeben und die Routine darf Register d0-d2/a0-a2 verändern.
Beispiel für eine Service-Routine:
WORD cdecl handle_exit( DIALOG *dialog, EVNT *events, WORD obj, WORD clicks, void *data ); { if ( obj < 0 ) /* Ereignis oder Objektnummer? */ { /* alle Ereignisse außer HNDL_CLSD */ /* werden bei diesem Beispiel ignoriert */ if ( obj == HNDL_CLSD ) /* Closer betätigt? */ return( 0 ); /* beenden */ if ( obj == HNDL_EDIT ) { /* In Fensterdialogen kann es nützlich sein, Tastenkombinati- onen mit Control in Eingabefeldern zu ignorieren, damit Shortcuts wie z.B. Ctrl-U, Ctrl-W oder Ctrl-Q in der Event- schleife des Programms abgearbeitet werden können. In diesem Fall sollte nach HNDL_EDIT eine 0 zurückgeliefert werden, damit die Taste nicht von objc_edit() bearbeitet wird. */ } } else /* ein Objekt ist angewählt worden */ { switch ( obj ) /* Aktionen einleiten (falls nötig) */ { case ... . . . case MY_EXIT_OBJECT: ..... return( 0 ); /* beenden */ } } return( 1 ); /* weitermachen */ }
Die Parameter haben folgende Bedeutung:
dialog: Zeiger auf eine Dialog-Struktur. Auf die Struktur sollte nicht direkt zugegriffen werden. Die wdlg_xx-Funktionen sollten benutzt werden!
events: Wenn <obj> eine Objektnummer ist (>= 0), dann zeigt <events> auf die EVNT-Struktur, die bei wdlg_evnt() übergeben wurde. Andernfalls ist <events> grundsätzlich 0L und kann nicht zur Adressierung benutzt werden.
obj: >= 0: Objektnummer < 0: Funktionsnummer (siehe unten)
clicks: Anzahl der Mausklicks (falls es sich bei <obj> um eine Objektnummer handelt)
data: der Inhalt hängt von <obj> ab
Bedeutung von <data> abhängig von <obj>:
Falls <obj> eine (positive) Objektnummer ist, wird in <data> die Variable <user_data> übergeben (siehe wdlg_create). <clicks> enthält die Anzahl der Mausklicks auf dieses Objekt.
HNDL_INIT: | <data> ist die bei wdlg_create übergebene Variable. |
-1 | Wenn handle_exit() 0 zurückliefert, legt |
wdlg_create() keine Dialog-Struktur an (Fehler). | |
Die Variable <code> wird in <clicks> übergeben. | |
HNDL_OPEN: | <data> ist die bei wdlg_open übergebene Variable. |
-5 | Die Variable <code> wird in <clicks> übergeben. |
HNDL_CLSD: | <data> ist <user_data>. Wenn handle_exit() 0 |
-3 | zurückliefert, wird der Dialog geschlossen - |
wdlg_evnt() liefert 0 zurück. | |
<events> zeigt auf die bei wdlg_evnt() übergebene | |
EVNT-Struktur. | |
HNDL_MOVE: | <data> ist <user_data>. Wenn handle_exit() 0 |
-9 | zurückliefert, wird der Dialog geschlossen - |
wdlg_evnt() liefert 0 zurück. | |
<events> zeigt auf die bei wdlg_evnt() übergebene | |
EVNT-Struktur. | |
HNDL_TOPW: | <data> ist <user_data>. Wenn handle_exit() 0 |
-10 | zurückliefert, wird der Dialog geschlossen - |
wdlg_evnt() liefert 0 zurück. | |
<events> zeigt auf die bei wdlg_evnt() übergebene | |
EVNT-Struktur. | |
HNDL_UNTP: | <data> ist <user_data>. Wenn handle_exit() 0 |
-11 | zurückliefert, wird der Dialog geschlossen - |
wdlg_evnt() liefert 0 zurück. | |
<events> zeigt auf die bei wdlg_evnt() übergebene | |
EVNT-Struktur. | |
HNDL_EDIT: | <data> zeigt auf ein Wort mit dem Tastencode. |
-6 | Wenn handle_exit() 1 zurückliefert, wird der |
Tastendruck verarbeitet, bei 0 ignoriert. | |
<events> zeigt auf die bei wdlg_evnt() übergebene | |
EVNT-Struktur. | |
HNDL_EDDN: | <data> zeigt auf ein Wort mit dem Tastencode. |
-7 | <events> zeigt auf die bei wdlg_evnt() übergebene |
EVNT-Struktur. | |
HNDL_EDCH: | <data> zeigt auf ein Wort mit der Objektnummer |
-8 | des neuen Edit-Felds. |
HNDL_MESG: | <data> ist <user_data>. Wenn handle_exit() 0 |
-2 | zurückliefert, wird der Dialog geschlossen - |
wdlg_evnt() liefert 0 zurück. | |
<events> zeigt auf die bei wdlg_evnt() übergebene | |
EVNT-Struktur. | |
HNDL_MESG wird nur dann übergeben, wenn ein | |
Nachrichtencode zwischen 20 und 39 empfangen wurde, | |
der nicht mit den anderen Opcodes bearbeitet wird. | |
Wird z.B. für die Ikonifizierung benötigt. | |
Achtung: Dieser Opcode ist erst ab | |
MagiC 4.5 vom 18.4.96 vorhanden. |
Von diesen Funktionsnummern muß nur auf HNDL_CLSD reagiert werden. Alle anderen Ereignisse können je nach Bedarf beachtet werden.
Wenn handle_exit mit einer unbekannten Funktionsnummer in <obj> aufgerufen wird oder eine der obigen Funktionsnummern ignoriert werden soll, muß 1 zurückgeliefert werden.
Bemerkung: WDIALOG-Versionen kleiner als 1.06 haben einen Fehler in der Editobjekt-Behandlung, der bei einem Objektbaum mit nur einem Objekt (ROOT) zu einem Absturz führen kann. Wer unbedingt einen leeren Fensterdialog anzeigen möchte, sollte darauf achten, daß der Baum aus mindestens zwei Objekten besteht.