|
|
1.1 ! root 1: /**************************************************************************** ! 2: ! 3: PROGRAM: line.c Created by Microsoft Corp., 1988 ! 4: ! 5: PURPOSE: Demonstrate the color, line, arc, and retained ! 6: drawing capabilities of the MS OS/2 Presentation Manager. ! 7: ! 8: FUNCTIONS: ! 9: GENERICWNDPROC ! 10: ABOUT ! 11: ARCPDLGPROC ! 12: FIL_S_DLGPROC ! 13: ! 14: ! 15: COMMENTS: ! 16: This code demonstrates some of the features of GPI, the Graphics ! 17: Programming Interface for MS OS/2. The user interface consists of ! 18: menus, dialogs, and message boxes. ! 19: ! 20: You can use menu selections to: ! 21: ! 22: o Erase the current screen contents ! 23: o Open a segment for retained drawing ! 24: o Save a segments contents ! 25: o Display a series of segments ! 26: o Select line widths ranging from 2 to 50 pels ! 27: o Select a line color from one of the 16 default colors ! 28: o Select a line-end style ! 29: o Select a line-join style ! 30: o Select a foreground line mix mode ! 31: o Plot an x- and y-axis for arc and ellipse drawing ! 32: o Draw 3 types of arcs ! 33: o Collect points for fillet and spline drawings ! 34: o Draw fillets and splines ! 35: ! 36: You can draw lines by pressing the left-most mouse button and ! 37: dragging the mouse. ! 38: ! 39: You can collect points for fillets and splines by clicking the ! 40: leftmost button when the mouse cursor is at the appropriate ! 41: position in the window's client area. ! 42: ! 43: ! 44: ! 45: ! 46: ****************************************************************************/ ! 47: #include "line.h" ! 48: ! 49: HAB hab; /* handle to the anchor block */ ! 50: HMQ hmq; /* handle to the message queue */ ! 51: HPS hps; /* handle to the presentation space */ ! 52: SIZEL page; /* ps pagesize */ ! 53: HDC hdc; /* device context handle */ ! 54: LONG width = 2; /* wide-line width */ ! 55: POINTL point1, point2; /* pel points */ ! 56: POINTL cur_pos, prev_pos, point; /* points used in tracking mouse */ ! 57: LONG larray[4]; /* array of fillet sharpness values */ ! 58: POINTL farray[20]; /* array fillet & spline params */ ! 59: LONG m; /* full arc multiplier */ ! 60: BOOL draw_full_arc, draw_geom_line, collect_points, geom_line_flag = 1; ! 61: LONG seg_num=0; /* unique segment identifier */ ! 62: LONG i,j, point_count; /* loop counter */ ! 63: POINTL parray[4] = { 10,10, 50,50, 200,10, 10,10 }; ! 64: LONG bflWinStyle; /* window style */ ! 65: CHAR str[80]; /* char string from sprintf */ ! 66: LINEBUNDLE pbundle; /* attribute bundle pointer */ ! 67: SHORT lP, lQ, lR, lS; /* temporary arc parameters */ ! 68: ARCPARAMS arcparams; /* arc parameters */ ! 69: POINTL arc_array[2] = {450, 150, 550, 100}; /* params for point arc */ ! 70: ! 71: ! 72: CHAR szClassName[] = "Line"; /* window class name */ ! 73: HWND hwndClient; /* handle to the client */ ! 74: HWND hwndFrame; /* handle to the frame window */ ! 75: QMSG qmsg; /* message queue structure */ ! 76: ! 77: VOID cdecl main() { ! 78: hab = WinInitialize(NULL); ! 79: hmq = WinCreateMsgQueue(hab, 0); ! 80: if (!WinRegisterClass(hab, szClassName, GenericWndProc, CS_SIZEREDRAW, 0)) ! 81: DosExit(EXIT_PROCESS, 1); ! 82: bflWinStyle = FCF_SYSMENU | FCF_TITLEBAR | FCF_SIZEBORDER | FCF_MINMAX | ! 83: FCF_MENU; ! 84: if (!(hwndFrame = WinCreateStdWindow(HWND_DESKTOP, 0L, &bflWinStyle, ! 85: szClassName, "Line Graphics", 0L, NULL, ID_RESOURCE, &hwndClient))) ! 86: DosExit(EXIT_PROCESS, 1); ! 87: WinSetWindowPos(hwndFrame, NULL, 0, 0, 639, 349, ! 88: SWP_SIZE | SWP_MOVE | SWP_SHOW); ! 89: ! 90: /* obtain a handle to a window DC */ ! 91: hdc = WinOpenWindowDC(hwndClient); ! 92: ! 93: /* create a ps */ ! 94: hps = GpiCreatePS (hab, /* handle to anchor block */ ! 95: hdc, /* handle to window DC */ ! 96: &page, /* page size is 0 by 0 */ ! 97: PU_PELS | GPIA_ASSOC); /* map 1 world coordinate to 1 ! 98: * pel, associate the new ps ! 99: * with hdc ! 100: */ ! 101: ! 102: GpiSetMarker(hps, MARKSYM_SMALLCIRCLE); ! 103: ! 104: while (WinGetMsg(hab, &qmsg, NULL, 0, 0)) ! 105: WinDispatchMsg(hab, &qmsg); ! 106: ! 107: ! 108: WinDestroyWindow(hwndFrame); ! 109: WinDestroyMsgQueue(hmq); ! 110: WinTerminate(hab); ! 111: DosExit(EXIT_PROCESS, 0); ! 112: } ! 113: ! 114: /**************************************************************************** ! 115: ! 116: FUNCTION: GenericWndProc(HWND, USHORT, MPARAM, MPARAM) ! 117: ! 118: PURPOSE: Processes messages ! 119: ! 120: MESSAGES: ! 121: ! 122: WM_COMMAND - input received ! 123: WM_PAINT - paint the window ! 124: ! 125: ****************************************************************************/ ! 126: ! 127: MRESULT FAR PASCAL GenericWndProc(hwnd, usMessage, mp1, mp2) ! 128: HWND hwnd; ! 129: USHORT usMessage; ! 130: MPARAM mp1; ! 131: MPARAM mp2; ! 132: { ! 133: RECTL rcl; ! 134: HWND hMenu; /* handle to the System menu */ ! 135: POINTL point1, point2; /* point structures */ ! 136: RECTL rect; /* rect structure */ ! 137: CHAR str[126]; /* array of characters */ ! 138: HPS hgpi; /* special ps for repainting */ ! 139: ! 140: switch (usMessage) { ! 141: case WM_COMMAND: ! 142: switch (LOUSHORT (mp1)) { ! 143: ! 144: /* ! 145: * ABOUT menu case statement ! 146: */ ! 147: case IDM_ABOUT: ! 148: WinDlgBox(HWND_DESKTOP, hwndFrame, About, NULL, ID_ABOUT, ! 149: NULL); ! 150: return 0L; ! 151: ! 152: /* ! 153: * LINE menu case statement ! 154: */ ! 155: case IDM_DR_LINE: ! 156: geom_line_flag = TRUE; ! 157: collect_points = FALSE; ! 158: return 0L; ! 159: ! 160: /* ! 161: * ARC menu case statements ! 162: */ ! 163: case IDM_AR_PARM: /* display arc param dialog box */ ! 164: WinDlgBox(HWND_DESKTOP, ! 165: hwndFrame, ! 166: (PFNWP)ArcPDlgProc, ! 167: NULL, ! 168: IDDLG_ARCP, ! 169: NULL); ! 170: return 0L; ! 171: case IDM_AR_AXIS: /* draw cartesian coord system */ ! 172: point1.x = 500; point1.y = 200; ! 173: GpiMove(hps, &point1); ! 174: DrawAxis(hps, &point1); ! 175: return 0L; ! 176: case IDM_AR_FULL: /* draw a full arc */ ! 177: point1.x = 500; point1.y = 200; ! 178: GpiMove(hps, &point1); ! 179: GpiFullArc(hps, DRO_OUTLINE, 50L * 65536L); ! 180: return 0L; ! 181: case IDM_AR_3PNT: /* draw a 3 point arc */ ! 182: point1.x = 500; point1.y = 200; ! 183: GpiMove(hps, &point1); ! 184: GpiPointArc(hps, arc_array); ! 185: return 0L; ! 186: case IDM_AR_PRTL: /* draw a partial arc */ ! 187: point1.x = 500; point1.y = 200; ! 188: GpiPartialArc(hps, ! 189: &point1, /* arc's center */ ! 190: 50L * 65536L,/* radii multiplier */ ! 191: 0L, /* start angle=0 * 65536 */ ! 192: 5898240L); /* sweep angle=90 * 65536 */ ! 193: return 0L; ! 194: case IDM_AR_CPNT: /* collect points for fillet or spline */ ! 195: draw_geom_line = FALSE; ! 196: geom_line_flag = FALSE; ! 197: collect_points = TRUE; ! 198: i = 0; ! 199: return 0L; ! 200: case IDM_AR_SPLN: /* draw spline using collected points */ ! 201: collect_points = FALSE; ! 202: if (!(j = --i % 3)){ /* check for mult. of 3 points */ ! 203: j = i; /* set up j for polyspline call */ ! 204: for (i = 0; i<=j; i++){ /* shift elements */ ! 205: farray[i].x = farray[i+1].x; ! 206: farray[i].y = farray[i+1].y; ! 207: } ! 208: farray[i].x = farray[i+1].x; farray[i].y = farray[i+1].y; ! 209: GpiQueryCurrentPosition(hps, &cur_pos); ! 210: GpiPolySpline(hps, j, farray); ! 211: for (i = 0; i<=j; i++){ ! 212: farray[i].x = 0; ! 213: farray[i].y = 0; ! 214: } ! 215: i = 0; ! 216: } ! 217: else ! 218: { ! 219: sprintf(str,"((Number_of_Points - 1) mod 3) != 0"); ! 220: WinMessageBox(HWND_DESKTOP, ! 221: hwndClient, ! 222: str, ! 223: "Try Again...", ! 224: 0, ! 225: MB_OK); ! 226: for (i = 0; i<20; i++){ ! 227: farray[i].x = 0; ! 228: farray[i].y = 0; ! 229: } ! 230: i = 0; ! 231: } ! 232: return 0L; ! 233: case IDM_AR_SFLL: /* draw sharp fillet using collected pts */ ! 234: collect_points = FALSE; ! 235: sprintf(str, "Plot 9 points. (If sharpness > 1, the fillet is a parabola, if sharpness < 0, the fillet is a hyperbola.) Four fillets will be drawn."); ! 236: WinMessageBox(HWND_DESKTOP, ! 237: hwndClient, ! 238: str, ! 239: "PolyFilletSharp", ! 240: 0, ! 241: MB_OK); ! 242: WinDlgBox(HWND_DESKTOP, ! 243: hwndFrame, ! 244: (PFNWP)Fil_S_DlgProc, ! 245: NULL, ! 246: IDDLG_FSDP, ! 247: NULL); ! 248: j = i; /* set up j for polyspline call */ ! 249: for (i = 0; i<=j; i++){ /* shift elements */ ! 250: farray[i].x = farray[i+1].x; ! 251: farray[i].y = farray[i+1].y; ! 252: } ! 253: GpiPolyFilletSharp(hps,--j, farray, larray); ! 254: for (i = 0; i<=j; i++){ ! 255: farray[i].x = 0; ! 256: farray[i].y = 0; ! 257: } ! 258: i = 0; ! 259: return 0L; ! 260: case IDM_AR_FLLT: /* draw fillet using collected points */ ! 261: collect_points = FALSE; ! 262: sprintf(str, "This selection will draw multiple fillets."); ! 263: WinMessageBox(HWND_DESKTOP, ! 264: hwndClient, ! 265: str, ! 266: "PolyFillet", ! 267: 0, ! 268: MB_OK); ! 269: GpiPolyFillet(hps,i, farray); ! 270: for (i = 0; i<20; i++){ ! 271: farray[i].x = 0; ! 272: farray[i].y = 0; ! 273: } ! 274: i = 0; ! 275: return 0L; ! 276: ! 277: /* ! 278: * QUERY menu case statement ! 279: */ ! 280: case IDM_QUERY: /* query the line attributes */ ! 281: QueryLBundle(); ! 282: return 0L; ! 283: ! 284: /* ! 285: * WIDTH menu case statments ! 286: */ ! 287: case IDM_WI_2: /* set the line width to 2 pels */ ! 288: width = 2; ! 289: return 0L; ! 290: case IDM_WI_5: /* set the line width to 5 pels */ ! 291: width = 5; ! 292: return 0L; ! 293: case IDM_WI_10: /* set the line width to 10 pels */ ! 294: width = 10; ! 295: return 0L; ! 296: case IDM_WI_15: /* set the line width to 15 pels */ ! 297: width = 15; ! 298: return 0L; ! 299: case IDM_WI_20: /* set the line width to 20 pels */ ! 300: width = 20; ! 301: return 0L; ! 302: case IDM_WI_25: /* set the line width to 25 pels */ ! 303: width = 25; ! 304: return 0L; ! 305: case IDM_WI_50: /* set the line width to 50 pels */ ! 306: width = 50; ! 307: return 0L; ! 308: ! 309: /* ! 310: * LINE END menu case statements ! 311: */ ! 312: case IDM_LE_DEFAULT: /* set the lineend to default */ ! 313: GpiSetLineEnd(hps, LINEEND_DEFAULT); ! 314: return 0L; ! 315: case IDM_LE_FLAT: /* set the lineend to flat */ ! 316: GpiSetLineEnd(hps, LINEEND_FLAT); ! 317: return 0L; ! 318: case IDM_LE_SQUARE: /* set the lineend to square */ ! 319: GpiSetLineEnd(hps, LINEEND_SQUARE); ! 320: return 0L; ! 321: case IDM_LE_ROUND: /* set the lineend to round */ ! 322: GpiSetLineEnd(hps, LINEEND_ROUND); ! 323: return 0L; ! 324: ! 325: /* ! 326: * LINE JOIN menu case statments ! 327: */ ! 328: case IDM_LI_DEFAULT: /* set the linejoin to default */ ! 329: GpiSetLineJoin(hps, LINEJOIN_DEFAULT); ! 330: return 0L; ! 331: case IDM_LI_BEVEL: ! 332: GpiSetLineJoin(hps, LINEJOIN_BEVEL); ! 333: return 0L; ! 334: case IDM_LI_ROUND: ! 335: GpiSetLineJoin(hps, LINEJOIN_ROUND); ! 336: return 0L; ! 337: case IDM_LI_MITRE: ! 338: GpiSetLineJoin(hps, LINEJOIN_MITRE); ! 339: return 0L; ! 340: ! 341: /* ! 342: * COLOR menu case statments ! 343: */ ! 344: case IDM_CO_BACKGROUND: /* set the color to background */ ! 345: GpiSetColor(hps, CLR_BACKGROUND); ! 346: return 0L; ! 347: case IDM_CO_BLUE: /* set the color to blue */ ! 348: GpiSetColor(hps, CLR_BLUE); ! 349: return 0L; ! 350: case IDM_CO_RED: /* set the color to red */ ! 351: GpiSetColor(hps, CLR_RED); ! 352: return 0L; ! 353: case IDM_CO_PINK: /* set the color to pink */ ! 354: GpiSetColor(hps, CLR_PINK); ! 355: return 0L; ! 356: case IDM_CO_GREEN: /* set the color to green */ ! 357: GpiSetColor(hps, CLR_GREEN); ! 358: return 0L; ! 359: case IDM_CO_CYAN: /* set the color to cyan */ ! 360: GpiSetColor(hps, CLR_CYAN); ! 361: return 0L; ! 362: case IDM_CO_YELLOW: /* set the color to yellow */ ! 363: GpiSetColor(hps, CLR_YELLOW); ! 364: return 0L; ! 365: case IDM_CO_NEUTRAL: /* set the color to neutral */ ! 366: GpiSetColor(hps, CLR_NEUTRAL); ! 367: return 0L; ! 368: case IDM_CO_DARKGRAY: /* set the color to darkgray */ ! 369: GpiSetColor(hps, CLR_DARKGRAY); ! 370: return 0L; ! 371: case IDM_CO_PALEBLUE: /* set the color to paleblue */ ! 372: GpiSetColor(hps, CLR_PALEBLUE); ! 373: return 0L; ! 374: case IDM_CO_PALERED: /* set the color to palered */ ! 375: GpiSetColor(hps, CLR_PALERED); ! 376: return 0L; ! 377: case IDM_CO_PALEPINK: /* set the color to palepink */ ! 378: GpiSetColor(hps, CLR_PALEPINK); ! 379: return 0L; ! 380: case IDM_CO_DARKGREEN: /* set the color to darkgreen */ ! 381: GpiSetColor(hps, CLR_DARKGREEN); ! 382: return 0L; ! 383: case IDM_CO_DARKCYAN: /* set the color to darkcyan */ ! 384: GpiSetColor(hps, CLR_DARKCYAN); ! 385: return 0L; ! 386: case IDM_CO_BROWN: /* set the color to brown */ ! 387: GpiSetColor(hps, CLR_BROWN); ! 388: return 0L; ! 389: case IDM_CO_PALEGRAY: /* set the color to palegray */ ! 390: GpiSetColor(hps, CLR_PALEGRAY); ! 391: return 0L; ! 392: ! 393: /* ! 394: * MIX MODE menu case statments ! 395: */ ! 396: case IDM_MM_DEFAULT: /* set the mix mode to default */ ! 397: GpiSetMix(hps, FM_DEFAULT); ! 398: return 0L; ! 399: case IDM_MM_OR: /* set the mix mode to or */ ! 400: GpiSetMix(hps, FM_OR); ! 401: return 0L; ! 402: case IDM_MM_OVERPAINT: /* set the mix mode to overpaint */ ! 403: GpiSetMix(hps, FM_OVERPAINT); ! 404: return 0L; ! 405: case IDM_MM_XOR: /* set the mix mode to xor */ ! 406: GpiSetMix(hps, FM_XOR); ! 407: return 0L; ! 408: case IDM_MM_LEAVEALONE: /* set the mix mode to leavealone */ ! 409: GpiSetMix(hps, FM_LEAVEALONE); ! 410: return 0L; ! 411: case IDM_MM_AND: /* set the mix mode to and */ ! 412: GpiSetMix(hps, FM_AND); ! 413: return 0L; ! 414: case IDM_MM_SUBTRACT: /* set the mix mode to subtract */ ! 415: GpiSetMix(hps, FM_SUBTRACT); ! 416: return 0L; ! 417: case IDM_MM_MASKSRCNOT: /* set the mixmode to masksrcnot */ ! 418: GpiSetMix(hps, FM_MASKSRCNOT); ! 419: return 0L; ! 420: case IDM_MM_ZERO: /* set the mix mode to zero */ ! 421: GpiSetMix(hps, FM_ZERO); ! 422: return 0L; ! 423: case IDM_MM_NOTMERGESRC: /* set the mix mode to notmergesrc */ ! 424: GpiSetMix(hps, FM_NOTMERGESRC); ! 425: return 0L; ! 426: case IDM_MM_NOTXORSRC: /* set the mix mode to notxorsrc */ ! 427: GpiSetMix(hps, FM_NOTXORSRC); ! 428: return 0L; ! 429: case IDM_MM_INVERT: /* set the mix mode to invert */ ! 430: GpiSetMix (hps, FM_INVERT); ! 431: return 0L; ! 432: case IDM_MM_MERGESRCNOT: /* set the mix mode to mergesrcnot ! 433: GpiSetMix (hps, FM_MERGESRCNOT); ! 434: return 0L; ! 435: case IDM_MM_NOTCOPYSRC: /* setthe mix mode to notcopysrc */ ! 436: GpiSetMix(hps, FM_NOTCOPYSRC); ! 437: return 0L; ! 438: case IDM_MM_MERGENOTSRC:/* set the mix mode to mergenotsrc */ ! 439: GpiSetMix(hps, FM_MERGENOTSRC); ! 440: return 0L; ! 441: case IDM_MM_NOTMASKSRC: /* set the mix mode to notmasksrc */ ! 442: GpiSetMix (hps, FM_NOTMASKSRC); ! 443: return 0L; ! 444: case IDM_MM_ONE: /* set the mix mode to one */ ! 445: GpiSetMix(hps, FM_ONE); ! 446: return 0L; ! 447: ! 448: /* ! 449: * SCREEN menu case statement ! 450: */ ! 451: case IDM_SC_ERASE: /* erase the screen */ ! 452: WinQueryWindowRect(hwnd, &rcl); ! 453: WinFillRect(hps, &rcl, CLR_WHITE); ! 454: return 0L; ! 455: ! 456: /* ! 457: * SEGMENT menu case statements ! 458: */ ! 459: case IDM_DR_DRAW1: /* open a segment for drawing */ ! 460: GpiSetDrawingMode(hps, ! 461: DM_DRAWANDRETAIN); ! 462: GpiOpenSegment (hps, ! 463: ++seg_num); ! 464: GpiSetSegmentAttrs (hps, seg_num, ATTR_CHAINED, ATTR_ON); ! 465: return 0L; ! 466: ! 467: case IDM_DR_SAVE: /* close a segment and save its contents */ ! 468: GpiCloseSegment (hps); ! 469: return 0L; ! 470: ! 471: ! 472: case IDM_DR_DRAW2: /* display all of the saved segments */ ! 473: if (seg_num == 1) ! 474: GpiDrawSegment(hps, seg_num); ! 475: else ! 476: GpiDrawFrom(hps, 1L, seg_num); ! 477: return 0L; ! 478: ! 479: } ! 480: return 0L; ! 481: ! 482: /* ! 483: * User pressed the leftmost mouse button ! 484: */ ! 485: case WM_BUTTON1DOWN: /*...and they're drawing or collecting points */ ! 486: if (geom_line_flag){ /* drawing wide lines */ ! 487: cur_pos.x = (LONG) LOUSHORT(mp1); /* get the x-coordinate of the current pos */ ! 488: cur_pos.y = (LONG) HIUSHORT(mp1); /* get the y-coord of the current pos */ ! 489: GpiMove (hps, &cur_pos); /* move to the current pos */ ! 490: draw_geom_line = TRUE; ! 491: } ! 492: if (collect_points){ /* collecting points */ ! 493: cur_pos.x = (LONG) LOUSHORT(mp1); /* get the x-coordinate of the current pos */ ! 494: cur_pos.y = (LONG) HIUSHORT(mp1); /* get the y-coord of the current pos */ ! 495: if (i == 0){ ! 496: point.x = cur_pos.x; point.y = cur_pos.y; ! 497: } ! 498: farray[i].x = cur_pos.x; farray[i++].y = cur_pos.y; ! 499: GpiMarker(hps, &cur_pos); ! 500: GpiSetCurrentPosition(hps, &point); ! 501: } ! 502: return TRUE; ! 503: ! 504: /* ! 505: * User is dragging the mouse ! 506: */ ! 507: case WM_MOUSEMOVE: /*...and their drawing */ ! 508: if (draw_geom_line) ! 509: { ! 510: cur_pos.x = (LONG) LOUSHORT(mp1); /* get the x-coord for the mouse */ ! 511: cur_pos.y = (LONG) HIUSHORT(mp1); /* get the y-coord for the mouse */ ! 512: DrawWideLine(hps, cur_pos); /* draw the line */ ! 513: return TRUE; ! 514: } ! 515: return FALSE; ! 516: /* ! 517: * User released the leftmost mouse button ! 518: */ ! 519: case WM_BUTTON1UP: /*...stop all drawing */ ! 520: draw_geom_line = FALSE; ! 521: return TRUE; ! 522: ! 523: ! 524: /* ! 525: * Paint the window ! 526: */ ! 527: case WM_PAINT: ! 528: hgpi = WinBeginPaint(hwnd, NULL, NULL); ! 529: GpiErase(hgpi); ! 530: WinEndPaint(hgpi); ! 531: break; ! 532: ! 533: default: ! 534: return (WinDefWindowProc(hwnd, usMessage, mp1, mp2)); ! 535: } ! 536: return (0L); ! 537: } ! 538: ! 539: /**************************************************************************** ! 540: ! 541: FUNCTION: About(HWND, USHORT, MPARAM, MPARAM) ! 542: ! 543: PURPOSE: Processes messages for "About" dialog box ! 544: ! 545: MESSAGES: ! 546: ! 547: WM_COMMAND - Input received ! 548: ! 549: COMMENTS: ! 550: ! 551: Wait for user to click on "Ok" button, then close the dialog box. ! 552: ! 553: ****************************************************************************/ ! 554: ! 555: MRESULT FAR PASCAL About(hwnd, usMessage, mp1, mp2) ! 556: HWND hwnd; ! 557: USHORT usMessage; ! 558: MPARAM mp1; ! 559: MPARAM mp2; ! 560: { ! 561: switch (usMessage) { ! 562: case WM_COMMAND: ! 563: switch (LOUSHORT(mp1)) { ! 564: case ID_OK: ! 565: WinDismissDlg(hwnd, 0); ! 566: break; ! 567: } ! 568: break; ! 569: ! 570: default: ! 571: return (WinDefDlgProc(hwnd, usMessage, mp1, mp2)); ! 572: } ! 573: return (0L); ! 574: } ! 575: ! 576: /*************************************************************************** ! 577: ! 578: FUNCTION: DrawWideLine ! 579: ! 580: PURPOSE: This function uses the coordinates of the cursor to draw ! 581: a line of specified width and color. (Note: since this is ! 582: a wide line, the drawing occurs within a path) ! 583: ! 584: ***************************************************************************/ ! 585: ! 586: DrawWideLine(hps, cur_pos) ! 587: HPS hps; ! 588: POINTL cur_pos; ! 589: { ! 590: GpiSetLineWidthGeom(hps, width); ! 591: GpiBeginPath(hps, 1L); /* start a path */ ! 592: GpiLine(hps, &cur_pos); ! 593: GpiEndPath(hps); ! 594: GpiModifyPath(hps, ! 595: 1L, ! 596: MPATH_STROKE); ! 597: GpiFillPath(hps, ! 598: 1L, ! 599: FPATH_ALTERNATE); ! 600: } ! 601: ! 602: /*************************************************************************** ! 603: ! 604: FUNCTION: ArcParam Dlg Proc ! 605: ! 606: PURPOSE: This function processes the arc parameters and scaling factor ! 607: that the user enters. ! 608: ! 609: COMMENTS: The application uses these values when it draws a full arc, ! 610: a partial arc, or, a three-point arc. ! 611: ! 612: ***************************************************************************/ ! 613: ! 614: ! 615: MRESULT FAR PASCAL ArcPDlgProc(hwnd, Msg, lParam1, lParam2) ! 616: HWND hwnd; ! 617: USHORT Msg; ! 618: MPARAM lParam1; ! 619: MPARAM lParam2; ! 620: { ! 621: switch (Msg) ! 622: { ! 623: case WM_COMMAND: ! 624: switch (LOUSHORT (lParam1)) ! 625: { ! 626: case DM_QUIT: ! 627: WinDismissDlg(hwnd, FALSE); ! 628: break; ! 629: case DM_OK: ! 630: /* ! 631: * Capture lP ! 632: */ ! 633: WinQueryDlgItemShort(hwnd, ! 634: DM_LP, ! 635: &lP, ! 636: 0); ! 637: ! 638: /* ! 639: * Capture lQ ! 640: */ ! 641: WinQueryDlgItemShort(hwnd, ! 642: DM_LQ, ! 643: &lQ, ! 644: 0); ! 645: ! 646: /* ! 647: * Capture lR ! 648: */ ! 649: WinQueryDlgItemShort(hwnd, ! 650: DM_LR, ! 651: &lR, ! 652: 0); ! 653: ! 654: /* ! 655: * Capture lS ! 656: */ ! 657: WinQueryDlgItemShort(hwnd, ! 658: DM_LS, ! 659: &lS, ! 660: 0); ! 661: arcparams.lP = (LONG)(lP); ! 662: arcparams.lQ = (LONG)(lQ); ! 663: arcparams.lR = (LONG)(lR); ! 664: arcparams.lS = (LONG)(lS); ! 665: ! 666: GpiSetArcParams(hps, &arcparams); ! 667: WinDismissDlg(hwnd, TRUE); ! 668: break; ! 669: default: ! 670: break; ! 671: } ! 672: break; ! 673: default: ! 674: return WinDefDlgProc (hwnd, Msg, lParam1, lParam2); ! 675: } ! 676: return 0L; ! 677: } ! 678: ! 679: ! 680: /*************************************************************************** ! 681: ! 682: FUNCTION: QueryLBundle ! 683: ! 684: PURPOSE: Query the line attribute structure and print attributes ! 685: in a message box ! 686: ! 687: ***************************************************************************/ ! 688: ! 689: QueryLBundle() ! 690: { ! 691: GpiQueryAttrs(hps, ! 692: PRIM_LINE, ! 693: LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | ! 694: LBB_GEOM_WIDTH | LBB_TYPE | LBB_END | ! 695: LBB_JOIN, ! 696: &pbundle); ! 697: ! 698: sprintf(str, "Color %ld Mix %d C_Width %ld G_Width %ld Type %d End %d Join %d", pbundle.lColor, pbundle.usMixMode, pbundle.fxWidth, pbundle.lGeomWidth, pbundle.usType, pbundle.usEnd, pbundle.usJoin); ! 699: ! 700: WinMessageBox(HWND_DESKTOP, ! 701: hwndClient, ! 702: str, ! 703: "Line Attributes", ! 704: 0, ! 705: MB_OK); ! 706: ! 707: } ! 708: ! 709: /*************************************************************************** ! 710: ! 711: FUNCTION: DrawAxis() ! 712: ! 713: PURPOSE: Plots a Graph that identifies origin for full arcs ! 714: ! 715: ***************************************************************************/ ! 716: ! 717: ! 718: DrawAxis(hps, pOrigin) ! 719: HPS hps; ! 720: PPOINTL pOrigin; ! 721: { ! 722: POINTL start, end; /* points for axis plotting */ ! 723: LONG color; /* old color */ ! 724: ! 725: color = GpiQueryColor(hps); ! 726: GpiSetColor (hps, CLR_BLUE); ! 727: /* plot y-axis */ ! 728: start.x = pOrigin->x; start.y = 600; ! 729: end.x = start.x; end.y = 5; ! 730: DrawLine(hps, &start, &end); ! 731: ! 732: /* plot x-axis */ ! 733: start.x = 5; start.y = pOrigin->y; ! 734: end.x = 810; end.y = start.y; ! 735: DrawLine(hps, &start, &end); ! 736: ! 737: /* plot units along x-axis */ ! 738: start.x = 300; start.y = 202; ! 739: end.x = 300; end.y = 198; ! 740: DrawLine(hps, &start, &end); ! 741: ! 742: start.x = 400; start.y = 202; ! 743: end.x = 400; end.y= 198; ! 744: DrawLine(hps, &start, &end); ! 745: ! 746: start.x = 600; start.y = 202; ! 747: end.x = 600; end.y = 198; ! 748: DrawLine(hps, &start, &end); ! 749: ! 750: start.x = 700; start.y = 202; ! 751: end.x = 700; end.y = 198; ! 752: DrawLine(hps, &start, &end); ! 753: ! 754: /* plot units along y-axis */ ! 755: start.x = 497; start.y = 400; ! 756: end.x = 502; end.y = 400; ! 757: DrawLine(hps, &start, &end); ! 758: ! 759: start.x = 497; start.y = 300; ! 760: end.x = 502; end.y = 300; ! 761: DrawLine(hps, &start, &end); ! 762: ! 763: start.x = 497; start.y = 100; ! 764: end.x = 502; end.y = 100; ! 765: DrawLine(hps, &start, &end); ! 766: ! 767: GpiSetColor(hps, color); ! 768: } ! 769: ! 770: /*************************************************************************** ! 771: ! 772: FUNCTION: DrawLine(start, end) ! 773: ! 774: PURPOSE: Draws a line from a starting point to an ending point ! 775: ! 776: ***************************************************************************/ ! 777: ! 778: DrawLine(hps, pStart, pEnd) ! 779: HPS hps; ! 780: PPOINTL pStart; ! 781: PPOINTL pEnd; ! 782: { ! 783: POINTL start, end; /* start and end points */ ! 784: start.x = pStart->x; start.y = pStart->y; ! 785: end.x = pEnd->x; end.y = pEnd->y; ! 786: GpiMove(hps, &start); ! 787: GpiLine(hps, &end); ! 788: } ! 789: MRESULT FAR PASCAL Fil_S_DlgProc(hwnd, Msg, lParam1, lParam2) ! 790: HWND hwnd; ! 791: USHORT Msg; ! 792: MPARAM lParam1; ! 793: MPARAM lParam2; ! 794: { ! 795: switch (Msg) ! 796: { ! 797: case WM_COMMAND: ! 798: switch (LOUSHORT (lParam1)) ! 799: { ! 800: case DM_QUITF: ! 801: WinDismissDlg(hwnd, FALSE); ! 802: break; ! 803: case DM_OKF: ! 804: /* ! 805: * Capture Sharpness for Fillet1 ! 806: */ ! 807: WinQueryDlgItemShort(hwnd, ! 808: DM_S1, ! 809: &lP, ! 810: 1); ! 811: ! 812: /* ! 813: * Capture Sharpness for Fillet2 ! 814: */ ! 815: WinQueryDlgItemShort(hwnd, ! 816: DM_S2, ! 817: &lQ, ! 818: 1); ! 819: ! 820: /* ! 821: * Capture Sharpness for Fillet3 ! 822: */ ! 823: WinQueryDlgItemShort(hwnd, ! 824: DM_S3, ! 825: &lR, ! 826: 1); ! 827: ! 828: /* ! 829: * Capture Sharpness for Fillet4 ! 830: */ ! 831: WinQueryDlgItemShort(hwnd, ! 832: DM_S4, ! 833: &lS, ! 834: 1); ! 835: larray[0] = (LONG)(65536 * lP); ! 836: larray[1] = (LONG)(65536 * lQ); ! 837: larray[2] = (LONG)(65536 * lR); ! 838: larray[3] = (LONG)(65536 * lS); ! 839: ! 840: WinDismissDlg(hwnd, TRUE); ! 841: break; ! 842: default: ! 843: break; ! 844: } ! 845: break; ! 846: default: ! 847: return WinDefDlgProc (hwnd, Msg, lParam1, lParam2); ! 848: } ! 849: return 0L; ! 850: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.