Example showing drawing using GINO in a GINOMENU application

/*      Program function                        */
/************************************************/
/* Copyright Bradly Associates Limited          */
/*        GINOMENU Version 6.0                  */
/************************************************/
#include <gino-c.h>
#include <menu-c.h>
#include <math.h>

GDIM paper;
GLIMIT viewport = {0.0,120.0,0.0,120.0};
GLIMIT limits = {0.0,1.0,0.0,1.0};

char devname[32],filename[32];
int funt1,funt2,funt3,funt4,funt5,funt6,funt7,funt8;
int iprop[4];

void redraw(void);
void drawfn(int);

#if defined(MWIN) || defined(GUIWIN)
int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
			 LPSTR lpszCmdParam, int nCmdShow)
#else
int main ()
#endif
{
   int master_window,menu_bar,file_entry,file_menu,print_entry,separator,exit_entry;
   int help_entry,help_menu,about_entry,graphics_frame;
   int function_panel,about_window,about_panel,text_entry,done_button;
   int callback,status,ipapty;

/*  initialize GINO */

      gOpenGino();
      gGuiwin();

/*  initialize GINOMENU */

      gmInitializeMenu();

/*  define master window */

      master_window=gmCreateMasterWindow(1,9,16,11,GMINIMIZE|GQUIT,"Function Viewer", 
                                 gmIconFormat,GDLLICON,gmIconFile,"mbig1083",0);

/*  define menubar */

      menu_bar=gmCreateMenuBar(master_window);
        file_entry=gmCreateMenuEntry(menu_bar,"File",gmAccel,'F',0);
          file_menu=gmCreatePullDownMenu(file_entry);
            print_entry=gmCreateMenuEntry(file_menu,"Print...",gmAccel,'P',gmCallback,300,0);
            separator=gmCreateMenuSeparator(file_menu);
            exit_entry=gmCreateMenuEntry(file_menu,"Exit",gmAccel,'x',gmCallback,-1,0);
        help_entry=gmCreateMenuEntry(menu_bar,"Help",gmAccel,'H',0);
          help_menu=gmCreatePullDownMenu(help_entry);
            about_entry=gmCreateMenuEntry(help_menu,"About",gmAccel,'A',gmCallback,900,0);

/*  define graphics frame */

      graphics_frame=gmCreateGraphicsFrame(master_window,7,1,8,10,&viewport,gmExpose,700,0);

/*  define function gmCreateToggleButtons */

      function_panel=gmCreatePanel(master_window,0,1,7,10,gmTitle,"Function",gmType,GCHISEL,0);
      funt1=gmCreateToggleButton(function_panel,1,8,5,1,"sin(x)",GOFF,gmCallback,701,0);
      funt2=gmCreateToggleButton(function_panel,1,7,5,1,"cos(x)",GOFF,gmCallback,702,0);
      funt3=gmCreateToggleButton(function_panel,1,6,5,1,"sin(x)*sin(x)",GOFF,gmCallback,703,0);
      funt4=gmCreateToggleButton(function_panel,1,5,5,1,"cos(x)*cos(x)",GOFF,gmCallback,704,0);
      funt5=gmCreateToggleButton(function_panel,1,4,5,1,"sin(x)+cos(x)",GOFF,gmCallback,705,0);
      funt6=gmCreateToggleButton(function_panel,1,3,5,1,"sin(x)*cos(x)",GOFF,gmCallback,706,0);
      funt7=gmCreateToggleButton(function_panel,1,2,5,1,"sin(x*4)",GOFF,gmCallback,707,0);
      funt8=gmCreateToggleButton(function_panel,1,1,5,1,"cos(x*4)",GOFF,gmCallback,708,0);

/*  define about box */

      about_window=gmCreateComplexDialogueBox(master_window,10,8,10,6,GOFF," ",gmInitState,GCENTRED,0);
      about_panel=gmCreatePanel(about_window,0,0,10,6,gmBorderType,GPRESSED,0);
        text_entry=gmCreateTextEntry(about_panel,1,4,8,1,"Function Viewer",16,GDISPLAY,gmJustify,GCENTRE,0);
        text_entry=gmCreateTextEntry(about_panel,1,3,8,1,"Bradly Associates Ltd.",22,GDISPLAY,gmJustify,GCENTRE,0);
        done_button=gmCreatePushButton(about_panel,4,1,2,1,"Done",gmAccel,'D',gmCallback,901,0);

/*  initialize application */

      gmManage();

/* Start the action loop */

   while (gmAction(&callback) != -1) {

/*  deal with printing */

      if(callback == 300){
        gSuspendDevice();
/*  Set up properties for colour portrait plot */
        iprop[0]=7;
        iprop[1]=2;
        iprop[2]=9;
        iprop[3]=2;
        status=gMwinpp(hInstance,hPrevInstance,2,devname,31,filename,31,4,iprop);
        if(status == 0) {
/*  enquire printer limits and set up viewport */
          gEnqDrawingLimits(&paper,&ipapty);
          limits.xmax=paper.xpap;
          limits.ymax=paper.ypap;
          gSetViewport2D(&viewport,&limits);
          redraw();
        }
        gCloseDevice();
        gGuiwin();
/*  restore default viewport on graphics frame */
        gmActivateGraphicsFrame(graphics_frame);
        gSetViewport2D(&viewport,&viewport);
      }

/*  deal with function toggles */

      if(callback >= 700 && callback < 709) {
        gmClearGraphicsFrame(graphics_frame);
        gmActivateGraphicsFrame(graphics_frame);
        redraw();
      }

/*   deal with about box */

      if(callback == 900){
        gmDrawWindow(about_window);
        gmSetActiveWindow(about_window);
      }
      if(callback == 901){
        gmRemoveWindow(about_window);
        gmSetActiveWindow(0);
      }

   }

/*  close application */

   gmCloseMenu();
   gCloseDevice();
   gCloseGino();
}

void redraw(void)
{
/*  redraw the complete contents of the graphics frame */

     gSetLineColour(GBLACK);
     gMoveTo2D(10.0,60.0);
     gDrawLineTo2D(110.0,60.0);
     gMoveTo2D(60.0,10.0);
     gDrawLineTo2D(60.0,110.0);
     gFlushGraphics();
     if(gmEnqToggleSwitch(funt1) == 1)drawfn(1);
     if(gmEnqToggleSwitch(funt2) == 1)drawfn(2);
     if(gmEnqToggleSwitch(funt3) == 1)drawfn(3);
     if(gmEnqToggleSwitch(funt4) == 1)drawfn(4);
     if(gmEnqToggleSwitch(funt5) == 1)drawfn(5);
     if(gmEnqToggleSwitch(funt6) == 1)drawfn(6);
     if(gmEnqToggleSwitch(funt7) == 1)drawfn(7);
     if(gmEnqToggleSwitch(funt8) == 1)drawfn(8);
}

void drawfn(int function)
{
/*  function drawing routine */

GPOINT pt[101];
float pi = 3.14159;
int i;

   switch (function) {

      case 1:
        for (i=0; i<101; i++) {
          pt[i].x=(float)i+9.0;
          pt[i].y=sin((float)(i-51)*(pi/50.0))*30.0+60.0;
        }
        gSetLineColour(GRED);
        gMoveTo2D(pt[0].x,pt[0].y);
        gDrawPolylineTo2D(101,pt);
        break;

      case 2:
        for (i=0; i<101; i++) {
          pt[i].x=(float)i+10.0;
          pt[i].y=cos((float)(i-51)*(pi/50.0))*30.0+60.0;
        }
        gSetLineColour(GORANGE);
        gMoveTo2D(pt[0].x,pt[0].y);
        gDrawPolylineTo2D(101,pt);
        break;

      case 3:
        for (i=0; i<101; i++) {
          pt[i].x=(float)i+10.0;
          pt[i].y=sin((float)(i-51)*(pi/50.0));
          pt[i].y=pt[i].y*pt[i].y*30.0+60.0;
        }
        gSetLineColour(GYELLOW);
        gMoveTo2D(pt[0].x,pt[0].y);
        gDrawPolylineTo2D(101,pt);
        break;

      case 4:
        for (i=0; i<101; i++) {
          pt[i].x=(float)i+10.0;
          pt[i].y=cos((float)(i-51)*(pi/50.0));
          pt[i].y=pt[i].y*pt[i].y*30.0+60.0;
        }
        gSetLineColour(GGREEN);
        gMoveTo2D(pt[0].x,pt[0].y);
        gDrawPolylineTo2D(101,pt);
        break;

      case 5:
        for (i=0; i<101; i++) {
          pt[i].x=(float)i+10.0;
          pt[i].y=sin((float)(i-51)*(pi/50.0))+cos((float)(i-51)*(pi/50.0));
          pt[i].y=pt[i].y*30.0+60.0;
        }
        gSetLineColour(GCYAN);
        gMoveTo2D(pt[0].x,pt[0].y);
        gDrawPolylineTo2D(101,pt);
        break;

      case 6:
        for (i=0; i<101; i++) {
          pt[i].x=(float)i+10.0;
          pt[i].y=sin((float)(i-51)*(pi/50.0))*cos((float)(i-51)*(pi/50.0));
          pt[i].y=pt[i].y*30.0+60.0;
        }
        gSetLineColour(GBLUE);
        gMoveTo2D(pt[0].x,pt[0].y);
        gDrawPolylineTo2D(101,pt);
        break;

      case 7:
        for (i=0; i<101; i++) {
          pt[i].x=(float)i+10.0;
          pt[i].y=sin((float)(i-51)*(pi/12.5));
          pt[i].y=pt[i].y*30.0+60.0;
        }
        gSetLineColour(GMAGENTA);
        gMoveTo2D(pt[0].x,pt[0].y);
        gDrawPolylineTo2D(101,pt);
        break;

      case 8:
        for (i=0; i<101; i++) {
          pt[i].x=(float)i+10.0;
          pt[i].y=cos((float)(i-51)*(pi/12.5));
          pt[i].y=pt[i].y*30.0+60.0;
        }
        gSetLineColour(GBROWN);
        gMoveTo2D(pt[0].x,pt[0].y);
        gDrawPolylineTo2D(101,pt);
        break;

   }
   gFlushGraphics();
}