home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / microcrn / issue_44.arc / MICROCAD.ARC / MICROCAD.CPP < prev    next >
Text File  |  1988-09-27  |  3KB  |  109 lines

  1. // Figure 1 from "A Little CAD with C++"
  2. // Copyright 1988 Bruce Eckel
  3. // Permission required to distribute source
  4.  
  5. // file: microcad.cpp
  6. /* The main driver program for the CAD system.
  7.    This includes all the other types I've defined,
  8.    declares some instances, and makes them dance
  9.    around. */
  10. #include        <stdio.h>
  11. #include    <stdlib.h>
  12. #include    <conio.h>
  13. #include    <msmouse.h>
  14. // flash graphics declarations:
  15. #include        <fg.h>      
  16. // (All items starting with "fg" are from
  17. // the flash graphics library)
  18. #include        <string.h>
  19. #include        "msmenu.hpp"   // Figure 2
  20. #include        "circle.hpp"   // Figure 5
  21. #include        "square.hpp"   // Figure 7
  22. #include        "line.hpp"     // Figure 9
  23. #include        "shapelst.hpp" // Figure 11
  24.  
  25. // associate unique integers with the following:
  26. enum { CIRCLE, SQUARE, LINE, MOVE, DELETE, EXIT};
  27.  
  28. struct menu_s my_menu[] = {
  29.   " circle",    CIRCLE,
  30.   " square",    SQUARE,
  31.   " line",      LINE,
  32.   " move",      MOVE,
  33.   " delete",    DELETE,
  34.   " exit",      EXIT,
  35.   "", -1             /* end marker */
  36. };
  37.  
  38.  
  39. main() { 
  40. unsigned x, y;
  41. int quit = 0;  // flag
  42. int result;
  43. shapelist list;
  44. if (fg_init_all () == FG_NULL) {
  45.   fputs ("Unable to open graphics device.\n", 
  46.           stderr);
  47.   exit (1);
  48.   }
  49.  
  50. // create an msmenu and attach our menu:
  51. msmenu mouse(my_menu);
  52.  
  53. while (!quit) {  
  54.     // look for right button press:
  55.     if (msm_getstatus(&x,&y) & 2) { 
  56.         // get a menu selection:
  57.         result = mouse.get_selection(x,y);
  58.         // change from mouse to fg coords:
  59.         mouse.translate_coords(&x,&y);
  60.         switch(result) {
  61.             case CIRCLE:
  62.                 // create an object on the free
  63.                 // store via "new" and add it
  64.                 // to the list:
  65.                 list.insert(new circle(x,y));
  66.                 break;
  67.             case SQUARE:
  68.                 list.insert(new square(x,y));
  69.                 break;
  70.             case LINE:
  71.                 list.insert(new line(x,y));
  72.                 break;
  73.             case MOVE:
  74.                 mouse.cross_cursor();
  75.                 mouse.wait_left_pressed(&x,&y);
  76.                 // you can declare a variable at 
  77.                 // the point of use:
  78.                 cadshape * mv = list.nearest(x,y);
  79.                 // (I think nearest() needs work).
  80.                 // object pointers use arrows 
  81.                 // for de-referencing members:
  82.                 mv->erase(); // pick it up
  83.                 mouse.wait_left_released(&x,&y);
  84.                 mouse.translate_coords(&x,&y);
  85.                 mv->move(x,y); // put it down
  86.                 mouse.default_cursor();
  87.                 break;
  88.             case DELETE:
  89.                 mouse.cross_cursor();
  90.                 mouse.wait_left_pressed(&x,&y);
  91.                 mouse.translate_coords(&x,&y);
  92.                 cadshape * rm = list.nearest(x,y);
  93.                 rm->erase();
  94.                 list.remove(rm);
  95.                 // free the memory created w/ new:
  96.                 delete rm;
  97.                 mouse.default_cursor();
  98.                 break;
  99.             case EXIT: 
  100.                 quit++;
  101.                 break;
  102.             default:
  103.                 break;
  104.         }
  105.     } 
  106. }
  107.     fg_term(); // back to text mode
  108. }
  109.