Atari Logo
Atari Computer

Hauptseite -
Welches System? -
Hardware -
Software -
Emulatoren -
Internet
MausNet
Programmieren
Verweise
Über

Beispiel: XControl

Das folgende Beispiel ist ein Rumpf für ein Kontrollfeldmodul. Ablauf und Dinge, die zu beachten sind, sind als Kommentar in den Quelltext eingefügt. Dazu gehört eine Includedatei, die die vom Kontrollfeld benutzten Strukturen und die zur Verfügung gestellten Funktionen definiert. Und eine Projektdatei, da für C kein Startupcode benutzt werden darf!

Sprache C
Definitionen xcontrol.h
Beispiel xcontrol.c
Projekt/make xcontrol.prj


xcontrol.h

/***********************************************/
/* Datei: XCONTROL.H          Version 1.01     */
/* ------------------------------------------- */
/* (C) 1991 by MAXON Computer                  */
/* Autoren: Oliver Scholz & Uwe Hax            */
/* Header-Datei fuer die Entwicklung eigener   */
/* CPX-Module                                  */
/***********************************************/


/* Header eines CPX-Moduls --------------------*/

typedef struct 
{
  WORD      magic;
  struct 
  {
    unsigned reserved:  13;
    unsigned resident:  1;
    unsigned boot_init: 1;
    unsigned set_only:  1;
  } flags;
  char      cpx_id[4];
  WORD      cpx_version;
  char      icon_name[14];
  LONG      icon_data[24];
  WORD      icon_info;
  char      cpx_name[18];
  WORD      obj_state;
  BYTE      reserved[370];
} CPX_HEADER;


/* Uebergabestruktur fuer Maus-Ereignisse -----*/

typedef struct 
{  
  WORD      flags;
  WORD      x,y,w,h;
} MOUSE_EVENT; 


/* Ergebnisstruktur fuer Maus-Ereignisse ------*/

typedef struct
{
  WORD      mx,my;
  WORD      mbutton;
  WORD      kbstate;
} MOUSE_RET;


/* Definition der Funktionen zur Ereignis-
   Behandlung ---------------------------------*/

typedef struct
{
  WORD cdecl (*cpx_call)(GRECT *work);
  VOID cdecl (*cpx_draw)(GRECT *clip);
  VOID cdecl (*cpx_wmove)(GRECT *work);
  VOID cdecl (*cpx_timer)(WORD *event);
  VOID cdecl (*cpx_key)(WORD kbstate,
                        WORD key,
                        WORD *event);
  VOID cdecl (*cpx_button)(MOUSE_RET *mrets,
                        WORD nclicks,
                        WORD *event);
  VOID cdecl (*cpx_m1)(MOUSE_RET *mrets,
                        WORD *event);
  VOID cdecl (*cpx_m2)(MOUSE_RET *mrets,
                        WORD *event);
  WORD cdecl (*cpx_evhook)(WORD event,
                        WORD *msgbuff, 
                        MOUSE_RET *mrets,
                        WORD *key, 
                        WORD *nclicks);
  VOID cdecl (*cpx_close)(WORD app_term);
} CPX_INFO;


/* interne Struktur zur Verwaltung residenter
   CPX-Module ---------------------------------*/

typedef struct
{
  VOID *text_start;
  LONG text_len;
  VOID *data_start;
  LONG data_len;
  VOID *bss_start;
  LONG bss_len;
} CPX_SEGMENTS;


/* interne Struktur zum Speichern der Header --*/

typedef struct cpxblock
{ 
  char      filename[14];
  WORD      ok;
  WORD      valid;
  CPX_SEGMENTS  *segments;
  struct cpxblock *next; 
  CPX_HEADER header;
} CPX_BLOCK;


/* vom Kontrollfeld zur Verfuegung gestellte 
   Funktionen ---------------------------------*/

typedef struct 
{ 
  WORD      phys_handle;
  WORD      booting;
  WORD      reserved;
  WORD      rsc_init;
  CPX_BLOCK * cdecl (*get_rootblock)(VOID);
  WORD cdecl (*write_header)(CPX_BLOCK *header);
  VOID cdecl (*do_resource)(WORD num_obs, 
                            WORD num_frstr, 
                            WORD num_frimg, 
                            WORD num_tree, 
                            OBJECT *rs_object, 
                            TEDINFO *rs_tedinfo, 
                            BYTE *rs_strings[], 
                            ICONBLK *rs_iconblk, 
                            BITBLK *rs_bitblk, 
                            LONG *rs_frstr, 
                            LONG *rs_frimg, 
                            LONG *rs_trindex, 
                            struct foobar
                                   *rs_imdope);
  VOID cdecl (*objc_adjust)(OBJECT *tree, 
                            WORD ob_index);
  WORD cdecl (*do_pulldown)(char *entries[],
                            WORD num_items, 
                            WORD checked_item, 
                            WORD font, 
                            GRECT *button_xywh, 
                            GRECT *window_xywh);
  VOID cdecl (*size_slider)(OBJECT *tree,
                            WORD box_index, 
                            WORD slider_index, 
                            WORD total, 
                            WORD seen, 
                            WORD v_h_flag, 
                            WORD min_size);
  VOID cdecl (*pos_hslider)(OBJECT *tree,
                            WORD box_index, 
                            WORD slider_index, 
                            WORD slider_pos, 
                            WORD start, 
                            WORD total, 
                            VOID (*function)());
  VOID cdecl (*pos_vslider)(OBJECT *tree,
                            WORD box_index,
                            WORD slider_index, 
                            WORD slider_pos,
                            WORD start, 
                            WORD total, 
                            VOID (*function)());
  VOID cdecl (*inc_slider)(OBJECT *tree,
                            WORD box_index, 
                            WORD slider_index, 
                            WORD button_index, 
                            WORD increment, 
                            WORD start, 
                            WORD total,
                            WORD *slider_pos, 
                            WORD v_h_flag, 
                            VOID (*function)());
  VOID cdecl (*move_hslider)(OBJECT *tree, 
                            WORD box_index,
                            WORD slider_index, 
                            WORD start, 
                            WORD total,
                            WORD *slider_pos,
                            VOID (*function)());
  VOID cdecl (*move_vslider)(OBJECT *tree, 
                            WORD box_index, 
                            WORD slider_index, 
                            WORD start, 
                            WORD total, 
                            WORD *slider_pos, 
                            VOID (*function)());
  WORD cdecl (*do_form)(OBJECT *tree, 
                            WORD start_obj,
                            WORD *msg_buffer);
  GRECT * cdecl (*rci_first)(GRECT *object_xywh);
  GRECT * cdecl (*rci_next)(VOID);
  VOID cdecl (*multi)(WORD ev_flags, 
                            MOUSE_EVENT *mm1, 
                            MOUSE_EVENT *mm2, 
                            LONG timer);
  WORD cdecl (*alert)(WORD number);
  WORD cdecl (*write_config)(VOID *parameter, 
                            LONG length);
  BYTE * cdecl (*get_resarea)(VOID);
  WORD cdecl (*find_cookie)(LONG cookie, 
                            LONG *version);
  WORD dummy;
  VOID cdecl (*save_mform)(WORD dir, 
                            MFORM *buffer);
} CPX_PARAMS;

xcontrol.c

/* Header-Dateien */
#include 
#include 
#include 

/* Deklaration der zu sichernden Variablen...  */
typedef struct 
{  
   WORD Sprache;
   WORD Schrift;
} STATUS;                       

/* ...und Definition */
STATUS status={ 0,0 };

/* Die zu sichernden Variablen muessen unbedingt als erste
   definiert werden (=> erste Variable im Datensegment)!
   (Achtung vor dubiosen Header-Dateien!) */

/* Resource-Datei deshalb erst hier einladen */
#include "bsp.rsh"
#include "bsp.h"
#include "xcontrol.h" /* darf erst nach "*.rsh" eingebunden werden */

/* sonstige globale Variablen */
CPX_PARAMS *params; /* vom Kontrollfeld bergebener Zeiger auf die Kontrollfeld-Funktionen */
CPX_INFO info={ main,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL };
OBJECT *HDial;

/* Initialisierung des Moduls:                             */
/* Uebergabeparameter: Zeiger auf die zur Verfuegung       */
/* stehendenden Funktionen                                 */
/* 1. Aufruf bei Laden des Headers (par->booting == TRUE)  */
/*    Rueckgabe: 0 bei Set-Only, 1 sonst                   */
/* 2. Aufruf bei Laden des eigentlichen Programms          */
/* (par->booting == FALSE)                                 */
/*    Rueckgabe: Adresse der CPX_INFO-Struktur             */
CPX_INFO * cdecl init(CPX_PARAMS *par)
{
   if (par->booting)
   {
      /* Aufruf bei Laden des Headers */
      return((CPX_INFO *)1L);  /* weitermachen */
   }
   else
   {
      /* Aufruf bei Laden des Programms */
      params=par;  /* Zeiger retten! */
      /* Resource relozieren */
      (*(params->do_resource))(NUM_OBS,NUM_FRSTR,
         NUM_FRIMG,NUM_TREE,rs_object,rs_tedinfo,
         rs_strings,rs_iconblk,rs_bitblk,rs_frstr,
         rs_frimg,rs_trindex,rs_imdope);
      HDial=rs_objects;   /* Variable setzen */
      return(&info); /* Adresse der CPX_INFO-Struktur zurueck */
   }
}  

/* Aufruf nach Doppelclick auf das Icon im Auswahlfenster:    */
/* Zeichnen der Dialogbox, Behandlung der Buttons             */
/* Uebergabeparameter: Koordinaten des Fensterarbeitsbereichs */
/* Rueckgabe: FALSE, wenn der Dialog mittels do_form() abge-  */
/*           arbeitet wird, TRUE, falls eigene Event-Routinen */
/*           benutzt werden sollen                            */
WORD cdecl main(GRECT *curr_wind)
{  STATUS work;
   WORD msg_buff[8];
   WORD button;
   WORD abort_flag=FALSE;

   work=status;
   /* Koordinaten der Dialogbox setzen */
   HDial[ROOT].ob_x=curr_wind->g_x;
   HDial[ROOT].ob_y=curr_wind->g_y;
   /* und Dialogbox zeichnen */
   objc_draw(HDial,ROOT,MAX_DEPTH,HDial[ROOT].ob_x,HDial[ROOT].ob_y,
             HDial[ROOT].ob_width,HDial[ROOT].ob_height);
   /* Dialogbox abarbeiten, bis ein Exit-Objekt angeklickt wurde */
   do
   {
      /* neuer form_do()-Aufruf */
      button=(*params->do_form)(HDial,0,msg_buff);
      /* Doppelklick ausmaskieren */
      if (button>=0)
         button &= 0x7fff;
      /* angeklicktes Objekt auswerten */
      switch (button)
      {
         case SAVE:
            /* Parameter in CPX-Datei speichern */
            (*params->write_config)(&work,sizeof(STATUS));
            HDial[MSAVE].ob_state &= ~SELECTED;
            redraw_object(HDial,ROOT);
            break;
         case OK:
            /* Dialog beenden */
            HDial[MOK].ob_state &= ~SELECTED;
            abort_flag=TRUE;
            break;
         case ABBRUCH:
            abort_flag=TRUE;
            break;
         case -1 /* MU_MESAG */ :
            switch (msg_buff[0])
            {
               case WM_REDRAW:         
                  break;        /* nicht notwendig */
               case WM_CLOSED:
                  /* fuer "resident" notwendig */
                  /* Werte merken */
                  status=work;  
               case AC_CLOSE:
                  abort_flag=TRUE;
                  break;
            }
            break;
      }  
   } while (!abort_flag);
   HDial[button].ob_state &= ~SELECTED;
   return(FALSE);
}

/* Neuzeichnen eines Objekts mit Hilfe der vom */
/* Kontrollfeld gelieferten Rechteck-Liste.    */
/* Uebergabeparameter: Zeiger auf Objektbaum,  */
/*                    Objekt-Index             */
/* Rueckgabe: keine                            */
VOID redraw_object(OBJECT *tree, WORD object)
{  GRECT *clip_ptr,clip,xywh;

   /* absolute Objekt-Koordinaten berechnen */
   objc_offset(tree,object,&xywh.g_x,&xywh.g_y);
   xywh.g_w=tree[object].ob_width;
   xywh.g_h=tree[object].ob_height;
   /* erstes Rechteck holen */
   clip_ptr=(*params->rci_first)(&xywh);
   /* solange noch Rechtecke da sind */
   while (clip_ptr)
   {
      /* clip_ptr: Zeiger auf lokale Variable!! */
      clip=*clip_ptr;  /* deshalb kopieren */
      /* Objekt neu zeichnen */
      objc_draw(tree,object,MAX_DEPTH,clip.g_x,clip.g_y,clip.g_w,clip.g_h);
      /* naechstes Rechteck holen */
      clip_ptr=(*params->rci_next)();
   }
}

/* Dialogbox im Fenster zentrieren             */
/* Uebergabeparameter: Zeiger auf Dialogbox,   */
/*                    Koordinaten              */
/* Rueckgabe: indirekt ber Koordinaten        */
VOID wind_center(OBJECT *tree,WORD *x,WORD *y,WORD *w,WORD *h)
{
   tree[ROOT].ob_x=NecP6[ROOT].ob_x+(NecP6[ROOT].ob_width-tree[ROOT].ob_width)/2;
   tree[ROOT].ob_y=NecP6[ROOT].ob_y+(NecP6[ROOT].ob_height-tree[ROOT].ob_height)/2;
   *x=tree[ROOT].ob_x;
   *y=tree[ROOT].ob_y;
   *w=tree[ROOT].ob_width;
   *h=tree[ROOT].ob_height;
}

xcontrol.prj

;>>>>>>>> DEFAULT.PRJ for use with CPX-modules <<<<<<<<

*                  ; name of executable program is topmost window

=                  ; list of modules follows...

*                  ; compile topmost window

TCFLTLIB.LIB       ; floating point library
TCSTDLIB.LIB       ; standard library

TC>XTL>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<


Best viewed with any browser English version not yet available.

Änderungen und Irrtümer vorbehalten. Letzte Änderung:
14 September 2001.
Home - Mail an den Webmaster - Impressum