Atari Logo
Atari Computer

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

Beispiel: GEM-Rumpf

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


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