Annotation of pmsdk/samples/edpline/edpline.c, revision 1.1.1.1

1.1       root        1: /*
                      2:     edpline.c -- polyline editor, for practice in mouse handling
                      3:     Created by Microsoft Corporation, 1989
                      4: */
                      5: #define INCL_DOSMEMMGR
                      6: #define INCL_WINWINDOWMGR
                      7: #define INCL_WINMESSAGEMGR
                      8: #define INCL_WINSWITCHLIST
                      9: #define INCL_WINDIALOGS
                     10: #define INCL_GPIBITMAPS
                     11: #define INCL_GPIPRIMITIVES
                     12: #define INCL_WINMENUS
                     13: #define        INCL_WININPUT
                     14: #define        INCL_WINFRAMEMGR
                     15: #include <os2.h>
                     16: 
                     17: #include <mt\stdio.h>
                     18: #include <mt\stdlib.h>
                     19: 
                     20: #include "edpline.h"
                     21: 
                     22: 
                     23: 
                     24: #define        abs(x)                  (((x) > 0) ? (x) : -(x))
                     25: #define PRIM_POLYLINE          0x0001
                     26: #define PRIM_POLYFILLET        0x0002
                     27: #define PRIM_POLYSPLINE        0x0004
                     28: #define PRIM_POINTARC          0x0008
                     29: 
                     30: 
                     31: /************************************************************************
                     32: *
                     33: *   Function declarations
                     34: *
                     35: ************************************************************************/
                     36: 
                     37: /* Private functions */
                     38: 
                     39: VOID   cdecl main(VOID);
                     40: BOOL   InitGlobals(VOID);
                     41: BOOL   InitApp(VOID);
                     42: VOID   Close(HWND);
                     43: VOID   Command(HWND, USHORT);
                     44: VOID   Paint(HPS, BOOL);
                     45: VOID   MouseMove(HWND, MPARAM);
                     46: VOID   ButtonUp(HWND, USHORT);
                     47: VOID   ButtonDown(HWND, USHORT, MPARAM);
                     48: USHORT IsPtInList(PPOINTL);
                     49: USHORT AddPtToList(PPOINTL);
                     50: BOOL   IsPtCloseToLine(PPOINTL, PPOINTL, PPOINTL);
                     51: VOID   DrawPrimitive(HPS, USHORT);
                     52: VOID   DrawPolyLine(HPS);
                     53: VOID   DrawPolyFillet(HPS);
                     54: VOID   DrawPolySpline(HPS);
                     55: VOID   DrawPointArc(HPS);
                     56: VOID   DrawControlPoints(HPS, LONG, PPOINTL);
                     57: VOID   MyMessageBox(HWND, PSZ);
                     58: VOID   SwapLong(PLONG, PLONG);
                     59: 
                     60: /* Exported functions */
                     61: 
                     62: ULONG  CALLBACK WndProc(HWND, USHORT, MPARAM, MPARAM);
                     63: MRESULT CALLBACK AboutDlgProc(HWND, USHORT, MPARAM, MPARAM);
                     64: 
                     65: 
                     66: 
                     67: /************************************************************************
                     68: *
                     69: *   Global Variables
                     70: *
                     71: ************************************************************************/
                     72: 
                     73: typedef struct
                     74: {
                     75:     HAB  hab;
                     76:     HMQ  hMsgQ;
                     77:     HWND hwndFrame;
                     78:     HWND hwnd;
                     79: 
                     80:     ULONG   flPrim;
                     81:     BOOL    fDisplayControlPoints;
                     82:     LONG    cptl;
                     83:     PPOINTL pptl;
                     84: 
                     85:     USHORT  usPtGrabbed;
                     86:     BOOL    fDragging;
                     87: 
                     88:     ULONG   ulHitPrecision;
                     89: 
                     90: } GLOBALDATA;
                     91: GLOBALDATA global;
                     92: 
                     93: 
                     94: 
                     95: 
                     96: /************************************************************************
                     97: *
                     98: *   main
                     99: *
                    100: *   WinInitialize resizes our ring 2 stack, among other things, so
                    101: *   we won't GP fault trying to do graphics.  WinCreateMsgQueue defines
                    102: *   us as a REAL PM app. (as well as the WINDOWAPI statement in the .DEF
                    103: *   file...)   Call a sub to register our window class and create a window.
                    104: *   Loop over messages.  Exit cleanly.
                    105: *
                    106: ************************************************************************/
                    107: 
                    108: VOID cdecl
                    109: main()
                    110: {
                    111:     QMSG qMsg;
                    112:     int iRet = 0;
                    113: 
                    114: 
                    115:     global.hab  = WinInitialize(NULL);
                    116:     global.hMsgQ = WinCreateMsgQueue(global.hab, 0);
                    117: 
                    118:     if (InitApp())
                    119:        while (WinGetMsg( global.hab, (PQMSG)&qMsg, (HWND)NULL, 0, 0 ))
                    120:            WinDispatchMsg( global.hab, (PQMSG)&qMsg );
                    121:     else
                    122:        iRet = -1;
                    123: 
                    124:     WinDestroyWindow( global.hwndFrame );
                    125:     WinDestroyMsgQueue( global.hMsgQ );
                    126:     WinTerminate( global.hab );
                    127:     DosExit(EXIT_PROCESS, iRet);
                    128: }
                    129: 
                    130: 
                    131: 
                    132: 
                    133: /****************************************************************************
                    134: *
                    135: *   InitGlobals
                    136: *
                    137: *   Initialize global variables.
                    138: *
                    139: ****************************************************************************/
                    140: 
                    141: BOOL
                    142: InitGlobals()
                    143: {
                    144:     global.flPrim = PRIM_POLYLINE;
                    145:     global.fDisplayControlPoints = TRUE;
                    146: 
                    147:     global.cptl = 0L;
                    148:     global.pptl = NULL;
                    149:     if (DosAllocSeg(CPTLMAX * sizeof(POINTL),
                    150:                   ((PUSHORT)&global.pptl)+1, 0))
                    151:        return FALSE;
                    152: 
                    153:     global.usPtGrabbed = -1;
                    154:     global.fDragging = FALSE;
                    155:     global.ulHitPrecision = 0L;
                    156: 
                    157:     return TRUE;
                    158: }
                    159: 
                    160: 
                    161: 
                    162: 
                    163: /****************************************************************************
                    164: *
                    165: *   InitApp
                    166: *
                    167: *   Register application window class and creates standard window.
                    168: *
                    169: ****************************************************************************/
                    170: 
                    171: #define INIT_MENU_ITEM(val, var)     \
                    172:        TOGGLE_MENU_ITEM(global.hwndFrame, (val), (var))
                    173: 
                    174: BOOL
                    175: InitApp()
                    176: {
                    177:     char szTitle[24];
                    178:     ULONG ctldata;
                    179:     PID pid;
                    180:     TID tid;
                    181:     HSWITCH hsw;
                    182:     static SWCNTRL swctl = { 0, 0, 0, 0, 0, SWL_VISIBLE,
                    183:                             SWL_JUMPABLE, "Edit Polyline", 0 };
                    184: 
                    185:     if (!InitGlobals())
                    186:        return FALSE;
                    187: 
                    188: 
                    189:     /*  Register Application Window Class  */
                    190: 
                    191:     WinLoadString( global.hab, NULL, IDS_TITLE, sizeof(szTitle), (PCH)szTitle );
                    192:     if ( !WinRegisterClass( global.hab, (PCH)szTitle, (PFNWP)WndProc,
                    193:            CS_SIZEREDRAW, 0 ))
                    194:        return FALSE;
                    195: 
                    196: 
                    197: 
                    198:     /* Create a window instance of class "PolyLine Editor" */
                    199: 
                    200:     ctldata = FCF_STANDARD &
                    201:      ~(ULONG)(FCF_ICON | FCF_ACCELTABLE | FCF_TASKLIST);
                    202: 
                    203:     if (global.hwndFrame = WinCreateStdWindow(
                    204:        HWND_DESKTOP,              /* specify desktop as parent window      */
                    205:        WS_VISIBLE,                /* window styles                         */
                    206:        &ctldata,                  /* frame creation flags                  */
                    207:        (PCH)szTitle,              /* window class name                     */
                    208:        (PCH)szTitle,              /* name appearing in window caption      */
                    209:        0L,                        /*                                       */
                    210:        (HMODULE)NULL,             /* use current executable module id      */
                    211:        IDR_EDPLINE,               /* menu id                               */
                    212:        (HWND FAR *)&global.hwnd   /* window handle                         */
                    213:        ))
                    214:     {
                    215:        INIT_MENU_ITEM(IDM_CTLPOINTS, global.fDisplayControlPoints);
                    216: 
                    217:        if (global.flPrim & PRIM_POLYLINE)
                    218:            CHECK_MENU_ITEM(global.hwndFrame, IDM_POLYLINE);
                    219:        if (global.flPrim & PRIM_POLYFILLET)
                    220:            CHECK_MENU_ITEM(global.hwndFrame, IDM_POLYFILLET);
                    221:        if (global.flPrim & PRIM_POLYSPLINE)
                    222:            CHECK_MENU_ITEM(global.hwndFrame, IDM_POLYSPLINE);
                    223:        if (global.flPrim & PRIM_POINTARC)
                    224:            CHECK_MENU_ITEM(global.hwndFrame, IDM_POINTARC);
                    225: 
                    226: 
                    227:        /* Add ourselves to the switch list. */
                    228: 
                    229:        WinQueryWindowProcess(global.hwndFrame, &pid, &tid);
                    230:        swctl.hwnd      = global.hwndFrame;
                    231:        swctl.idProcess = pid;
                    232:        hsw = WinAddSwitchEntry(&swctl);
                    233: 
                    234:        return TRUE;
                    235:     }
                    236:     return FALSE;
                    237: }
                    238: 
                    239: 
                    240: 
                    241: 
                    242: /************************************************************************
                    243: *
                    244: *   WndProc
                    245: *
                    246: *   Process messages for the window class.
                    247: *
                    248: ************************************************************************/
                    249: 
                    250: ULONG CALLBACK
                    251: WndProc( hwnd, usMsg, mp1, mp2 )
                    252: HWND   hwnd;
                    253: USHORT usMsg;
                    254: MPARAM  mp1;
                    255: MPARAM  mp2;
                    256: {
                    257:     HPS   hps;
                    258: 
                    259: 
                    260:     switch (usMsg)
                    261:     {
                    262:     case WM_CLOSE:
                    263:        Close(hwnd);
                    264:        break;
                    265: 
                    266:     case WM_COMMAND:
                    267:        Command(hwnd, LOUSHORT(mp1));
                    268:        break;
                    269: 
                    270:     case WM_PAINT:
                    271:        hps = WinBeginPaint(global.hwnd, NULL, NULL);
                    272:        if (global.ulHitPrecision == 0L)
                    273:        {
                    274:            HDC hdc;
                    275:            LONG cx;
                    276: 
                    277:            if (hdc = WinQueryWindowDC(global.hwnd)) {
                    278:                DevQueryCaps(hdc, CAPS_MARKER_WIDTH,  1L,  &cx);
                    279:                global.ulHitPrecision = (cx >> 17) + 1L;
                    280:            } else {
                    281:                global.ulHitPrecision = 6L;
                    282:            }
                    283:        }
                    284:        Paint(hps, TRUE);
                    285:        WinEndPaint(hps);
                    286:        break;
                    287: 
                    288:     case WM_BUTTON1DOWN:
                    289:     case WM_BUTTON2DOWN:
                    290:        ButtonDown(hwnd, usMsg, mp1);
                    291:        break;
                    292: 
                    293:     case WM_BUTTON1UP:
                    294:     case WM_BUTTON2UP:
                    295:        ButtonUp(hwnd, usMsg);
                    296:        break;
                    297: 
                    298:     case WM_MOUSEMOVE:
                    299:        MouseMove(hwnd, mp1);
                    300:        return( (ULONG)WinDefWindowProc(hwnd, usMsg, mp1, mp2));
                    301:        break;
                    302: 
                    303:     default:
                    304:        return( (ULONG)WinDefWindowProc(hwnd, usMsg, mp1, mp2));
                    305:        break;
                    306:     }
                    307: 
                    308:     return FALSE;
                    309: }
                    310: 
                    311: 
                    312: 
                    313: 
                    314: /************************************************************************
                    315: *
                    316: *   MouseMove
                    317: *
                    318: ************************************************************************/
                    319: 
                    320: VOID
                    321: MouseMove(hwnd, mp1)
                    322: HWND hwnd;
                    323: MPARAM mp1;
                    324: {
                    325:     POINTL ptl;
                    326:     HPS hps;
                    327: 
                    328:     if (hwnd == global.hwnd)
                    329:        if (global.fDragging)
                    330:        {
                    331:            ptl.x = (LONG) LOUSHORT(mp1);
                    332:            ptl.y = (LONG) HIUSHORT(mp1);
                    333: 
                    334:            if (global.usPtGrabbed != -1)
                    335:            {
                    336:                hps = WinGetPS(hwnd);
                    337:                Paint(hps, FALSE);
                    338: 
                    339:                *(global.pptl+global.usPtGrabbed) = ptl;
                    340: 
                    341:                Paint(hps, FALSE);
                    342:                WinReleasePS(hps);
                    343:            }
                    344:        }
                    345: }
                    346: 
                    347: 
                    348: 
                    349: 
                    350: /************************************************************************
                    351: *
                    352: *   ButtonUp
                    353: *
                    354: ************************************************************************/
                    355: 
                    356: VOID
                    357: ButtonUp(hwnd, usMsg)
                    358: HWND hwnd;
                    359: USHORT usMsg;
                    360: {
                    361:     int i;
                    362:     HPS hps;
                    363: 
                    364: 
                    365:     if (hwnd == global.hwnd)
                    366:        if (global.fDragging)
                    367:        {
                    368:            global.fDragging = FALSE;
                    369:            if (global.usPtGrabbed != -1)
                    370:            {
                    371:                if (usMsg == WM_BUTTON2UP)
                    372:                {
                    373:                    hps = WinGetPS(hwnd);
                    374:                    Paint(hps, FALSE);
                    375: 
                    376:                    if ((i = global.usPtGrabbed) < (int) global.cptl-1)
                    377:                        while (i < (int) global.cptl-1)
                    378:                        {
                    379:                            global.pptl[i] = global.pptl[i+1];
                    380:                            ++i;
                    381:                        }
                    382: 
                    383:                    --global.cptl;
                    384:                    global.usPtGrabbed = -1;
                    385: 
                    386:                    Paint(hps, FALSE);
                    387:                    WinReleasePS(hps);
                    388:                }
                    389:                else    /* WM_BUTTON1UP */
                    390:                    global.usPtGrabbed = -1;
                    391:            }
                    392:        }
                    393: }
                    394: 
                    395: 
                    396: 
                    397: 
                    398: /************************************************************************
                    399: *
                    400: *   ButtonDown
                    401: *
                    402: ************************************************************************/
                    403: 
                    404: VOID
                    405: ButtonDown(hwnd, usMsg, mp1)
                    406: HWND hwnd;
                    407: USHORT usMsg;
                    408: MPARAM mp1;
                    409: {
                    410:     POINTL ptl;
                    411:     HPS hps;
                    412:     USHORT usNewPtGrabbed;
                    413: 
                    414: 
                    415:     if (hwnd == global.hwnd)
                    416:        if (!global.fDragging)
                    417:        {
                    418:            global.fDragging = TRUE;
                    419: 
                    420:            ptl.x = (LONG) LOUSHORT(mp1);
                    421:            ptl.y = (LONG) HIUSHORT(mp1);
                    422: 
                    423:            if ((usNewPtGrabbed = IsPtInList(&ptl)) != -1)
                    424:                global.usPtGrabbed = usNewPtGrabbed;
                    425: 
                    426:            if (usMsg == WM_BUTTON1DOWN)
                    427:            {
                    428:                hps = WinGetPS(hwnd);
                    429:                Paint(hps, FALSE);
                    430: 
                    431:                if (usNewPtGrabbed == -1)
                    432:                    global.usPtGrabbed = AddPtToList(&ptl);
                    433:                else
                    434:                    global.usPtGrabbed = usNewPtGrabbed;
                    435: 
                    436:                Paint(hps, FALSE);
                    437:                WinReleasePS(hps);
                    438: 
                    439:                if (global.usPtGrabbed == -1)
                    440:                    MyMessageBox(global.hwnd, "Cannot add any more points.");
                    441:            }
                    442:        }
                    443: }
                    444: 
                    445: 
                    446: 
                    447: 
                    448: /************************************************************************
                    449: *
                    450: *   IsPtInList
                    451: *
                    452: ************************************************************************/
                    453: 
                    454: USHORT
                    455: IsPtInList(pptl)
                    456: PPOINTL pptl;
                    457: {
                    458:     int i;
                    459: 
                    460: 
                    461:     /* try to find pptl in the points we already have */
                    462:     for (i = 0; i < (int) global.cptl; ++i)
                    463:        if (((abs(pptl->x - global.pptl[i].x))
                    464:                <= (LONG) global.ulHitPrecision)
                    465:         && ((abs(pptl->y - global.pptl[i].y))
                    466:                <= (LONG) global.ulHitPrecision))
                    467:                return i;
                    468: 
                    469:     /* couldn't find it */
                    470:     return -1;
                    471: }
                    472: 
                    473: 
                    474: 
                    475: 
                    476: /************************************************************************
                    477: *
                    478: *   AddPtToList
                    479: *
                    480: ************************************************************************/
                    481: 
                    482: USHORT
                    483: AddPtToList(pptl)
                    484: PPOINTL pptl;
                    485: {
                    486:     int i, j;
                    487: 
                    488:     if (global.cptl < CPTLMAX)
                    489:     {
                    490:        /* check for new points lying on a line segment */
                    491:        for (i = 0; i < (int) (global.cptl - 1L); ++i)
                    492:            if (IsPtCloseToLine(&global.pptl[i], &global.pptl[i+1], pptl))
                    493:            {
                    494:                for (j = (int) global.cptl; j > i+1; --j)
                    495:                    global.pptl[j] = global.pptl[j - 1];
                    496:                global.pptl[i+1] = *pptl;
                    497:                ++global.cptl;
                    498:                return i+1;
                    499:            }
                    500: 
                    501:        /* append the point */
                    502: 
                    503:        i = (int) global.cptl;
                    504:        global.pptl[i] = *pptl;
                    505:        ++global.cptl;
                    506:        return i;
                    507:     }
                    508: 
                    509:     return -1;
                    510: }
                    511: 
                    512: 
                    513: 
                    514: 
                    515: /************************************************************************
                    516: *
                    517: *   IsPtCloseToLine
                    518: *
                    519: ************************************************************************/
                    520: 
                    521: BOOL
                    522: IsPtCloseToLine(pptl1, pptl2, pptlTest)
                    523: PPOINTL pptl1;
                    524: PPOINTL pptl2;
                    525: PPOINTL pptlTest;
                    526: {
                    527:     POINTL ptlLL, ptlUR;
                    528:     LONG dx, dy, yIntercept, result;
                    529: 
                    530: 
                    531:     /* find the bounding box of the line segment */
                    532: 
                    533:     ptlLL = *pptl1;    /* assume line goes lower left to upper right */
                    534:     ptlUR = *pptl2;
                    535:     if (pptl1->x > pptl2->x)
                    536:        SwapLong(&ptlLL.x, &ptlUR.x);
                    537:     if (pptl1->y > pptl2->y)
                    538:        SwapLong(&ptlLL.y, &ptlUR.y);
                    539: 
                    540: 
                    541:     /* adjust the bounding box if it's too narrow */
                    542: 
                    543:     dx = pptl2->x - pptl1->x;
                    544:     if (abs(dx) <= (LONG) (global.ulHitPrecision >> 1))
                    545:     {
                    546:        ptlLL.x -= (LONG) (global.ulHitPrecision >> 1);
                    547:        ptlUR.x += (LONG) (global.ulHitPrecision >> 1);
                    548:     }
                    549:     dy = pptl2->y - pptl1->y;
                    550:     if (abs(dy) <= (LONG) (global.ulHitPrecision >> 1))
                    551:     {
                    552:        ptlLL.y -= (LONG) (global.ulHitPrecision >> 1);
                    553:        ptlUR.y += (LONG) (global.ulHitPrecision >> 1);
                    554:     }
                    555: 
                    556: 
                    557:     /* see if the test point is in the bounding box of the line segment */
                    558: 
                    559:     if ((pptlTest->x >= ptlLL.x) &&
                    560:        (pptlTest->x <= ptlUR.x) &&
                    561:        (pptlTest->y >= ptlLL.y) &&
                    562:        (pptlTest->y <= ptlUR.y))
                    563:     {
                    564:        /* test for special cases */
                    565: 
                    566:        if (dx == 0)
                    567:        {
                    568:            if (abs(pptlTest->x - pptl1->x) <= (LONG) global.ulHitPrecision)
                    569:                return TRUE;
                    570:            else
                    571:                return FALSE;
                    572:        }
                    573: 
                    574:        if (dy == 0)
                    575:        {
                    576:            if (abs(pptlTest->y - pptl1->y) <= (LONG) global.ulHitPrecision)
                    577:                return TRUE;
                    578:            else
                    579:                return FALSE;
                    580:        }
                    581: 
                    582: 
                    583:        /* test for general case */
                    584: 
                    585:        yIntercept = pptl1->y - (pptl1->x * dy) / dx;
                    586: 
                    587:        result = pptlTest->y - (pptlTest->x * dy / dx) - yIntercept;
                    588:        if (abs(result) <= (LONG) global.ulHitPrecision)
                    589:            return TRUE;
                    590:     }
                    591: 
                    592:     return FALSE;
                    593: }
                    594: 
                    595: 
                    596: 
                    597: 
                    598: /************************************************************************
                    599: *
                    600: *   SwapLong
                    601: *
                    602: ************************************************************************/
                    603: 
                    604: VOID
                    605: SwapLong(pl1, pl2)
                    606: PLONG pl1, pl2;
                    607: {
                    608:     LONG lTmp;
                    609: 
                    610:     lTmp = *pl1;
                    611:     *pl1 = *pl2;
                    612:     *pl2 = lTmp;
                    613: }
                    614: 
                    615: 
                    616: 
                    617: 
                    618: /************************************************************************
                    619: *
                    620: *   Close
                    621: *
                    622: ************************************************************************/
                    623: 
                    624: VOID
                    625: Close(hwnd)
                    626: HWND hwnd;
                    627: {
                    628:     WinPostMsg(hwnd, WM_QUIT, 0L, 0L);
                    629: }
                    630: 
                    631: 
                    632: 
                    633: 
                    634: /************************************************************************
                    635: *
                    636: *   Command
                    637: *
                    638: *   Dispatches menu commands to the proper handlers.
                    639: *
                    640: ************************************************************************/
                    641: 
                    642: #define UPDATE_MENU_BOOL(var, val)                             \
                    643:        {                                                       \
                    644:            TOGGLE_BOOL((var));                                 \
                    645:            TOGGLE_MENU_ITEM(global.hwndFrame, (val), (var));   \
                    646:        }
                    647: 
                    648: #define UPDATE_MENU_LIST(var, val)                             \
                    649:        {                                                       \
                    650:            UNCHECK_MENU_ITEM(global.hwndFrame, (var));         \
                    651:            (var) = (val);                                      \
                    652:            CHECK_MENU_ITEM(global.hwndFrame, (var));           \
                    653:        }
                    654: 
                    655: VOID
                    656: Command(hwnd, id)
                    657: HWND hwnd;
                    658: USHORT id;
                    659: {
                    660:     HPS hps;
                    661:     BOOL fRedraw = FALSE;
                    662:     int rc;
                    663: 
                    664:     switch (id)
                    665:     {
                    666:     case IDM_ABOUT:
                    667:        rc = WinDlgBox(HWND_DESKTOP, hwnd, AboutDlgProc, NULL, IDD_ABOUT, NULL);
                    668:        fRedraw = FALSE;
                    669:        break;
                    670: 
                    671:     case IDM_NOPRIM:
                    672:        global.flPrim = 0L;
                    673:        TOGGLE_MENU_ITEM(global.hwndFrame, IDM_POLYLINE, 0);
                    674:        TOGGLE_MENU_ITEM(global.hwndFrame, IDM_POLYFILLET, 0);
                    675:        TOGGLE_MENU_ITEM(global.hwndFrame, IDM_POLYSPLINE, 0);
                    676:        fRedraw = TRUE;
                    677:        break;
                    678: 
                    679:     case IDM_POLYLINE:
                    680:        global.flPrim ^= PRIM_POLYLINE;
                    681:        TOGGLE_MENU_ITEM(global.hwndFrame, id, (global.flPrim & PRIM_POLYLINE));
                    682:        fRedraw = TRUE;
                    683:        break;
                    684: 
                    685:     case IDM_POLYFILLET:
                    686:        global.flPrim ^= PRIM_POLYFILLET;
                    687:        TOGGLE_MENU_ITEM(global.hwndFrame, id, (global.flPrim & PRIM_POLYFILLET));
                    688:        fRedraw = TRUE;
                    689:        break;
                    690: 
                    691:     case IDM_POLYSPLINE:
                    692:        global.flPrim ^= PRIM_POLYSPLINE;
                    693:        TOGGLE_MENU_ITEM(global.hwndFrame, id, (global.flPrim & PRIM_POLYSPLINE));
                    694:        fRedraw = TRUE;
                    695:        break;
                    696: 
                    697:     case IDM_POINTARC:
                    698:        global.flPrim ^= PRIM_POINTARC;
                    699:        TOGGLE_MENU_ITEM(global.hwndFrame, id, (global.flPrim & PRIM_POINTARC));
                    700:        fRedraw = TRUE;
                    701:        break;
                    702: 
                    703:     case IDM_CTLPOINTS:
                    704:        UPDATE_MENU_BOOL(global.fDisplayControlPoints, IDM_CTLPOINTS);
                    705:        fRedraw = TRUE;
                    706:        break;
                    707: 
                    708:     case IDM_CLEARALL:
                    709:        global.cptl = 0L;
                    710:        fRedraw = TRUE;
                    711:        break;
                    712:     }
                    713: 
                    714:     if (fRedraw)
                    715:     {
                    716:        hps = WinGetPS(hwnd);
                    717:        Paint(hps, TRUE);
                    718:        WinReleasePS(hps);
                    719:     }
                    720: }
                    721: 
                    722: 
                    723: 
                    724: 
                    725: /************************************************************************
                    726: *
                    727: *   Paint
                    728: *
                    729: ************************************************************************/
                    730: 
                    731: VOID
                    732: Paint(hps, fClearScreen)
                    733: HPS  hps;
                    734: BOOL fClearScreen;
                    735: {
                    736:     LINEBUNDLE lb;
                    737:     RECTL rcl;
                    738: 
                    739: 
                    740: 
                    741:     if (fClearScreen)
                    742:     {
                    743:        /* clear the screen */
                    744:        WinQueryWindowRect(global.hwnd, &rcl);
                    745:        GpiBitBlt(hps, NULL, 2L, (PPOINTL) &rcl, ROP_ONE, NULL);
                    746:     }
                    747: 
                    748: 
                    749:     if (global.cptl > 0L)
                    750:     {
                    751:        if (global.fDisplayControlPoints)
                    752:        {
                    753:            if (fClearScreen)
                    754:                /* draw all the control points */
                    755:                DrawControlPoints(hps, global.cptl, global.pptl);
                    756:            else if (global.usPtGrabbed != -1)
                    757:                /* draw just the control point that moved */
                    758:                DrawControlPoints(hps, 1L, global.pptl+global.usPtGrabbed);
                    759:        }
                    760: 
                    761:        /* set mix mode to xor */
                    762:        lb.usMixMode = FM_XOR;
                    763:        GpiSetAttrs(hps, PRIM_LINE, LBB_MIX_MODE, 0L, &lb);
                    764: 
                    765:        /* draw the current primitives */
                    766: 
                    767:        if (global.flPrim & PRIM_POLYLINE)
                    768:        {
                    769:            lb.lColor = CLR_BROWN;
                    770:            GpiSetAttrs(hps, PRIM_LINE, LBB_COLOR, 0L, &lb);
                    771:            DrawPrimitive(hps, IDM_POLYLINE);
                    772:        }
                    773: 
                    774:        if (global.flPrim & PRIM_POLYFILLET)
                    775:        {
                    776:            lb.lColor = CLR_DARKCYAN;
                    777:            GpiSetAttrs(hps, PRIM_LINE, LBB_COLOR, 0L, &lb);
                    778:            DrawPrimitive(hps, IDM_POLYFILLET);
                    779:        }
                    780: 
                    781:        if (global.flPrim & PRIM_POLYSPLINE)
                    782:        {
                    783:            lb.lColor = CLR_DARKPINK;
                    784:            GpiSetAttrs(hps, PRIM_LINE, LBB_COLOR, 0L, &lb);
                    785:            DrawPrimitive(hps, IDM_POLYSPLINE);
                    786:        }
                    787: 
                    788:        if (global.flPrim & PRIM_POINTARC)
                    789:        {
                    790:            lb.lColor = CLR_BACKGROUND;
                    791:            GpiSetAttrs(hps, PRIM_LINE, LBB_COLOR, 0L, &lb);
                    792:            DrawPrimitive(hps, IDM_POINTARC);
                    793:        }
                    794:     }
                    795: }
                    796: 
                    797: 
                    798: 
                    799: 
                    800: /************************************************************************
                    801: *
                    802: *   DrawPrimitive
                    803: *
                    804: ************************************************************************/
                    805: 
                    806: VOID
                    807: DrawPrimitive(hps, usPrim)
                    808: HPS hps;
                    809: USHORT usPrim;
                    810: {
                    811:     switch ( usPrim )
                    812:     {
                    813:     case IDM_POLYLINE:
                    814:        DrawPolyLine(hps);
                    815:        break;
                    816: 
                    817:     case IDM_POLYFILLET:
                    818:        DrawPolyFillet(hps);
                    819:        break;
                    820: 
                    821:     case IDM_POLYSPLINE:
                    822:        DrawPolySpline(hps);
                    823:        break;
                    824: 
                    825:     case IDM_POINTARC:
                    826:        DrawPointArc(hps);
                    827:        break;
                    828:     }
                    829: }
                    830: 
                    831: 
                    832: 
                    833: 
                    834: /************************************************************************
                    835: *
                    836: *   DrawPolyLine
                    837: *
                    838: ************************************************************************/
                    839: 
                    840: VOID
                    841: DrawPolyLine(hps)
                    842: HPS hps;
                    843: {
                    844:     GpiSetCurrentPosition( hps, global.pptl );
                    845:     GpiPolyLine( hps, global.cptl-1L, global.pptl+1 );
                    846: }
                    847: 
                    848: 
                    849: 
                    850: 
                    851: /************************************************************************
                    852: *
                    853: *   DrawPolyFillet
                    854: *
                    855: ************************************************************************/
                    856: 
                    857: VOID
                    858: DrawPolyFillet(hps)
                    859: HPS hps;
                    860: {
                    861:     if (global.cptl > 2)
                    862:     {
                    863:        GpiSetCurrentPosition( hps, global.pptl );
                    864:        GpiPolyFillet( hps, global.cptl-1L, global.pptl+1 );
                    865:     }
                    866: }
                    867: 
                    868: 
                    869: 
                    870: 
                    871: /************************************************************************
                    872: *
                    873: *   DrawPolySpline
                    874: *
                    875: ************************************************************************/
                    876: 
                    877: VOID
                    878: DrawPolySpline(hps)
                    879: HPS hps;
                    880: {
                    881:     USHORT cptSlack;   /* # points in pptl not usable by PolySpline */
                    882: 
                    883:     /* GpiPolySpline expects the number of points to be a
                    884:        multiple of 3.  If we have a non-multiple of three,
                    885:        (excluding the first point, which we've used to set
                    886:        the current position), only pass the largest multiple
                    887:        of three, saving the rest for the next go-round. */
                    888: 
                    889:     cptSlack = (int)((global.cptl-1L) % 3) + 1;
                    890:     GpiSetCurrentPosition( hps, global.pptl );
                    891:     GpiPolySpline( hps, global.cptl-cptSlack,
                    892:                   global.pptl+1 );
                    893: }
                    894: 
                    895: 
                    896: 
                    897: 
                    898: /************************************************************************
                    899: *
                    900: *   DrawPointArc
                    901: *
                    902: ************************************************************************/
                    903: 
                    904: VOID
                    905: DrawPointArc(hps)
                    906: HPS hps;
                    907: {
                    908:     if (global.cptl >= 3L)
                    909:     {
                    910:        GpiSetCurrentPosition( hps, global.pptl );
                    911:        GpiPointArc( hps, global.pptl+1 );
                    912:     }
                    913: }
                    914: 
                    915: 
                    916: 
                    917: 
                    918: /************************************************************************
                    919: *
                    920: *   DrawControlPoints
                    921: *
                    922: ************************************************************************/
                    923: 
                    924: VOID
                    925: DrawControlPoints(hps, cptl, pptl)
                    926: HPS hps;
                    927: LONG cptl;
                    928: PPOINTL pptl;
                    929: {
                    930:     MARKERBUNDLE mb;
                    931: 
                    932:     mb.lColor = CLR_TRUE;
                    933:     mb.usMixMode = FM_XOR;
                    934:     GpiSetAttrs(hps, PRIM_MARKER, MBB_COLOR | MBB_MIX_MODE, 0L, &mb);
                    935: 
                    936:     GpiPolyMarker(hps, cptl, pptl);
                    937: }
                    938: 
                    939: 
                    940: 
                    941: 
                    942: /************************************************************************
                    943: *
                    944: *   MyMessageBox
                    945: *
                    946: *   Displays a message box with the given string.  To simplify matters,
                    947: *   the box will always have the same title ("PolyLine Editor"), will always
                    948: *   have a single button ("Ok"), will always have an exclamation point
                    949: *   icon, and will always be application modal.
                    950: *
                    951: ************************************************************************/
                    952: 
                    953: VOID
                    954: MyMessageBox(hWnd, sz)
                    955: HWND hWnd;
                    956: PSZ sz;
                    957: {
                    958:     static char *szTitle = "PolyLine Editor";
                    959: 
                    960:     WinMessageBox(HWND_DESKTOP, hWnd, sz, szTitle, NULL,
                    961:                  MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL);
                    962: }
                    963: 
                    964: MRESULT CALLBACK AboutDlgProc(hDlg, msg, mp1, mp2)
                    965: /*
                    966:     About... dialog procedure
                    967: */
                    968: HWND   hDlg;
                    969: USHORT msg;
                    970: MPARAM mp1;
                    971: MPARAM mp2;
                    972: {
                    973:     switch(msg) {
                    974:        case WM_COMMAND:
                    975:            switch(COMMANDMSG(&msg)->cmd) {
                    976:                case DID_OK: WinDismissDlg(hDlg, TRUE); break;
                    977:                default: break;
                    978:            }
                    979:        default: return WinDefDlgProc(hDlg, msg, mp1, mp2);
                    980:     }
                    981:     return FALSE;
                    982: }

unix.superglobalmegacorp.com

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