Home Fensterdialoge Aufrufschema für Fensterdialoge WINDOW DIALOG - OPEN (AES 161)

2.3.2 WINDOW DIALOG - CREATE (AES 160)

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.
-1Wenn 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.
-5Die Variable <code> wird in <clicks> übergeben.
HNDL_CLSD:<data> ist <user_data>. Wenn handle_exit() 0
-3zurü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
-9zurü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
-10zurü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
-11zurü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.
-6Wenn 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
-8des neuen Edit-Felds.
HNDL_MESG:<data> ist <user_data>. Wenn handle_exit() 0
-2zurü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.


Home Fensterdialoge Aufrufschema für Fensterdialoge WINDOW DIALOG - OPEN (AES 161)