home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / program / c / sgem120c / demo / demo.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-21  |  23.1 KB  |  568 lines

  1. /* ------------------------------------------------------------------- *
  2.  * Module Version       : 1.20                                         *
  3.  * Module Date          : 21-05-94                                     *
  4.  * Last Change          : 21-05-94                                     *
  5.  * Author               : Andrea Pietsch                               *
  6.  * Programming Language : Pure-C                                       *
  7.  * Copyright            : (c) 1994, Andrea Pietsch, 56727 Mayen        *
  8.  * ------------------------------------------------------------------- */
  9.  
  10. #include        <stdio.h>
  11. #include        <string.h>
  12. #include        <stdlib.h>
  13. #include        <sys_gem.h>
  14.  
  15. /* ------------------------------------------------------------------- */
  16.  
  17. #include    "demo.h"
  18. #include    "demo.rh"
  19. #include    "demo.rsh"
  20.  
  21. /* ------------------------------------------------------------------- */
  22.  
  23. #pragma        warn -par
  24.  
  25. /* ------------------------------------------------------------------- */
  26.  
  27. #define        PRG_NAME    "SysGem-Demo"
  28. #define        PRG_ID        'DEMO'
  29. #define        ACC_NAME    ""
  30. #define        USR_NAME    "Andreas Pietsch"
  31. #define        USR_ID        'ANPI'
  32. #define        USR_KEY        0L
  33.  
  34. /* ------------------------------------------------------------------- */
  35.  
  36. #define     ASK_TERM        "[2][ Wollen Sie das Demo | wirklich verlassen? ][ [Nein | [Ja ]"
  37. #define         NO_DRAG        "[1][ Auf dieses Fenster können | Sie keine Objekte ziehen! ][ [Abbruch ]"
  38.  
  39. /* ------------------------------------------------------------------- */
  40.  
  41. PARAMETER    par;
  42. LONG        win_id   = 'TX00';
  43. INT        pop      = 1;
  44. BYTE        slid_txt [20][33];  /* Textbuffer für die Sliderbox    */
  45.  
  46. /* ------------------------------------------------------------------- */
  47.  
  48. VOID LoadText ( BYTE *fname );
  49.  
  50. /* ------------------------------------------------------------------- */
  51.  
  52. #define rsc_main    rs_trindex [MAIN]
  53. #define rsc_menu        rs_trindex [MENUE1]
  54. #define rsc_info        rs_trindex [SGINFO]
  55. #define rsc_bits        rs_trindex [BITS]
  56. #define rsc_tool        rs_trindex [TOOLS]
  57. #define rsc_pop         rs_trindex [SPOPUP]
  58. #define rsc_edit        rs_trindex [SEDIT]
  59.  
  60. /* -------------------------------------------------------------------
  61.  * Zeichnet die "Uhr" im Fenster jede Sekunde
  62.  * ------------------------------------------------------------------- */
  63.  
  64. VOID draw_bits ( VOID )
  65.  
  66. {
  67.   LOCAL LONG zeit = 0L;
  68.   LOCAL BYTE s [10];
  69.  
  70.   zeit++;
  71.   sprintf ( s, "%5ld", zeit );
  72.   SetText ( rsc_bits, BI_SEC, s );
  73.   RedrawObj ( rsc_bits, BI_SEC, 0, NONE, UPD_STATE );
  74. }
  75.  
  76. /* -------------------------------------------------------------------
  77.  * Behandelt die Aktivitäten des "Uhren"-Fensters. Wenn das Fenster
  78.  * ausgeblendet oder Iconifiziert wird, müssen die Timer-Funktion
  79.  * ausgeschaltet werden.
  80.  * ------------------------------------------------------------------- */
  81.  
  82. INT handle_bits ( INT msg, INT button, DIALOG_INFO *inf )
  83.  
  84. {
  85.   switch ( msg )
  86.     {
  87.       case SG_START     : SetText ( rsc_bits, BI_SEC, "" );
  88.                           SetProcTimer ( draw_bits );
  89.                           SetTimer ( 700, 0 );
  90.                           break;
  91.       case SG_INVISIBLE : SetTimer ( 0, 0 );
  92.                           break;
  93.       case SG_VISIBLE   : SetTimer ( 700, 0 );
  94.                           break;
  95.       case SG_QUIT      :
  96.       case SG_END       : SetTimer ( 0, 0 );
  97.                           return ( SG_CLOSE );
  98.     }
  99.   return ( SG_CONT );
  100. }
  101.  
  102. /* -------------------------------------------------------------------
  103.  * Wertet Nachrichten von SysInfo aus.
  104.  * ------------------------------------------------------------------- */
  105.  
  106. LONG GetMessage ( BYTE msg, BYTE sub, LONG from, LONG parm )
  107.  
  108. {
  109.   if ( from == 'SINF' )
  110.     {
  111.       if (( msg == MSG_SYSTEM ) || ( msg == MSG_OPEN ))
  112.         {
  113.           if (( sub == 1 ) && ( parm == 'SIAG' ))
  114.             {
  115.               LoadText ( "C:\\CLIPBRD\\SCRAP.TXT" );
  116.             }
  117.           if ( sub == 0 ) Alert ( ALERT_NORM, 1, "[1][ Irgendwas ist schiefgegangen! ][ [Aha ]" );
  118.         }
  119.     }
  120.   return ( 0L );
  121. }
  122.  
  123. /* -------------------------------------------------------------------
  124.  * Ruft die Funktionen von SysInfo auf
  125.  * ------------------------------------------------------------------- */
  126.  
  127. VOID SysInfo ( LONG todo )
  128.  
  129. {
  130.   if ( ProgramExist ( 'SINF' ) == -1 )
  131.     {
  132.       Alert ( ALERT_NORM, 1, "[1][ SysInfo ist (noch) nicht | installiert! ][ [Ok ]" );
  133.       return;
  134.     }
  135.   if ( todo == 'SIAG' ) SendSgMsg ( MSG_SYSTEM, 4, 'SINF', 0L );
  136.                    else SendSgMsg ( MSG_OPEN,   0, 'SINF', todo );
  137. }
  138.  
  139. /* -------------------------------------------------------------------
  140.  * Soll ein Fensterdialog geöffnet werden und steht kein Fenster mehr
  141.  * zur Verfügung, so kann der Dialog entweder abgebrochen (DIAL_ABORT)
  142.  * werden, oder als "normale" Dialogbox weitergeführt werden.
  143.  * ------------------------------------------------------------------- */
  144.  
  145. LOCAL INT no_window_left ( VOID )
  146.  
  147. {
  148.   if ( Alert ( ALERT_NORM, 1, "[4][ Kein Fenster mehr frei! | Möchten Sie mit einer | Dialogbox weiterarbeiten? ][ [Ja | [Nein ]" ) == 1 )
  149.     {
  150.       return ( SG_CONT );
  151.     }
  152.   return ( SG_ABORT );
  153. }
  154.  
  155. /* -------------------------------------------------------------------
  156.  * Mit Hilfe von einer solchen Funktion, können ohne Probleme bestimmte
  157.  * Werte oder Zustände in einem Dialog geprüft werden.
  158.  *
  159.  * ed ist dabei die positive Nummer des Editfeldes, wenn der Cursor das
  160.  * Feld verlassen soll, negativ, wenn der Cursor das Feld betritt.
  161.  *
  162.  * Id ist die Id, die bei WindowDialog angegeben wurde. So kann man eine
  163.  * Routine zum Testen mehrerer Dialoge verwenden.
  164.  *
  165.  *
  166.  * Rückgabe:  -1   Der Cursor soll im Feld bleiben
  167.  *             0   Cursor wurde mittels SetEditField schon gesetzt
  168.  *             1   ok. Weitermachen!
  169.  * ------------------------------------------------------------------- */
  170.  
  171. LOCAL INT check_range ( OBJECT *tree, INT ed, LONG id )
  172.  
  173. {
  174.   BYTE  s [100];
  175.   INT   i;
  176.  
  177.   if ( tree == rsc_edit )
  178.     {
  179.       if ( ed > 0 )
  180.         {
  181.           GetText ( rsc_edit, ed, s );
  182.           i = atoi ( s );
  183.           switch ( ed )
  184.             {
  185.               case SE_Z50_100 : if (( i < 50 ) || ( i > 100 ))
  186.                                   {
  187.                                     Alert ( ALERT_NORM, 1, "[1][ Die Zahl soll zwischen | 50..100 liegen! ][ [Nochmal ]" );
  188.                                     return ( -1 );
  189.                                   }
  190.                                 break;
  191.               case SE_Z90_200 : if (( i < 90 ) || ( i > 200 ))
  192.                                   {
  193.                                     Alert ( ALERT_NORM, 1, "[1][ Die Zahl soll zwischen | 90..200 liegen! ][ [Nochmal ]" );
  194.                                     return ( -1 );
  195.                                   }
  196.                                 break;
  197.               case SE_Z99_101 : if (( i < 99 ) || ( i > 101 ))
  198.                                   {
  199.                                     Alert ( ALERT_NORM, 1, "[1][ Die Zahl soll zwischen | 99..101 liegen! ][ [Nochmal ]" );
  200.                                     return ( -1 );
  201.                                   }
  202.                                 break;
  203.             }
  204.         }
  205.     }
  206.   return ( 1 );
  207. }
  208.  
  209. /* -------------------------------------------------------------------
  210.  * Behandelt alle Aktionen wärend einem Dialog.
  211.  *
  212.  * SG_NOWIN     Kein Fenster mehr da. SG_CONT bedeutet, als Dialog
  213.  *              darstellen --> ist wichtig!
  214.  *
  215.  * SG_START     Der Dialog wird gleich gezeichnet. Hier ist Zeit für
  216.  *              eine eventuelle Initialisierung des Dialogs, Buttons,
  217.  *              Editfelder etc...
  218.  *
  219.  * SG_END       Dialog soll geschlossen werden. button enthält das
  220.  *              Objekt, den der Benutzer gewählt hat.
  221.  *
  222.  * SG_QUIT      wird nach dem Schliessen aufgerufen. Evtl. Speicher
  223.  *              sollte hier freigegeben werden.
  224.  *
  225.  * SG_DRAGDROP  Der User hat Objekte auf das Fenster gezogen. Ob Sie die
  226.  *              Nachricht auswerten oder nicht, liegt allein bei Ihnen.
  227.  * ------------------------------------------------------------------- */
  228.  
  229. LOCAL INT handle_edit ( INT msg, INT button, DIALOG_INFO *inf )
  230.  
  231. {
  232.   switch ( msg )
  233.     {
  234.       case SG_NOWIN       : return (( no_window_left ()));
  235.       case SG_START       : ClearEditFields ( rsc_edit );
  236.                             SetReturn ( TRUE );
  237.                             SetFieldProc ( check_range );
  238.                             SetText ( rsc_edit, SE_Z50_100, "20"  );
  239.                             SetText ( rsc_edit, SE_Z90_200, "100" );
  240.                             SetText ( rsc_edit, SE_Z99_101, "100" );
  241.                             break;
  242.       case SG_END         : switch ( button )
  243.                               {
  244.                                 case SE_CLR : ClearEditFields ( rsc_edit );
  245.                                               SetEditField ( rsc_edit, SE_Z50_100 );
  246.                                               SetText ( rsc_edit, SE_Z50_100, "20"  );
  247.                                               SetText ( rsc_edit, SE_Z90_200, "100" );
  248.                                               SetText ( rsc_edit, SE_Z99_101, "100" );
  249.                                               return ( SG_REDRAW );
  250.                                 default     : return ( SG_CLOSE );
  251.                               }
  252.       case SG_QUIT        : break;
  253.       case SG_DRAGDROP    : Alert ( ALERT_NORM, 1, "[1][ Drag & Drop Aktionen | in dieses Fenster | sind nicht möglich! ][ [Abbruch ]" );
  254.                             break;
  255.     }
  256.   return ( SG_CONT );
  257. }
  258.  
  259. /* -------------------------------------------------------------------
  260.  * Verwaltet die Textfenster. Beim Klick ins Fenster können die Stati
  261.  * der Zeile eingestellt werden (SG_.CLICK), oder beim Klick in die
  262.  * Toolbar wird sortiert (SG_BUTTON).
  263.  * ------------------------------------------------------------------- */
  264.  
  265. INT handle_text ( INT msg, WINDOW_INFO *inf )
  266.  
  267. {
  268.   BYTE  s [200];
  269.  
  270.   switch ( msg )
  271.     {
  272.       case SG_END     : return ( SG_CLOSE );
  273.       case SG_BUTTON  : if ( inf->obj_id == 'TOOL' )
  274.                           {
  275.                             switch ( inf->item )
  276.                               {
  277.                                 case TO_SORT : switch ( Alert ( ALERT_NORM, 3, "[2][ Wie soll sortiert werden? ][ [Auf | A[b | [Nix ]" ))
  278.                                                  {
  279.                                                    case 1  : do_qsort ( inf->id, cmp_strings_up );
  280.                                                              break;
  281.                                                    case 2  : do_qsort ( inf->id, cmp_strings_dn );
  282.                                                    default : break;
  283.                                                  }
  284.                                                break;
  285.                                 default      : break;
  286.                               }
  287.                           }
  288.                         break;
  289.       case SG_KEY     : switch ( inf->key )
  290.                           {
  291.                             case 0x4800 : ScrollWindow ( inf->handle, SCROLL_UP );
  292.                                           break;
  293.                             case 0x4b00 : ScrollWindow ( inf->handle, SCROLL_LEFT );
  294.                                           break;
  295.                             case 0x5000 : ScrollWindow ( inf->handle, SCROLL_DOWN );
  296.                                           break;
  297.                             case 0x4d00 : ScrollWindow ( inf->handle, SCROLL_RIGHT );
  298.                                           break;
  299.                             case 0x4838 : ScrollWindow ( inf->handle, SCROLL_PG_UP );
  300.                                           break;
  301.                             case 0x4b34 : ScrollWindow ( inf->handle, SCROLL_PG_LEFT );
  302.                                           break;
  303.                             case 0x5032 : ScrollWindow ( inf->handle, SCROLL_PG_DOWN );
  304.                                           break;
  305.                             case 0x4d36 : ScrollWindow ( inf->handle, SCROLL_PG_RIGHT );
  306.                                           break;
  307.                           }
  308.                         break;
  309.       case SG_LCLICK1 :
  310.       case SG_LCLICK2 :
  311.       case SG_RCLICK1 :
  312.       case SG_RCLICK2 : if ( inf->line_ptr != NULL )
  313.                           {
  314.                             sprintf ( s, "[2][ Sie haben Zeile %ld, Spalte %ld angeklickt. | Darstellung ändern: ][ [Fett | [Kursiv | [Unterst. | [Nix ]", inf->line, inf->column );
  315.                             switch ( Alert ( ALERT_NORM, 4, s ))
  316.                               {
  317.                                 case  1 : inf->line_ptr [0] |= 1;
  318.                                           RedrawArea ( inf->handle, &inf->draw_area );
  319.                                           break;
  320.                                 case  2 : inf->line_ptr [0] |= 4;
  321.                                           RedrawArea ( inf->handle, &inf->draw_area );
  322.                                           break;
  323.                                 case  3 : inf->line_ptr [0] |= 8;
  324.                                           RedrawArea ( inf->handle, &inf->draw_area );
  325.                                           break;
  326.                                 default : break;
  327.                               }
  328.                           }
  329.                         break;
  330.       case SG_DRAGDROP: LoadText ( inf->dd->data );
  331.       default         : break;
  332.     }
  333.   return ( SG_CONT );
  334. }
  335.  
  336. /* -------------------------------------------------------------------
  337.  * Lädt eine Textdatei und stellt sie im Fenster dar. Die Fenster
  338.  * werden von SysGem verwaltet. Würde statt 'handle_text' NULL über-
  339.  * geben, würde auf keine Nachricht reagiert, außer auf das Schließen
  340.  * des Fensters.
  341.  * ------------------------------------------------------------------- */
  342.  
  343. VOID LoadText ( BYTE *fname )
  344.  
  345. {
  346.   UINT    i;
  347.  
  348.   if ( length ( fname ) > 4 )
  349.     {
  350.       ShowBee ();
  351.       i = Display ( fname, fname, "", 255, win_id, 8, 90, 300, 200, handle_text );
  352.       ShowArrow ();
  353.       if ( i == 0 )
  354.         {
  355.           Alert ( ALERT_NORM, 1, "[1][ Die Datei konnte nicht | geladen werden! ][ [Abbruch ]" );
  356.         }
  357.       else
  358.         {
  359.           i = (UINT) SetWindowParm ( GetHandle ( win_id ), SET_W, -1L );
  360.           SetWinMaxSize ( win_id, i, -1 );
  361.           LinkTree ( win_id, rsc_tool, 'TOOL', LINK_TOP );
  362.           win_id++;
  363.         }
  364.     }
  365. }
  366.  
  367. /* ------------------------------------------------------------------- */
  368.  
  369. INT handle_main ( INT msg, INT button, DIALOG_INFO *inf )
  370.  
  371. {
  372.   switch ( msg )
  373.     {
  374.       case SG_START    : LinkSlider ( rsc_main, MA_UP, MA_DN, MA_SHOW, MA_HIDE, 20, MA_BOX, &slid_txt [0][0], (INT) sizeof ( slid_txt [0] ), 0 );
  375.                          break;
  376.       case SG_END      : switch ( button )
  377.                            {
  378.                              case -1       : if ( Alert ( ALERT_NORM, 1, ASK_TERM ) == 2 ) return ( SG_TERM );
  379.                                              break;
  380.                              case MA_POP1  : xPopUp ( rsc_main, MA_POP1, rsc_pop, 0, &pop );
  381.                                              RedrawObj ( rsc_main, MA_POP2, 0, NONE, UPD_STATE );
  382.                                              break;
  383.                              case MA_POP2  : Cycle ( rsc_main, MA_POP1, rsc_pop, SP_1, SP_16, &pop );
  384.                                              RedrawObj ( rsc_main, MA_POP2, 0, NONE, UPD_STATE );
  385.                                              break;
  386.                              case MA_LIST1 :
  387.                              case MA_LIST2 : Listbox ( " Weiß| Schwarz| Rot| Grün| Blau| Cyan| Gelb| Magenta| Hellgrau| Dunkelgrau| Hellrot| Hellgrün| Hellblau| Hellcyan| Hellgelb| Hellmagenta", 0, 0, rsc_main, MA_LIST1 );
  388.                                              break;
  389.                              case MA_SYS   : SysInfo ( 'SISI' ); break;
  390.                              case MA_LAUF  : SysInfo ( 'SILI' ); break;
  391.                              case MA_MEM   : SysInfo ( 'SIMI' ); break;
  392.                              case MA_VEK   : SysInfo ( 'SIVI' ); break;
  393.                              case MA_COOK  : SysInfo ( 'SICI' ); break;
  394.                              case MA_XBRA  : SysInfo ( 'SIXI' ); break;
  395.                              case MA_HD    : SysInfo ( 'SIHD' ); break;
  396.                              case MA_GRAF  : SysInfo ( 'SIGI' ); break;
  397.                              case MA_SGEM  : SysInfo ( 'SISG' ); break;
  398.                              case MA_WRT   : SysInfo ( 'SIAG' ); break;
  399.                              default       : break;
  400.                            }
  401.                          break;
  402.       case SG_MENU     : switch ( button )
  403.                            {
  404.                              case M2_INFO : DoDialog ( rsc_info, 0, " Information " );
  405.                                             break;
  406.                              case M2_QUIT : if ( Alert ( ALERT_NORM, 1, ASK_TERM ) == 2 ) return ( SG_TERM );
  407.                              default      : break;
  408.                            }
  409.                          break;
  410.       case SG_KEY      : switch ( button )
  411.                            {
  412.                              case 0x4800 : ScrollSlider ( rsc_main, MA_BOX, SCROLL_UP );
  413.                                            return ( SG_KEYUSED );
  414.                              case 0x5000 : ScrollSlider ( rsc_main, MA_BOX, SCROLL_DOWN );
  415.                                            return ( SG_KEYUSED );
  416.                              default     : break;
  417.                            }
  418.                          return ( SG_KEYCONT );
  419.       case SG_DRAGDROP : LoadText ( inf->dd->data );
  420.                          break;
  421.       case SG_QUIT     : break;
  422.     }
  423.   return ( SG_CONT );
  424. }
  425.  
  426. /* -------------------------------------------------------------------
  427.  * Behandelt die Desktop-Menüzeile
  428.  * ------------------------------------------------------------------- */
  429.  
  430. INT handle_menu ( INT msg, WINDOW_INFO *inf )
  431.  
  432. {
  433.   if ( msg == SG_MENU )
  434.     {
  435.       switch ( inf->mItem )
  436.         {
  437.           case ME_INFO : DoDialog ( rsc_info, 0, "| Information " );
  438.                          break;
  439.           case ME_QUIT : if ( Alert ( ALERT_NORM, 1, ASK_TERM ) == 2 ) return ( SG_TERM );
  440.                          break;
  441.           case ME_EDIT : WindowDialog ( 'EDIT', -1, -1, " Edit-Felder ", "", TRUE, FALSE, rsc_edit, NULL, SE_Z50_100, NULL, handle_edit );
  442.         }
  443.     }
  444.   return ( SG_CONT );
  445. }
  446.  
  447. /* ------------------------------------------------------------------- */
  448.  
  449. VOID first_info ( VOID )
  450.  
  451. {
  452.   if ( OpenLogWindow ( 'SGEM', " SysGem-Information ", "", 61, 15, 8, 20, (APROC) NULL ))
  453.     {
  454.       wprintf ( 'SGEM', "Willkommen bei \033pSysGem\033q V%x.%x\n\n", (INT)( SYSGEM_VERSION >> 8 ), (INT)((BYTE) SYSGEM_VERSION ));
  455.       wprintf ( 'SGEM', "Mit \033pSysGem\033q wird das Erstellen von GEM-Programmen zum Kinder-\n" );
  456.       wprintf ( 'SGEM', "spiel! (Text-)Fenster und Fensterdialoge werden komplett\n" );
  457.       wprintf ( 'SGEM', "von \033pSysGem\033q verwaltet, so daß \033+Sie\033- sich in Ruhe um\n" );
  458.       wprintf ( 'SGEM', "die wichtigeren Dinge kümmern können.\n" );
  459.       wprintf ( 'SGEM', "\033pSysGem\033q übernimmt z.B. auch die Verwaltung der \033+Iconifizierung\n" );
  460.       wprintf ( 'SGEM', "(ICFS/MTos)\033- und des \033+Drag & Drop (unter Gemini/MTos)\033-. Pro-\n" );
  461.       wprintf ( 'SGEM', "bieren Sie es doch einfach mal mit diesem Demo aus!\n\n" );
  462.       wprintf ( 'SGEM', "Schauen Sie sich doch danach einfach mal die Quelle an,\n" );
  463.       wprintf ( 'SGEM', "Sie werden überrascht sein, wie einfach und schnell es\n" );
  464.       wprintf ( 'SGEM', "gehen kann...\n\n" );
  465.       wprintf ( 'SGEM', "\033(Schließ mich...\033)" );
  466.     }
  467. }
  468.  
  469. /* ------------------------------------------------------------------- */
  470.  
  471. INT main ( VOID )
  472.  
  473. {
  474.   INT   i;
  475.  
  476.   if ( Init_GEM ( &par, ACC_NAME, PRG_ID, PRG_NAME, USR_ID, USR_NAME, USR_KEY ) > 0 )
  477.     {
  478.  
  479.       /* --------------------------------------------------------------
  480.        * Initialisiert die Resource
  481.        * -------------------------------------------------------------- */
  482.  
  483.       for ( i = 0; i < NUM_OBS; i++ ) rsrc_obfix ( &rs_object [i], 0 );
  484.  
  485.       /* --------------------------------------------------------------
  486.        * Überschrift für die Alertbox
  487.        * -------------------------------------------------------------- */
  488.  
  489.       SetAlertTitle ( "| SysGem-Demo " );
  490.  
  491.       /* --------------------------------------------------------------
  492.        * Dialoge anmelden
  493.        * -------------------------------------------------------------- */
  494.  
  495.       NewDialog ( rsc_main );
  496.       NewDialog ( rsc_info );
  497.       NewDialog ( rsc_bits );
  498.       NewDialog ( rsc_tool );
  499.       NewDialog ( rsc_edit );
  500.  
  501.       /* --------------------------------------------------------------
  502.        * Die Texte für die Sliderbox in Buffer schreiben
  503.        * -------------------------------------------------------------- */
  504.  
  505.       for ( i = 0; i < 20; i++ )
  506.         {
  507.           sprintf ( slid_txt [i], " Dieses ist die Textzeile Nr %2d ", i + 1 );
  508.         }
  509.  
  510.       /* --------------------------------------------------------------
  511.        * Nachrichten-Funktion anmelden
  512.        * -------------------------------------------------------------- */
  513.  
  514.       SetMessageProc ( GetMessage );
  515.  
  516.       /* --------------------------------------------------------------
  517.        * Menüzeile anmelden
  518.        * -------------------------------------------------------------- */
  519.  
  520.       SetDeskTopMenu ( rsc_menu, handle_menu );
  521.  
  522.       /* --------------------------------------------------------------
  523.        * Zeituhr starten
  524.        * -------------------------------------------------------------- */
  525.  
  526.       WindowDialog ( 'ZEIT', 8, 0, "| Zeit ", "", TRUE, FALSE, rsc_bits, NULL, 0, NULL, handle_bits );
  527.  
  528.       /* --------------------------------------------------------------
  529.        * Hauptfenster öffnen
  530.        * -------------------------------------------------------------- */
  531.  
  532.       WindowDialog ( 'MAIN', -1, -1, " SysGem-Demo ", "", TRUE, FALSE, rsc_main, NULL, 0, NULL, handle_main );
  533.  
  534.       /* --------------------------------------------------------------
  535.        * Text laden und anzeigen
  536.        * -------------------------------------------------------------- */
  537.  
  538.       LoadText ( "DEMO.H" );
  539.  
  540.       /* --------------------------------------------------------------
  541.        * Tastendrücke an die Dialoge leiten...
  542.        * -------------------------------------------------------------- */
  543.  
  544.       TellKeyStrokes ( TRUE );
  545.  
  546.       /* --------------------------------------------------------------
  547.        * Info vom Demo anzeigen
  548.        * -------------------------------------------------------------- */
  549.  
  550.       first_info ();
  551.  
  552.       /* --------------------------------------------------------------
  553.        * Kontrolle an SysGem abgeben
  554.        * -------------------------------------------------------------- */
  555.  
  556.       HandleSysGem ();
  557.  
  558.       /* --------------------------------------------------------------
  559.        * Programm abmelden und Speicher freigeben
  560.        * -------------------------------------------------------------- */
  561.  
  562.       Exit_GEM ();
  563.     }
  564.   return ( 0 );
  565. }
  566.  
  567. /* ------------------------------------------------------------------- */
  568.