home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / prog / c / intuicpp.lzh / ipp / examples / littlepainter.cc < prev    next >
C/C++ Source or Header  |  1993-04-05  |  6KB  |  247 lines

  1. ///////////////////////////////////////////////////////////////////////////////
  2. ///////////////////////////////////////////////////////////////////////////////
  3. //
  4. //    Little test program implementing a simple painter to illustrate
  5. //    how objects are easy to use, and easy to handle.
  6. //
  7. //    For all comment email 'brulhart@cuilima.unige.ch'
  8. //
  9. ///////////////////////////////////////////////////////////////////////////////
  10. ///////////////////////////////////////////////////////////////////////////////
  11.  
  12.  
  13. #include <stream.h>
  14. #include <stdlib.h>
  15.  
  16.  
  17. ///////////////////////////////////////////////////////////////////////////////
  18. // Intuition objects created with PowerWindows defined in 'drawctrl.c'
  19.  
  20. extern struct NewScreen NewScreenStructure;
  21. extern struct TagItem ScreenTags[]; 
  22. extern struct NewWindow CTRLNewWindowStructure1;
  23. extern struct NewWindow BITNewWindowStructure2;
  24. extern struct Gadget CTRLpoint;
  25. extern struct Gadget CTRLfree;
  26. extern struct Gadget CTRLline;
  27. extern struct Gadget CTRLrect;
  28. extern struct Gadget CTRLcircle;
  29. extern struct Image CTRLImage1;
  30. extern struct Image CTRLImage2;
  31. extern struct Image CTRLImage3;
  32. extern struct Image CTRLImage4;
  33. extern struct Image CTRLImage5;
  34. extern struct Image CTRLImage6;
  35. extern struct Image CTRLImage7;
  36. extern struct Image CTRLImage8;
  37. extern struct Image CTRLImage9;
  38. extern struct Image CTRLImage10;
  39. extern struct Menu Menu1;
  40. extern struct Menu Menu2;
  41. extern struct MenuItem MenuItem1;
  42. extern struct MenuItem MenuItem2;
  43. extern struct MenuItem MenuItem3;
  44.  
  45. ///////////////////////////////////////////////////////////////////////////////
  46. // Global objects used by the painter 
  47.  
  48. #define POINTS        1
  49. #define FREEHANDS    2
  50. #define LINES         3
  51. #define RECTANGLES     4
  52. #define ELLIPSES     5
  53.  
  54. #define DO(from,until,do,undo,result) from while (! (until)) { do undo } result
  55.  
  56. #include <ipp/mgwindow.h>
  57. #include <ipp/wgscreen.h>
  58.  
  59. MsgWindow ctrlw(&CTRLNewWindowStructure1);
  60. MGWindow bw(&BITNewWindowStructure2);
  61. WGScreen scr(&NewScreenStructure, ScreenTags);
  62. int drawingmode=POINTS;
  63.  
  64.  
  65. ///////////////////////////////////////////////////////////////////////////////
  66. // Functions used by the painter
  67.  
  68. void help(IMessage& message)
  69. {
  70.     scr.setapen(2);
  71.     scr.setfont((STRPTR)"Dom32.font",32,0,0);
  72.     for (int i=0; i<30; i+=5)
  73.         scr.drawrect(200-i,400-i,500+i,480+i);
  74.     scr.writetext(250,450,"Do you really need help ?");
  75.     scr.setfont((STRPTR)"FuturaB.font",12,0,0);
  76.     ctrlw.offgadget(&CTRLpoint);
  77. }
  78. void quit(IMessage& message)    { bw.close(); ctrlw.close(); scr.close(); exit(0); }
  79. void clear(IMessage& message)    { bw.clear(); ctrlw.ongadget(&CTRLpoint);}
  80. void point(IMessage& message)    { drawingmode=POINTS; }
  81. void free(IMessage& message)    { drawingmode=FREEHANDS; }
  82. void line(IMessage& message)    { drawingmode=LINES; }
  83. void rect(IMessage& message)    { drawingmode=RECTANGLES; }
  84. void circle(IMessage& message)    { drawingmode=ELLIPSES; }
  85.  
  86. void makepoint(IMessage& message)
  87. {
  88. IMessage mess;
  89. DO(
  90.     bw.setapen(1);
  91.     bw.setdrmd(JAM1);
  92.     bw.writepixel(message.imousex,message.imousey);
  93. ,
  94.     bw.getImsg(mess)->icode==SELECTUP
  95. ,
  96.     bw.writepixel(bw.mousex(),bw.mousey()); ,, );
  97. }
  98.  
  99.  
  100. void makefreehand(IMessage& message)
  101. {
  102. IMessage mess;
  103. DO(
  104.     bw.setapen(1);
  105.     bw.setdrmd(JAM1);
  106.     bw.setpenpos(message.imousex,message.imousey);
  107. ,
  108.     bw.getImsg(mess)->icode==SELECTUP
  109. ,
  110.     bw.drawlineto(bw.mousex(),bw.mousey()); ,, );
  111. }
  112.  
  113.  
  114. void makeline(IMessage& message)
  115. {
  116. IMessage mess;
  117. int x,y;
  118. DO(
  119.     bw.setapen(1);
  120.     bw.setdrmd(COMPLEMENT);
  121. ,
  122.     bw.getImsg(mess)->icode==SELECTUP
  123. ,
  124.     x=bw.mousex();
  125.     y=bw.mousey();
  126.     bw.drawline(message.imousex,message.imousey,x,y);
  127. ,
  128.     bw.drawline(message.imousex,message.imousey,x,y);
  129. ,
  130.     bw.setdrmd(JAM1);
  131.     bw.drawline(message.imousex,message.imousey,x,y); );
  132. }
  133.  
  134.  
  135. void makeellipse(IMessage& message)
  136. {
  137. IMessage mess;
  138. int x,y;
  139. DO(
  140.     bw.setapen(1);
  141.     bw.setdrmd(COMPLEMENT);
  142. ,
  143.     bw.getImsg(mess)->icode==SELECTUP
  144. ,
  145.     x=abs(message.imousex-bw.mousex());
  146.     y=abs(message.imousey-bw.mousey());
  147.     bw.drawellipse(message.imousex,message.imousey,x,y);
  148. ,
  149.     bw.drawellipse(message.imousex,message.imousey,x,y);
  150. ,
  151.     bw.setdrmd(JAM1);
  152.     bw.drawellipse(message.imousex,message.imousey,x,y);    );
  153. }
  154.  
  155.  
  156. void makerectangle(IMessage& message)
  157. {
  158. IMessage mess;
  159. int x,y;
  160. DO(
  161.     bw.setapen(1);
  162.     bw.setdrmd(COMPLEMENT);
  163. ,
  164.     bw.getImsg(mess)->icode==SELECTUP
  165. ,
  166.     x=(message.imousex-bw.mousex());
  167.     y=(message.imousey-bw.mousey());
  168.     bw.drawrect(message.imousex,message.imousey,message.imousex-x,message.imousey-y);
  169. ,
  170.     bw.drawrect(message.imousex,message.imousey,message.imousex-x,message.imousey-y);
  171. ,
  172.     bw.setdrmd(JAM1);
  173.     bw.drawrect(message.imousex,message.imousey,message.imousex-x,message.imousey-y); );
  174. }
  175.  
  176.  
  177. void mouseselectup(IMessage& message)
  178. {
  179.     switch(drawingmode)
  180.     {
  181.         case POINTS:
  182.             makepoint(message);
  183.             break;
  184.         case FREEHANDS:
  185.             makefreehand(message);
  186.             break;
  187.         case LINES:
  188.             makeline(message);
  189.             break;
  190.         case RECTANGLES:
  191.             makerectangle(message);
  192.             break;
  193.         case ELLIPSES:
  194.             makeellipse(message);
  195.             break;
  196.     }
  197. }
  198.  
  199.  
  200. ///////////////////////////////////////////////////////////////////////////////
  201. // The application. Note that no initialization at all is needed to be made.
  202.  
  203.  
  204. main()
  205. {
  206. // Set fonts to windows and screen
  207.     scr.setfont((STRPTR)"FuturaB.font",12,0,0);
  208.     bw.setfont((STRPTR)"Dom32.font",32,0,0);
  209.  
  210. // Link events for drawing window
  211.     bw.linkIevent(MOUSEBUTTONS,SELECTDOWN,0,NULL,mouseselectup);
  212.     bw.linkIevent(CLOSEWINDOW,0,0,NULL,quit);
  213.     bw.linkmenu(&Menu1);
  214.     bw.linkIevent(MENUPICK,0,0,(void *)&MenuItem1,clear);
  215.     bw.linkIevent(MENUPICK,0,0,(void *)&MenuItem2,help);
  216.     bw.linkIevent(MENUPICK,0,0,(void *)&MenuItem3,quit);
  217.  
  218. // Link events for control window
  219.     ctrlw.linkgadgets(&CTRLpoint);
  220.     ctrlw.linkmenu(&Menu1);
  221.     ctrlw.linkIevent(MENUPICK,0,0,(void *)&MenuItem1,clear);
  222.     ctrlw.linkIevent(MENUPICK,0,0,(void *)&MenuItem2,help);
  223.     ctrlw.linkIevent(MENUPICK,0,0,(void *)&MenuItem3,quit);
  224.     ctrlw.linkIevent(GADGETUP,0,0,(void *)&CTRLpoint,point);
  225.     ctrlw.linkIevent(GADGETUP,0,0,(void *)&CTRLfree,free);
  226.     ctrlw.linkIevent(GADGETUP,0,0,(void *)&CTRLline,line);
  227.     ctrlw.linkIevent(GADGETUP,0,0,(void *)&CTRLrect,rect);
  228.     ctrlw.linkIevent(GADGETUP,0,0,(void *)&CTRLcircle,circle);
  229.     ctrlw.linkIevent(CLOSEWINDOW,0,0,NULL,quit);
  230.  
  231. // Link windows to the screen
  232.     scr.linkwindow(ctrlw);
  233.     scr.linkwindow(bw);
  234.  
  235. // Open all and give control to the waitgraphicscreen
  236.     scr.open();
  237.     bw.open();
  238.     ctrlw.open();
  239.     bw.writetext(50,50,"Welcome");
  240.  
  241.     scr.hardcontrol();
  242.  
  243. // Just for fun
  244.     ctrlw.close();
  245.     bw.close();
  246. }
  247.