Annotation of mstools/samples/gdidemo/poly.c, revision 1.1

1.1     ! root        1: /*---------------------------------------------------------------------------*\
        !             2: | POLYBEZIER MODULE
        !             3: |   This module contains the routines for demo
        !             4: |
        !             5: | segment: _TEXT (DOS16)
        !             6: | created: 19-Oct-90
        !             7: | history: 19-Oct-90 <paulb>    created original polybezier effect.
        !             8: |          20-May-91 <chriswil> adapted for use in MDI application.
        !             9: |
        !            10: \*---------------------------------------------------------------------------*/
        !            11: 
        !            12: #include <windows.h>
        !            13: #include "gdidemo.h"
        !            14: #include  "poly.h"
        !            15: 
        !            16: /*---------------------------------------------------------------------------*\
        !            17: | CREATE BEZIER WINDOW PROCEDURE
        !            18: |   Create the bezier MDI-child window.
        !            19: |
        !            20: | created: 20-May-91
        !            21: | history: 20-May-91 <chriswil> created.
        !            22: |
        !            23: \*---------------------------------------------------------------------------*/
        !            24: HWND FAR CreatePolyWindow(HWND hWndClient, int nItem)
        !            25: {
        !            26:     HANDLE          hInstance;
        !            27:     MDICREATESTRUCT mcs;
        !            28: 
        !            29: 
        !            30:     hInstance = GETINSTANCE(hWndClient);
        !            31: 
        !            32:     /*
        !            33:     ** Initialize the MDI create struct for creation of the
        !            34:     ** test window.
        !            35:     */
        !            36:     mcs.szClass = POLYCLASS;
        !            37:     mcs.szTitle = POLYTITLE;
        !            38:     mcs.hOwner = hInstance;
        !            39:     mcs.x       = CW_USEDEFAULT;
        !            40:     mcs.y       = CW_USEDEFAULT;
        !            41:     mcs.cx      = CW_USEDEFAULT;
        !            42:     mcs.cy      = CW_USEDEFAULT;
        !            43:     mcs.style  = 0l;
        !            44:     mcs.lParam  = (LONG)nItem;
        !            45: 
        !            46:     return((HWND)SendMessage(hWndClient,WM_MDICREATE,NULL,(LONG)(LPMDICREATESTRUCT)&mcs));
        !            47: }
        !            48: 
        !            49: 
        !            50: /*---------------------------------------------------------------------------*\
        !            51: | POLYBEZIER WINDOW PROCEDURE
        !            52: |   This is the main window function for the polybezier demo window.
        !            53: |
        !            54: | created: 20-May-91
        !            55: | history: 20-May-91 <chriswil> created.
        !            56: |
        !            57: \*---------------------------------------------------------------------------*/
        !            58: LONG APIENTRY PolyProc(HWND hWnd, UINT wMsg, WPARAM wParam, LONG lParam)
        !            59: {
        !            60:     switch(wMsg)
        !            61:     {
        !            62:         case WM_CREATE:
        !            63:             PolyCreateProc(hWnd);
        !            64:             break;
        !            65: 
        !            66: 
        !            67:         case WM_COMMAND:
        !            68:             PolyCommandProc(hWnd,wParam,lParam);
        !            69:             break;
        !            70: 
        !            71:         case WM_MOVE:
        !            72:             PolyRedraw(hWnd);
        !            73:             break;
        !            74: 
        !            75: 
        !            76:         case WM_TIMER:
        !            77:             PolyDrawBez(hWnd);
        !            78:             break;
        !            79: 
        !            80: 
        !            81:         case WM_PAINT:
        !            82:             PolyPaintProc(hWnd);
        !            83:             break;
        !            84: 
        !            85: 
        !            86:         case WM_DESTROY:
        !            87:             PolyDestroyProc(hWnd);
        !            88:             break;
        !            89: 
        !            90: 
        !            91:         default:
        !            92:             return(DefMDIChildProc(hWnd,wMsg,wParam,lParam));
        !            93:     }
        !            94:     return(0l);
        !            95: }
        !            96: 
        !            97: 
        !            98: /*---------------------------------------------------------------------------*\
        !            99: | POLYBEZIER CREATE PROCEDURE
        !           100: |   Create the polybezier window for the demo application.  This is a child
        !           101: |   of the MDI client window.  Allocate the extra object information for
        !           102: |   handling of the polybezier demo.
        !           103: |
        !           104: | created: 20-May-91
        !           105: | history: 20-May-91 <chriswil> created.
        !           106: |
        !           107: \*---------------------------------------------------------------------------*/
        !           108: BOOL PolyCreateProc(HWND hWnd)
        !           109: {
        !           110:     PPOLYDATA ppd;
        !           111: 
        !           112: 
        !           113:     if(AllocWindowInfo(hWnd,sizeof(POLYDATA)))
        !           114:     {
        !           115:         if(ppd = (PPOLYDATA)LockWindowInfo(hWnd))
        !           116:         {
        !           117:             ppd->nBezTotal  = 20;
        !           118:             ppd->nBezCurr   = 0;
        !           119:             ppd->nColor     = 0;
        !           120:             ppd->hBezBuffer = GlobalAlloc(GHND,(DWORD)(sizeof(BEZBUFFER) * MAX_BEZIER));
        !           121: 
        !           122:             UnlockWindowInfo(hWnd);
        !           123: 
        !           124:             PolyInitPoints(hWnd);
        !           125: 
        !           126:             SetTimer(hWnd,1,50,NULL);
        !           127:             return(TRUE);
        !           128:         }
        !           129:         FreeWindowInfo(hWnd);
        !           130:     }
        !           131:     return(FALSE);
        !           132: }
        !           133: 
        !           134: 
        !           135: /*---------------------------------------------------------------------------*\
        !           136: | POLYBEZIER COMMAND PROCEDURE
        !           137: |   Process polybezier commands.  This is a NOP for now.  But who knows what
        !           138: |   tomorrow may bring.
        !           139: |
        !           140: | created: 20-May-91
        !           141: | history: 20-May-91 <chriswil> created.
        !           142: |
        !           143: \*---------------------------------------------------------------------------*/
        !           144: BOOL PolyCommandProc(HWND hWnd, WPARAM wParam, LONG lParam)
        !           145: {
        !           146:     hWnd   = hWnd;
        !           147:     wParam = wParam;
        !           148:     lParam = lParam;
        !           149: 
        !           150:     return(TRUE);
        !           151: }
        !           152: 
        !           153: 
        !           154: /*---------------------------------------------------------------------------*\
        !           155: | POLYBEZIER PAINT PROCEDURE
        !           156: |   Repaint the bezier window.  All we really do here is validate our window,
        !           157: |   and reset the array of bezier objects.
        !           158: |
        !           159: | created: 20-May-91
        !           160: | history: 20-May-91 <chriswil> created.
        !           161: |
        !           162: \*---------------------------------------------------------------------------*/
        !           163: VOID PolyPaintProc(HWND hWnd)
        !           164: {
        !           165:     HDC         hDC;
        !           166:     PAINTSTRUCT ps;
        !           167: 
        !           168: 
        !           169:     if(hDC = BeginPaint(hWnd,&ps))
        !           170:         EndPaint(hWnd,&ps);
        !           171: 
        !           172:     PolyRedraw(hWnd);
        !           173: 
        !           174:     return;
        !           175: }
        !           176: 
        !           177: 
        !           178: /*---------------------------------------------------------------------------*\
        !           179: | POLYBEZIER DESTROY PROCEDURE
        !           180: |   Kill the polybezier demo.  Free up the resources allocated on behalf of
        !           181: |   this object.
        !           182: |
        !           183: | created: 20-May-91
        !           184: | history: 20-May-91 <chriswil> created.
        !           185: |
        !           186: \*---------------------------------------------------------------------------*/
        !           187: VOID PolyDestroyProc(HWND hWnd)
        !           188: {
        !           189:     PPOLYDATA ppd;
        !           190: 
        !           191: 
        !           192:     KillTimer(hWnd,1);
        !           193:     if(ppd = (PPOLYDATA)LockWindowInfo(hWnd))
        !           194:     {
        !           195:         GlobalFree(ppd->hBezBuffer);
        !           196:         UnlockWindowInfo(hWnd);
        !           197:     }
        !           198:     FreeWindowInfo(hWnd);
        !           199: 
        !           200:     return;
        !           201: }
        !           202: 
        !           203: 
        !           204: /*---------------------------------------------------------------------------*\
        !           205: | GET NEW VELOCITY
        !           206: |   This routine creates a new velocity for the bezier points.  Each bezier
        !           207: |   point is randomly chosen.  The two inside points should have a speed
        !           208: |   less then the endpoints (most of the time-better effect).
        !           209: |
        !           210: | created: 20-May-91
        !           211: | history: 20-May-91 <chriswil> created.
        !           212: |
        !           213: \*---------------------------------------------------------------------------*/
        !           214: int PolyNewVel(int i)
        !           215: {
        !           216:     int nRet;
        !           217: 
        !           218: 
        !           219:     if ((i == 1) || (i == 2))
        !           220:         nRet = (int)((lRandom() % VELMAX) / 3) + VELMIN;
        !           221:     else
        !           222:         nRet = (int)(lRandom() % VELMAX) + VELMIN;
        !           223: 
        !           224:     return((nRet < 0) ? -nRet : nRet);
        !           225: }
        !           226: 
        !           227: 
        !           228: /*---------------------------------------------------------------------------*\
        !           229: | INITIALIZE POLYBEZIER POINTS
        !           230: |   This routine initializes the polybezier points for the first object.  This
        !           231: |   is performed on startup of the window.
        !           232: |
        !           233: | created: 20-May-91
        !           234: | history: 20-May-91 <chriswil> created.
        !           235: |
        !           236: \*---------------------------------------------------------------------------*/
        !           237: VOID PolyInitPoints(HWND hWnd)
        !           238: {
        !           239:     PPOLYDATA   ppd;
        !           240:     LPBEZBUFFER lpBez;
        !           241:     int         idx;
        !           242:     RECT        rect;
        !           243: 
        !           244: 
        !           245:     if(ppd = (PPOLYDATA)LockWindowInfo(hWnd))
        !           246:     {
        !           247:         if(lpBez = (LPBEZBUFFER)GlobalLock(ppd->hBezBuffer))
        !           248:         {
        !           249:             GetClientRect(hWnd,&rect);
        !           250: 
        !           251:             for(idx=0; idx < 4; idx++)
        !           252:             {
        !           253:                 lpBez->pPts[idx].x = lRandom() % rect.right;
        !           254:                 lpBez->pPts[idx].y = lRandom() % rect.bottom;
        !           255: 
        !           256:                 ppd->pVel[idx].x = PolyNewVel(idx);
        !           257:                 ppd->pVel[idx].y = PolyNewVel(idx);
        !           258:             }
        !           259:             GlobalUnlock(ppd->hBezBuffer);
        !           260:         }
        !           261:         UnlockWindowInfo(hWnd);
        !           262:     }
        !           263:     return;
        !           264: }
        !           265: 
        !           266: 
        !           267: /*---------------------------------------------------------------------------*\
        !           268: | POLYBEZIER REDRAW
        !           269: |   This routine resets the bezier curves and redraws the poly-bezier client
        !           270: |   area.
        !           271: |
        !           272: | created: 20-May-91
        !           273: | history: 20-May-91 <chriswil> created.
        !           274: |
        !           275: \*---------------------------------------------------------------------------*/
        !           276: VOID PolyRedraw(HWND hWnd)
        !           277: {
        !           278:     PPOLYDATA   ppd;
        !           279:     LPBEZBUFFER lpBez,lpCurr;
        !           280:     HDC         hDC;
        !           281:     int         i,j;
        !           282:     RECT        rect;
        !           283: 
        !           284: 
        !           285:     if(ppd = (PPOLYDATA)LockWindowInfo(hWnd))
        !           286:     {
        !           287:         if(lpBez = (LPBEZBUFFER)GlobalLock(ppd->hBezBuffer))
        !           288:         {
        !           289:             if(hDC = GetDC(hWnd))
        !           290:             {
        !           291:                 /*
        !           292:                 ** Save the current bezier.  Set the first bezier in the
        !           293:                 ** array to that curve, and use it as a basis for the next
        !           294:                 ** series.
        !           295:                 */
        !           296:                 lpCurr        = lpBez+ppd->nBezCurr;
        !           297:                 *lpBez        = *lpCurr;
        !           298:                 ppd->nBezCurr = 0;
        !           299: 
        !           300: 
        !           301:                 /*
        !           302:                 ** Clean the curves (all but the first curve).
        !           303:                 */
        !           304:                 for(j=1; j < ppd->nBezTotal; j++)
        !           305:                 {
        !           306:                     for(i=0; i < 4; i++)
        !           307:                     {
        !           308:                         (lpBez+j)->pPts[i].x = -1;
        !           309:                         (lpBez+j)->pPts[i].y = 0;
        !           310:                     }
        !           311:                 }
        !           312: 
        !           313: 
        !           314: 
        !           315:                 /*
        !           316:                 ** Clear the display.
        !           317:                 */
        !           318:                 GetClientRect(hWnd,&rect);
        !           319:                 BitBlt(hDC,0,0,rect.right, rect.bottom,(HDC)0,0,0,0);
        !           320: 
        !           321: 
        !           322:                 /*
        !           323:                 ** Draw the first curve in the bezier array.
        !           324:                 */
        !           325: #ifdef WIN32
        !           326:                 PolyBezier(hDC,lpBez->pPts,4);
        !           327: #else
        !           328:                 Polyline(hDC,lpBez->pPts,4);
        !           329: #endif
        !           330:                 ReleaseDC(hWnd,hDC);
        !           331:             }
        !           332:             GlobalUnlock(ppd->hBezBuffer);
        !           333:         }
        !           334:         UnlockWindowInfo(hWnd);
        !           335:     }
        !           336:     return;
        !           337: }
        !           338: 
        !           339: 
        !           340: 
        !           341: 
        !           342: VOID PolyDrawBez(HWND hWnd)
        !           343: {
        !           344:     PPOLYDATA   ppd;
        !           345:     LPBEZBUFFER lpBez,lpCurr,lpPrev;
        !           346:     int         idx,x,y;
        !           347:     RECT        rect;
        !           348:     HDC         hDC;
        !           349:     HPEN        hPen;
        !           350: 
        !           351: static COLORREF crColor[] = {0x000000FF,0x0000FF00,0x00FF0000,0x0000FFFF,
        !           352:                              0x00FF00FF,0x00FFFF00,0x00FFFFFF,0x00000080,
        !           353:                              0x00008000,0x00800000,0x00008080,0x00800080,
        !           354:                              0x00808000,0x00808080,0x000000FF,0x0000FF00,
        !           355:                              0x00FF0000,0x0000FFFF,0x00FF00FF,0x00FFFF00};
        !           356: 
        !           357: 
        !           358:     if(ppd = (PPOLYDATA)LockWindowInfo(hWnd))
        !           359:     {
        !           360:         if(lpBez = (LPBEZBUFFER)GlobalLock(ppd->hBezBuffer))
        !           361:         {
        !           362:             if(hDC = GetDC(hWnd))
        !           363:             {
        !           364:                 GetClientRect(hWnd,&rect);
        !           365: 
        !           366:                 lpPrev = lpBez+ppd->nBezCurr;
        !           367: 
        !           368:                 ppd->nBezCurr += 1;
        !           369: 
        !           370:                 if(ppd->nBezCurr >= ppd->nBezTotal)
        !           371:                 {
        !           372:                     ppd->nBezCurr = 0;
        !           373:                     ppd->nColor  = (++ppd->nColor % 20);
        !           374:                 }
        !           375:                 lpCurr = lpBez+ppd->nBezCurr;
        !           376: 
        !           377: 
        !           378:                 if(lpCurr->pPts[0].x != -1)
        !           379:                 {
        !           380:                     hPen = SelectObject(hDC,GetStockObject(BLACK_PEN));
        !           381: #ifdef WIN32
        !           382:                     PolyBezier(hDC,lpCurr->pPts,4);
        !           383: #else
        !           384:                     Polyline(hDC,lpCurr->pPts,4);
        !           385: #endif
        !           386:                     SelectObject(hDC,hPen);
        !           387:                 }
        !           388: 
        !           389:                 for(idx=0; idx < 4; idx++)
        !           390:                 {
        !           391:                     x  = lpPrev->pPts[idx].x;
        !           392:                     y  = lpPrev->pPts[idx].y;
        !           393:                     x += ppd->pVel[idx].x;
        !           394:                     y += ppd->pVel[idx].y;
        !           395: 
        !           396:                     if(x >= rect.right)
        !           397:                     {
        !           398:                         x = rect.right - ((x - rect.right)+1);
        !           399:                         ppd->pVel[idx].x = -PolyNewVel(idx);
        !           400:                     }
        !           401: 
        !           402:                     if(x <= rect.left)
        !           403:                     {
        !           404:                         x = rect.left + ((rect.left - x)+1);
        !           405:                         ppd->pVel[idx].x = PolyNewVel(idx);
        !           406:                     }
        !           407: 
        !           408:                     if(y >= rect.bottom)
        !           409:                     {
        !           410:                         y = rect.bottom - ((y - rect.bottom)+1);
        !           411:                         ppd->pVel[idx].y = -PolyNewVel(idx);
        !           412:                     }
        !           413: 
        !           414:                     if(y <= rect.top)
        !           415:                     {
        !           416:                         y = rect.top + ((rect.top - y)+1);
        !           417:                         ppd->pVel[idx].y = PolyNewVel(idx);
        !           418:                     }
        !           419: 
        !           420:                     lpCurr->pPts[idx].x = x;
        !           421:                     lpCurr->pPts[idx].y = y;
        !           422:                 }
        !           423: 
        !           424:                 hPen = SelectObject(hDC,CreatePen(PS_SOLID,1,crColor[ppd->nColor]));
        !           425: #ifdef WIN32
        !           426:                 PolyBezier(hDC,lpCurr->pPts,4);
        !           427: #else
        !           428:                 Polyline(hDC,lpCurr->pPts,4);
        !           429: #endif
        !           430:                 DeleteObject(SelectObject(hDC,hPen));
        !           431: 
        !           432: #ifdef WIN32
        !           433:                 SetROP2(hDC,R2_COPYPEN);
        !           434: #endif
        !           435:                 ReleaseDC(hWnd,hDC);
        !           436:             }
        !           437:             GlobalUnlock(ppd->hBezBuffer);
        !           438:         }
        !           439:         UnlockWindowInfo(hWnd);
        !           440:     }
        !           441: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.