|
Hauptseite - Welches System? - Hardware - Software - Emulatoren - |
Internet MausNet Programmieren Verweise Über |
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 |
/***********************************************/ /* 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;
/* 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; }
;>>>>>>>> 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>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<
![]() |
English version not yet available. |