|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.