home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / info / prgramer / edmi / issue_1 / gpi / client.c next >
Encoding:
C/C++ Source or Header  |  1993-02-23  |  6.1 KB  |  283 lines

  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define INCL_GPI
  5. #define INCL_WIN
  6. #include "supergpi.h"
  7.  
  8. void SetupSegments(HPS hps) {
  9.     SHORT x,y,counter;
  10.     POINTL ptl,ptlTranslate,ptlCenter;
  11.     POINTL ptlStar[6];
  12.     PMATRIXLF translate,identity;
  13.     FIXED afxScale[2];
  14.     
  15.     counter=1;
  16.     GpiSetInitialSegmentAttrs(hps,
  17.                                   ATTR_VISIBLE |
  18.                                   ATTR_DETECTABLE |
  19.                                   ATTR_CHAINED,
  20.                                   ATTR_ON);
  21.     identity=(PMATRIXLF)malloc(sizeof(MATRIXLF));
  22.     ptlCenter.x=0;
  23.     ptlCenter.y=0;
  24.     afxScale[0]=MAKEFIXED(1,0);
  25.     afxScale[1]=MAKEFIXED(1,0);
  26.     GpiScale(hps,identity,TRANSFORM_REPLACE,afxScale,&ptlCenter);
  27.     GpiSetViewingTransformMatrix(hps,9L,identity,TRANSFORM_REPLACE);
  28.     ptlStar[0].x=18;
  29.     ptlStar[0].y=-24;
  30.     
  31.     ptlStar[1].x=-28;
  32.     ptlStar[1].y=9;
  33.     
  34.     ptlStar[2].x=28;
  35.     ptlStar[2].y=9;
  36.     
  37.     ptlStar[3].x=-18;
  38.     ptlStar[3].y=-24;
  39.     
  40.     ptlStar[4].x=0;
  41.     ptlStar[4].y=30;
  42.     for (x=0;x<3;x++) {
  43.         for (y=0;y<3;y++) {
  44.             GpiOpenSegment(hps,counter);
  45.             GpiSetTag(hps,counter);
  46.             GpiSetColor(hps,CLR_PALEGRAY);
  47.             ptlTranslate.x=x*150+50;
  48.             ptlTranslate.y=y*150+50;
  49.             translate=(PMATRIXLF)malloc(sizeof(MATRIXLF));
  50.             GpiTranslate(hps,
  51.                          translate,
  52.                          TRANSFORM_REPLACE,
  53.                          &ptlTranslate);
  54.             GpiSetSegmentTransformMatrix(hps,
  55.                                          counter,
  56.                                          9L,
  57.                                          translate,
  58.                                          TRANSFORM_REPLACE);
  59.             free(translate);
  60.             switch(counter) {
  61.             case 9:
  62.             case 1:
  63.                 ptl.x=0;
  64.                 ptl.y=30;
  65.                 GpiMove(hps,&ptl);
  66.                 GpiPolyLine(hps,5L,ptlStar);
  67.                 break;
  68.             case 5:
  69.                 ptl.x=-30;
  70.                 ptl.y=-30;
  71.                 GpiMove(hps,&ptl);
  72.                 ptl.x=30;
  73.                 ptl.y=30;
  74.                 GpiBox(hps,
  75.                            DRO_OUTLINE,
  76.                            &ptl,
  77.                            30L,
  78.                            30L);
  79.                 break;
  80.             case 7:
  81.                 ptl.x=-30;
  82.                 ptl.y=-15;
  83.                 GpiMove(hps,&ptl);
  84.                 ptl.x=30;
  85.                 ptl.y=15;
  86.                 GpiBox(hps,
  87.                            DRO_OUTLINE,
  88.                            &ptl,
  89.                            60L,
  90.                            30L);
  91.                 break;
  92.             default:
  93.                 ptl.x=-30;
  94.                 ptl.y=-30;
  95.                 GpiMove(hps,&ptl);
  96.                 ptl.x=30;
  97.                 ptl.y=30;
  98.                 GpiBox(hps,
  99.                            DRO_OUTLINE,
  100.                            &ptl,
  101.                            0,
  102.                            0);
  103.                 break;
  104.             }
  105.             GpiSetModelTransformMatrix(hps,
  106.                                          9L,
  107.                                          identity,
  108.                                          TRANSFORM_REPLACE);
  109.             GpiCloseSegment(hps);
  110.             counter++;    
  111.         }
  112.     }
  113.     free(identity);
  114. }
  115.  
  116.  
  117. MRESULT ClientWndProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) {
  118.     static SHORT btn1dn,btn2dn,width,height;
  119.     static HPS hps;
  120.     static HDC hdc;
  121.     static SHORT selected;
  122.     static POINTL ptl,mouse,center;
  123.     LONG segtags[4],lMaxHits,lMaxDepth;
  124.     SIZEL sizlPSPage,size;
  125.     PMATRIXLF translate,rotate;
  126.     MATRIXLF matrix;
  127.     FIXED fxAngle;
  128.     POINTL ptlTranslate;
  129.     
  130.     switch(msg) {
  131.     case WM_COMMAND:
  132.         switch(SHORT1FROMMP(mp1)) {
  133.         case IDM_COMPLETE_REFRESH:
  134.             WinPostMsg(hwnd,WM_REFRESH_ALL,NULL,NULL);
  135.             break;
  136.         }
  137.         return(0);
  138.     case WM_BUTTON1DOWN:
  139.         btn1dn=TRUE;
  140.         ptl.x=(LONG)SHORT1FROMMP(mp1);
  141.         ptl.y=(LONG)SHORT2FROMMP(mp1);
  142.         mouse.x=ptl.x;
  143.         mouse.y=ptl.y;
  144.         GpiSetPickAperturePosition(hps,&ptl);
  145.         if (GpiCorrelateChain(hps,
  146.                                  PICKSEL_ALL,
  147.                                  &ptl,
  148.                                  1L,
  149.                                  1L,
  150.                                  segtags)) {
  151.             selected=segtags[0];
  152.             GpiQuerySegmentTransformMatrix(hps,selected,9L,&matrix);
  153.         } else {
  154.             selected=0;
  155.         }
  156.         return(WinDefWindowProc(hwnd,msg,mp1,mp2));
  157.     case WM_BUTTON1UP:
  158.         btn1dn=FALSE;
  159.         return(WinDefWindowProc(hwnd,msg,mp1,mp2));
  160.     case WM_BUTTON2DOWN:
  161.         btn2dn=TRUE;
  162.         ptl.x=(LONG)SHORT1FROMMP(mp1);
  163.         ptl.y=(LONG)SHORT2FROMMP(mp1);
  164.         mouse.x=ptl.x;
  165.         mouse.y=ptl.y;
  166.         GpiSetPickAperturePosition(hps,&ptl);
  167.         if (GpiCorrelateChain(hps,
  168.                                  PICKSEL_ALL,
  169.                                  &ptl,
  170.                                  1L,
  171.                                  1L,
  172.                                  segtags)) {
  173.             selected=segtags[0];
  174.         } else {
  175.             selected=0;
  176.         }
  177.         return(WinDefWindowProc(hwnd,msg,mp1,mp2));
  178.     case WM_BUTTON2UP:
  179.         btn2dn=FALSE;
  180.         return(WinDefWindowProc(hwnd,msg,mp1,mp2));
  181.     case WM_MOUSEMOVE:
  182.         if (btn2dn && selected) {
  183.             GpiSetMix(hps,FM_XOR);
  184.             GpiDrawSegment(hps,selected);
  185.             translate=(PMATRIXLF)malloc(sizeof(MATRIXLF));
  186.             ptlTranslate.x=-mouse.x+SHORT1FROMMP(mp1);
  187.             ptlTranslate.y=-mouse.y+SHORT2FROMMP(mp1);
  188.             GpiTranslate(hps,
  189.                          translate,
  190.                          TRANSFORM_REPLACE,
  191.                          &ptlTranslate);
  192.             GpiSetSegmentTransformMatrix(hps,
  193.                                          selected,
  194.                                          9L,translate,TRANSFORM_ADD);
  195.             free(translate);
  196.             mouse.x=SHORT1FROMMP(mp1);
  197.             mouse.y=SHORT2FROMMP(mp1);
  198.             GpiDrawSegment(hps,selected);
  199.             return(WinDefWindowProc(hwnd,msg,mp1,mp2));
  200.         }
  201.         return(WinDefWindowProc(hwnd,msg,mp1,mp2));
  202.     case WM_CHAR:
  203.         if (SHORT1FROMMP(mp1) & KC_KEYUP) return(0);
  204.     else
  205.         if (SHORT1FROMMP(mp1) & KC_CHAR) {
  206.             fxAngle=MAKEFIXED(3,0);
  207.             switch(SHORT1FROMMP(mp2)) {
  208.             case '=':
  209.             case '+':
  210.                 break;
  211.             case '-':
  212.             case '_':
  213.                 fxAngle=-fxAngle;
  214.                 break;
  215.             default:
  216.                 return(0);
  217.             }
  218.             GpiSetMix(hps,FM_XOR);
  219.             GpiDrawSegment(hps,selected);
  220.             rotate=(PMATRIXLF)malloc(sizeof(MATRIXLF));
  221.             center.x=0;
  222.             center.y=0;
  223.             GpiRotate(hps,
  224.                       rotate,
  225.                       TRANSFORM_REPLACE,
  226.                       fxAngle,
  227.                       ¢er);
  228.             GpiSetSegmentTransformMatrix(hps,
  229.                                          selected,
  230.                                          9L,
  231.                                          rotate,
  232.                                          TRANSFORM_PREEMPT);
  233.             free(rotate);
  234.             GpiDrawSegment(hps,selected);
  235.         }
  236.         return(0);
  237.     case WM_CREATE:
  238.         selected=0;
  239.         btn1dn=btn2dn=0;
  240.         sizlPSPage.cx=0L;
  241.         sizlPSPage.cy=0L;
  242.         hdc=WinOpenWindowDC(hwnd); 
  243.         hps=GpiCreatePS(hab,
  244.                         hdc,
  245.                         &sizlPSPage,
  246.                         PU_PELS | 
  247.                         GPIF_DEFAULT |
  248.                         GPIT_NORMAL |
  249.                         GPIA_ASSOC);
  250.         GpiSetDrawingMode(hps,DM_RETAIN);
  251.         size.cx=10L;
  252.         size.cy=10L;
  253.         GpiSetPickApertureSize(hps,PICKAP_REC,&size);
  254.         GpiSetMix(hps,FM_XOR);
  255.         SetupSegments(hps);
  256.         return(0);
  257.     case WM_CLOSE:
  258.         GpiAssociate(hps,NULLHANDLE);
  259.         GpiDestroyPS(hps);
  260.         break;
  261.     case WM_SIZE:
  262.         width=SHORT1FROMMP(mp2);
  263.         height=SHORT2FROMMP(mp2);
  264.         return(0);
  265.     case WM_REFRESH_ALL:
  266.         GpiErase(hps);
  267.         GpiDrawChain(hps);
  268.         return(0);
  269.     case WM_PAINT:
  270.         WinBeginPaint(hwnd,hps,NULL);
  271.         GpiErase(hps);
  272.         GpiSetMix(hps,FM_XOR);
  273.         GpiDrawChain(hps); 
  274.         WinEndPaint(hps);
  275.         return(0);
  276.     }
  277.     return(WinDefWindowProc(hwnd,msg,mp1,mp2));
  278. }
  279.  
  280.  
  281.  
  282.  
  283.