|
Hauptseite - Welches System? - Hardware - Software - Emulatoren - |
Internet MausNet Programmieren Verweise Über |
Das folgende Beispiel stellt den Rumpf eines GEM-Programms dar und zeigt das Prinzip der GEM-Programmierung, kann aber auch als Template für das Erstellen eines neuen GEM-Programms dienen.
Sprache | C |
---|---|
Beispiel | gem.c |
#include#include #include #include #if GEMDOS #include #endif #include #include #include #include #include #include #include #define MENUBAR 0 #define DESKTOP 1 #define OK 1 #define ABBRUCH 2 #define ENDE 1 #define DESK 0 BYTE *RscPfad="gem.rsc", *RscFehler="[2][Die Resourcedatei fehlt?][Abbruch]", ScrpPfad[80]; WORD WorkIn[16],WorkOut[57],AplId,VdiHandle,MsgBuff[8], AesHchar,AesWchar,AesHbox,AesWbox,AnzFarben, MausX,MausY,MausButton,SonderTaste,Taste,MausKlicks; BOOL Fertig,IsFarbe; OBJECT *MenuTree,*DeskTop; GRECT Screen; WORD DoDialog(OBJECT *dial) { GRECT size; WORD RetCode; /* Vorbereitung */ wind_update(BEG_UPDATE); wind_update(BEG_MCTRL); form_center(ADDR(dial), ADDR(&size.g_x), ADDR(&size.g_y), ADDR(&size.g_w), ADDR(&size.g_h)); form_dial(FMD_START, size.g_x, size.g_y, size.g_w, size.g_h, size.g_x, size.g_y, size.g_w, size.g_h); objc_draw(ADDR(dial), ROOT, MAX_DEPTH, size.g_x, size.g_y, size.g_w, size.g_h); /* Durchfhrung */ RetCode=form_do(ADDR(dial), ROOT) & 0x7FFF; /* Nachbereitung */ form_dial(FMD_FINISH, size.g_x, size.g_y, size.g_w, size.g_h, size.g_x, size.g_y, size.g_w, size.g_h); wind_update(END_MCTRL); wind_update(END_UPDATE); dial[RetCode].ob_state &= (~SELECTED); /* Knopf deselektieren */ return(RetCode); } WORD DoDia2(OBJECT *dial) { GRECT size; WORD RetCode,DoppelKlick; /* Vorbereitung */ wind_update(BEG_UPDATE); wind_update(BEG_MCTRL); form_center(ADDR(dial), ADDR(&size.g_x), ADDR(&size.g_y), ADDR(&size.g_w), ADDR(&size.g_h)); form_dial(FMD_START, size.g_x, size.g_y, size.g_w, size.g_h, size.g_x, size.g_y, size.g_w, size.g_h); objc_draw(ADDR(dial), ROOT, MAX_DEPTH, size.g_x, size.g_y, size.g_w, size.g_h); /* Durchfhrung */ for (;;) { RetCode=form_do(ADDR(dial), ROOT); DoppelKlick = RetCode&0x8000; RetCode &= 0x7FFF; if ((RetCode == OK) || (RetCode == ABBRUCH)) break; /* weitere spezielle Auswertungen... */ } /* Nachbereitung */ form_dial(FMD_FINISH, size.g_x, size.g_y, size.g_w, size.g_h, size.g_x, size.g_y, size.g_w, size.g_h); wind_update(END_MCTRL); wind_update(END_UPDATE); dial[RetCode].ob_state &= (~SELECTED); /* Knopf deselektieren */ return(RetCode); } void WndRedraw(WORD win, WORD x, WORD y, WORD w, WORD h) { GRECT t1,t2; t2.g_x = x; t2.g_y = y; t2.g_w = w; t2.g_h = h; wind_get(win, WF_FIRSTXYWH, ADDR(&t1.g_x), ADDR(&t1.g_y) ADDR(&t1.g_w), ADDR(&t1.g_h)); while ((t1.g_w != 0) && (t1.g_h != 0)) { /* in Schleife die neuzumalenden Rechtecke aktualisieren */ /* Ueberschneidung errechnen */ if (rc_intersect(&t1, &t2)) { /* Fensterbereich neu zeichnen */ } wind_get(win, WF_NEXTXYWH, ADDR(&t1.g_x), ADDR(&t1.g_y), ADDR(&t1.g_w), ADDR(&t1.g_h)); } } void WndTopped(WORD win) { #if TURBO_C wind_set(win, WF_TOP); #else wind_set(win, WF_TOP, 0, 0, 0, 0); #endif } void WndClosed(WORD win) { wind_close(win); } void WndFulled(WORD win) { wind_set(win, WF_CURRXYWH, Screen.g_x, Screen.g_y, Screen.g_w, Screen.g_h); } void WndArrowed(WORD win, WORD mode) { switch (mode) { case 0: /* Seite nach oben */ break; case 1: /* Seite nach unten */ break; case 2: /* Zeile nach oben */ break; case 3: /* Zeile nach unten */ break; case 4: /* Seite nach links */ break; case 5: /* Seite nach rechts */ break; case 6: /* Spalte nach links */ break; case 7: /* Spalte nach rechts */ break; } } void WndHslid(WORD win, WORD pos) { #if TURBO_C wind_set(win, WF_HSLIDE, pos); #else wind_set(win, WF_HSLIDE, pos, 0, 0, 0); #endif } void WndVslid(WORD win, WORD pos) { #if TURBO_C wind_set(win, WF_VSLIDE, pos); #else wind_set(win, WF_VSLIDE, pos, 0, 0, 0); #endif } void WndSized(WORD win, WORD x, WORD y, WORD w, WORD h) { wind_set(win, WF_CURRXYWH, x, y, w, h); /* Ausschnitt aktualisieren */ } void WndMoved(WORD win, WORD x, WORD y, WORD w, WORD h) { wind_set(win, WF_CURRXYWH, x, y, w, h); } void MenSelected(WORD Eintrag) { switch (Eintrag) { case ENDE: Fertig = TRUE; break; } } void HdleKeybd(WORD Taste) { } void HdleButton(WORD MausX, WORD MausY, WORD MausButton, WORD SonderTaste, WORD MausKlicks) { /* Hier kann auch die Bewegung eines Desktop-Objekts erfolgen */ } void HdleM1(WORD MausX, WORD MausY, WORD MausButton, WORD SonderTaste) { } void HdleM2(WORD MausX, WORD MausY, WORD MausButton, WORD SonderTaste) { } void HdleMesag(WORD *MsgBuff) { switch (MsgBuff[0]) { case AC_OPEN: /* ein Accessory wurde angew„hlt... */ /* MsgBuff[3] Identifikator des Accessories */ break; case AC_CLOSE: /* Accessory wurde geschlossen */ /* MsgBuff[3] Identifikator des Accessories */ break; case MN_SELECTED: /* Menverwaltung... */ MenSelected(MsgBuff[4]); menu_tnormal(ADDR(MenuTree), MsgBuff[3], 1); break; case WM_REDRAW: /* Redraw-Meldung ID und Koordinaten uebergeben */ WndRedraw(MsgBuff[3], MsgBuff[4], MsgBuff[5], MsgBuff[6], MsgBuff[7]); break; case WM_TOPPED: /* falls Fenster aktiviert werden soll */ WndTopped(MsgBuff[3]); /* ID des Fensters */ break; case WM_CLOSED: /* falls Fenster geschlossen werden soll */ WndClosed(MsgBuff[3]); /* ID des Fensters */ break; case WM_FULLED: /* falls Fensters auf volle Gr”že gebracht werden soll */ WndFulled(MsgBuff[3]); /* ID des Fensters */ break; case WM_ARROWED: /* falls einer der Pfeile angeklickt wurde... */ WndArrowed(MsgBuff[3], /* ID des Fensters */ MsgBuff[4]); /* Art der Ver„nderung */ break; case WM_HSLID: /* falls der horizontale Slider bewegt wurde... */ WndHslid(MsgBuff[3], /* ID des Fensters */ MsgBuff[4]); /* Position in Promille */ break; case WM_VSLID: /* falls der vertikale Slider bewegt wurde */ WndVslid(MsgBuff[3], /* ID des Fensters */ MsgBuff[4]); /* Position in Promille */ break; case WM_SIZED: /* falls die Fenstergr”že ver„ndert wurde... */ WndSized(MsgBuff[3], /* ID des Fensters */ MsgBuff[4], /* X-Koordinate des Fensters */ MsgBuff[5], /* Y-Koordinate des Fensters */ MsgBuff[6], /* neue Breite */ MsgBuff[7]); /* neue H”he */ break; case WM_MOVED: /* falls das ganze Fenster bewegt wurde */ WndMoved(MsgBuff[3], /* ID des Fensters */ MsgBuff[4], /* neue x-Koordinate */ MsgBuff[5], /* neue y_Koordinate */ MsgBuff[6], /* Breite */ MsgBuff[7]); /* H”he */ break; case WM_NEWTOP: /* falls Fenster aktiviert werden soll */ WndTopped(MsgBuff[3]); /* ID des Fensters */ break; /* Ab Falcon AES */ case W