|
|
1.1 root 1: #include "jigsaw.h"
2: #include "globals.h"
3: #include <stdlib.h>
4: #include <stdio.h>
5: #include <string.h>
6:
7: /******************************************************************************/
8: /* */
9: /* Create a memory DC and an associated PS. */
10: /* */
11: /******************************************************************************/
12: BOOL CreateBitmapHdcHps( phdc, phps)
13: PHDC phdc;
14: PHPS phps;
15: {
16: SIZEL sizl;
17: HDC hdc;
18: HPS hps;
19:
20: hdc = DevOpenDC( habMain, OD_MEMORY, "*", 3L, (PDEVOPENDATA)&dop, NULL);
21: if( !hdc)
22: return( FALSE);
23:
24: sizl.cx = sizl.cy = 1L;
25: hps = GpiCreatePS( habMain
26: , hdc
27: , &sizl
28: , PU_PELS | GPIA_ASSOC | GPIT_MICRO );
29: if( !hps)
30: return( FALSE);
31:
32: *phdc = hdc;
33: *phps = hps;
34: return( TRUE);
35: }
36:
37: /*****************************************************************************/
38: /* */
39: /* Add (at head or tail) or delete a specified segment list member. */
40: /* */
41: /******************************************************************************/
42: PSEGLIST SegListUpdate( usOperation, pslUpdate)
43: USHORT usOperation;
44: PSEGLIST pslUpdate;
45: {
46: PSEGLIST psl;
47:
48: switch( usOperation)
49: {
50: case ADD_HEAD_SEG:
51: if( pslHead == NULL)
52: {
53: DosAllocMem( &pslHead, sizeof( SEGLIST), PAG_READ | PAG_WRITE | PAG_COMMIT);
54: if( pslHead == NULL)
55: return( NULL);
56: *pslHead = *pslUpdate;
57: pslHead->pslPrev = NULL;
58: pslHead->pslNext = NULL;
59: pslTail = pslHead;
60: } else
61: {
62: DosAllocMem( &psl, sizeof( SEGLIST), PAG_READ | PAG_WRITE | PAG_COMMIT);
63: if( psl == NULL)
64: return( NULL);
65: *psl = *pslUpdate;
66: pslHead->pslPrev = psl;
67: psl->pslNext = pslHead;
68: psl->pslPrev = NULL;
69: pslHead = psl;
70: }
71: return( pslHead);
72: break;
73:
74: case ADD_TAIL_SEG:
75: if( pslTail == NULL)
76: {
77: DosAllocMem( &pslHead, sizeof( SEGLIST), PAG_READ | PAG_WRITE |
78: PAG_COMMIT);
79: if( pslHead == NULL)
80: return( NULL);
81: *pslHead = *pslUpdate;
82: pslHead->pslPrev = NULL;
83: pslHead->pslNext = NULL;
84: pslTail = pslHead;
85: } else
86: {
87: DosAllocMem( &psl, sizeof( SEGLIST), PAG_READ | PAG_WRITE |
88: PAG_COMMIT);
89: if( psl == NULL)
90: return( NULL);
91: *psl = *pslUpdate;
92: pslTail->pslNext = psl;
93: psl->pslPrev = pslTail;
94: psl->pslNext = NULL;
95: pslTail = psl;
96: }
97: return( pslTail);
98: break;
99:
100: case MAKE_TAIL_SEG:
101: if( pslUpdate == pslTail)
102: return( pslTail);
103: if( pslUpdate == pslHead)
104: {
105: pslHead = pslHead->pslNext;
106: pslHead->pslPrev = NULL;
107: } else
108: {
109: pslUpdate->pslPrev->pslNext = pslUpdate->pslNext;
110: pslUpdate->pslNext->pslPrev = pslUpdate->pslPrev;
111: }
112: pslTail->pslNext = pslUpdate;
113: pslUpdate->pslPrev = pslTail;
114: pslTail = pslUpdate;
115: pslTail->pslNext = NULL;
116: return( pslTail);
117: break;
118:
119: case MAKE_HEAD_SEG:
120: if( pslUpdate == pslHead)
121: return( pslHead);
122: if( pslUpdate == pslTail)
123: {
124: pslTail = pslTail->pslPrev;
125: pslTail->pslNext = NULL;
126: } else
127: {
128: pslUpdate->pslPrev->pslNext = pslUpdate->pslNext;
129: pslUpdate->pslNext->pslPrev = pslUpdate->pslPrev;
130: }
131: pslHead->pslPrev = pslUpdate;
132: pslUpdate->pslNext = pslHead;
133: pslHead = pslUpdate;
134: pslHead->pslPrev = NULL;
135: return( pslHead);
136: break;
137:
138: case DEL_SEG:
139: for( psl = pslHead; psl != NULL; psl = psl->pslNext)
140: {
141: if( psl->lSegId == pslUpdate->lSegId)
142: {
143: if( psl == pslHead)
144: {
145: pslHead = psl->pslNext;
146: if( pslHead == NULL)
147: pslTail = NULL;
148: else
149: pslHead->pslPrev = NULL;
150: }else if( psl == pslTail)
151: {
152: pslTail = psl->pslPrev;
153: pslTail->pslNext = NULL;
154: } else
155: {
156: (psl->pslPrev)->pslNext = psl->pslNext;
157: (psl->pslNext)->pslPrev = psl->pslPrev;
158: }
159: DosFreeMem( psl);
160: return( psl);
161: break;
162: }
163: }
164: return( NULL);
165: break;
166:
167: default:
168: return( NULL);
169: }
170: }
171:
172: /******************************************************************************/
173: /* */
174: /* set the default viewing transform */
175: /* */
176: /******************************************************************************/
177: VOID SetDVTransform( fx11, fx12, fx21, fx22, l31, l32, lType)
178: FIXED fx11;
179: FIXED fx12;
180: FIXED fx21;
181: FIXED fx22;
182: FIXED l31;
183: FIXED l32;
184: FIXED lType;
185: {
186: MATRIXLF matlf;
187:
188: matlf.fxM11 = fx11;
189: matlf.fxM12 = fx12;
190: matlf.lM13 = 0L;
191: matlf.fxM21 = fx21;
192: matlf.fxM22 = fx22;
193: matlf.lM23 = 0L;
194: matlf.lM31 = l31;
195: matlf.lM32 = l32;
196: matlf.lM33 = 1L;
197: GpiSetDefaultViewMatrix( hpsClient, 9L, &matlf, lType);
198: }
199:
200: /******************************************************************************/
201: /* */
202: /* Determine the bounding rect of a segment. */
203: /* */
204: /* Use special knowledge that the only non-identity part of the segment */
205: /* transform is the translation part. */
206: /******************************************************************************/
207: VOID SetRect( psl)
208: PSEGLIST psl;
209: {
210: psl->rclCurrent = psl->rclBitBlt; /* world space bounding rect */
211: psl->rclCurrent.xLeft += psl->ptlModelXlate.x;
212: psl->rclCurrent.yBottom += psl->ptlModelXlate.y;
213: psl->rclCurrent.xRight += psl->ptlModelXlate.x;
214: psl->rclCurrent.yTop += psl->ptlModelXlate.y;
215: }
216:
217: /******************************************************************************/
218: /* */
219: /* Return a pointer to a segment list member, based on segment id. */
220: /* */
221: /******************************************************************************/
222: PSEGLIST SegListGet( lSeg)
223: LONG lSeg;
224: {
225: PSEGLIST psl;
226:
227: for( psl = pslHead; psl != NULL; psl = psl->pslNext)
228: if( psl->lSegId == lSeg)
229: return( psl);
230: return( NULL);
231: }
232:
233: /******************************************************************************/
234: /* */
235: /* Draw one piece. */
236: /* */
237: /******************************************************************************/
238: VOID DrawPiece( hps, psl, fFill)
239: HPS hps;
240: PSEGLIST psl;
241: BOOL fFill;
242: {
243: POINTL aptl[4];
244:
245: if( psl->fVisible)
246: {
247: aptl[2].x = aptl[2].y = 0L;
248: aptl[3] = psl->aptlBitBlt[3];
249: aptl[0].x = psl->rclBitBlt.xLeft + psl->ptlModelXlate.x;
250: aptl[0].y = psl->rclBitBlt.yBottom + psl->ptlModelXlate.y;
251: GpiConvert( hpsClient, CVTC_MODEL, CVTC_DEVICE, 1L, aptl);
252: aptl[1].x = aptl[0].x + aptl[3].x;
253: aptl[1].y = aptl[0].y + aptl[3].y;
254: GpiBitBlt( hps /* punch a hole */
255: , psl->hpsHole
256: , 4L
257: , aptl
258: , ROP_SRCAND
259: , BBO_IGNORE );
260: if( fFill)
261: GpiBitBlt( hps /* fill the hole */
262: , psl->hpsFill
263: , 4L
264: , aptl
265: , ROP_SRCPAINT
266: , BBO_IGNORE );
267: }
268: }
269:
270: /******************************************************************************/
271: /* */
272: /* Draw the picture, using the passed region for clipping. */
273: /* Intersect the bounding box used for the clip region with the client rect. */
274: /* Test each segment to see if its bounding box intersects the bounding box */
275: /* of the clipping region. Draw only if there is an intersection. */
276: /* */
277: /******************************************************************************/
278: BOOL DoDraw( hps, hrgn, fPaint)
279: HPS hps;
280: HRGN hrgn;
281: BOOL fPaint;
282: {
283: HRGN hrgnOld;
284: RECTL rcl, rclRegion, rclDst, rclClient;
285: PSEGLIST psl;
286: ULONG ulPostCt;
287:
288: if( fPaint)
289: {
290: GpiSetColor( hps, CLR_BACKGROUND);
291: GpiPaintRegion( hps, hrgn); /* erase region */
292: }
293: GpiQueryRegionBox( hps, hrgn, &rclRegion);
294: WinQueryWindowRect( hwndClient, &rclClient);
295: if( !WinIntersectRect( habAsync, &rclRegion, &rclRegion, &rclClient))
296: return( FALSE); /* not in client window */
297: GpiSetClipRegion( hps, hrgn, &hrgnOld); /* make the clip region */
298: for( psl = pslHead; psl != NULL; psl = psl->pslNext) /* scan all pieces */
299: {
300: /**************************************************************************/
301: /* get the piece bounding box in device coordinates */
302: /**************************************************************************/
303: rcl = psl->rclCurrent;
304: GpiConvert( hpsClient, CVTC_MODEL, CVTC_DEVICE, 2L, (PPOINTL)&rcl);
305: rcl.xRight++;
306: rcl.yTop++;
307: /**************************************************************************/
308: /* if the piece might be visible, and drawing allowed, draw the piece */
309: /**************************************************************************/
310: if( WinIntersectRect( habAsync, &rclDst, &rcl, &rclRegion))
311: DosQueryEventSem( hevDrawOn, &ulPostCt);
312: if( ulPostCt)
313: DrawPiece( hps, psl, TRUE);
314: else
315: break;
316: }
317: GpiSetClipRegion( hps, NULL, &hrgnOld);
318: DosQueryEventSem( hevDrawOn, &ulPostCt);
319: if( ulPostCt)
320: GpiSetRegion( hpsClient, hrgnInvalid, 0L, NULL);
321:
322: return( TRUE);
323: }
324:
325: /******************************************************************************/
326: /* */
327: /* get bounding rect of whole picture in model coordinates */
328: /* */
329: /******************************************************************************/
330: VOID CalcBounds(VOID)
331: {
332: PSEGLIST psl;
333: RECTL rclOld;
334: ULONG ulPostKillDraw, ulPostCt;
335:
336: if( !pslHead)
337: return;
338: rclBounds = rclOld = pslHead->rclCurrent;
339:
340: /*
341: * get start killdraw post count
342: */
343: DosQueryEventSem(hevKillDraw, &ulPostKillDraw);
344:
345: for( psl = pslHead->pslNext; psl != NULL; psl = psl->pslNext) {
346: DosQueryEventSem(hevKillDraw, &ulPostCt);
347: if (ulPostKillDraw != ulPostCt) {
348: rclBounds = rclOld;
349: return;
350: }
351: WinUnionRect(habAsync, &rclBounds, &rclBounds, &(psl->rclCurrent));
352: }
353: }
354:
355: /******************************************************************************/
356: /* */
357: /* Calculate and set the default viewing transform based on zoom and scroll */
358: /* */
359: /******************************************************************************/
360: VOID CalcTransform( hwnd)
361: HWND hwnd;
362: {
363: RECTL rclClient;
364: POINTL ptlCenter, ptlTrans, ptlScale, aptl[4], ptlOrg, aptlSides[12];
365: PSEGLIST psl;
366: LONG l;
367: MATRIXLF matlf;
368: ULONG ulPostCt, ulPostKillDraw;
369:
370:
371: /*
372: * get start killdraw post count
373: */
374: DosQueryEventSem(hevKillDraw, &ulPostKillDraw);
375:
376:
377: /****************************************************************************/
378: /* from bounding rect of picture get center of picture */
379: /****************************************************************************/
380: ptlCenter.x = (rclBounds.xLeft + rclBounds.xRight) / 2;
381: ptlCenter.y = (rclBounds.yBottom + rclBounds.yTop ) / 2;
382:
383: /****************************************************************************/
384: /* translate center of picture to origin */
385: /****************************************************************************/
386: SetDVTransform( (FIXED)UNITY
387: , (FIXED)0
388: , (FIXED)0
389: , (FIXED)UNITY
390: , -ptlCenter.x
391: , -ptlCenter.y
392: , TRANSFORM_REPLACE);
393:
394: /****************************************************************************/
395: /* scale down to 1:1 of bitmap in file */
396: /****************************************************************************/
397: ptlScale.x = UNITY * ADJUSTED_PBMP(pbmp2BitmapFile)->cx
398: / (ptlTopRight.x - ptlBotLeft.x);
399: ptlScale.y = UNITY * ADJUSTED_PBMP(pbmp2BitmapFile)->cy
400: / (ptlTopRight.y - ptlBotLeft.y);
401:
402: /****************************************************************************/
403: /* add in zoom scale */
404: /****************************************************************************/
405: ptlScale.x += ptlScale.x * lScale / (ZOOM_MAX + 1);
406: ptlScale.y += ptlScale.y * lScale / (ZOOM_MAX + 1);
407:
408: SetDVTransform( (FIXED)ptlScale.x
409: , (FIXED)0
410: , (FIXED)0
411: , (FIXED)ptlScale.y
412: , 0L
413: , 0L
414: , TRANSFORM_ADD);
415:
416: /****************************************************************************/
417: /* translate center of picture to center of client window */
418: /****************************************************************************/
419: WinQueryWindowRect( hwnd, &rclClient);
420: ptlTrans.x = (rclClient.xRight - rclClient.xLeft) / 2;
421: ptlTrans.y = (rclClient.yTop - rclClient.yBottom) / 2;
422:
423: /****************************************************************************/
424: /* add in horizontal and vertical scrolling factors */
425: /****************************************************************************/
426: ptlTrans.x -= ptsScrollPos.x - ptsHalfScrollMax.x;
427: ptlTrans.y += ptsScrollPos.y - ptsHalfScrollMax.y;
428: SetDVTransform( (FIXED)UNITY
429: , (FIXED)0
430: , (FIXED)0
431: , (FIXED)UNITY
432: , ptlTrans.x
433: , ptlTrans.y
434: , TRANSFORM_ADD);
435:
436: GpiQueryDefaultViewMatrix( hpsClient, 9L, &matlf);
437: GpiSetDefaultViewMatrix( hpsClient, 9L, &matlf, TRANSFORM_REPLACE);
438:
439: /****************************************************************************/
440: /* create bitmaps for pieces */
441: /****************************************************************************/
442:
443: ptlOffset = ptlBotLeft; /* BottomLeft corner in dev coord */
444: GpiConvert( hpsClient, CVTC_WORLD, CVTC_DEVICE, 1L, &ptlOffset);
445: if( (ptlScale.x != ptlScaleRef.x) || (ptlScale.y != ptlScaleRef.y))
446: {
447: ptlScaleRef = ptlScale;
448:
449: /**************************************************************************/
450: /* create a shadow bitmap of the original, sized to current output size */
451: /**************************************************************************/
452: aptl[0] = ptlBotLeft; /* current output rect, dev coord */
453: aptl[1] = ptlTopRight;
454: GpiConvert( hpsClient, CVTC_WORLD, CVTC_DEVICE, 2L, aptl);
455:
456: aptl[0].x -= ptlOffset.x; /* put bottom left at (0,0) */
457: aptl[0].y -= ptlOffset.y;
458: aptl[1].x -= ptlOffset.x;
459: aptl[1].y -= ptlOffset.y;
460: #ifdef fred
461: aptl[1].x -= ptlOffset.x - 1; /* correct for coordinate convert */
462: aptl[1].y -= ptlOffset.y - 1;
463: #endif
464: aptl[2].x = 0L;
465: aptl[2].y = 0L;
466: aptl[3].x = ADJUSTED_PBMP(pbmp2BitmapFile)->cx; /* bitmap dimensions */
467: aptl[3].y = ADJUSTED_PBMP(pbmp2BitmapFile)->cy;
468: GpiSetBitmap( hpsBitmapSize, hbmBitmapSize);
469: GpiBitBlt( hpsBitmapSize /* copy the bitmap */
470: , hpsBitmapFile
471: , 4L
472: , aptl
473: , ROP_SRCCOPY
474: , BBO_IGNORE);
475:
476: for( psl = pslHead; psl != NULL; psl = psl->pslNext)
477: {
478: DosQueryEventSem( hevTerminate, &ulPostCt);
479: if( ulPostCt) /* exit if quit */
480: break;
481:
482: DosQueryEventSem( hevKillDraw, &ulPostCt);
483: if( ulPostCt != ulPostKillDraw) {
484: break;
485: }
486:
487: aptl[0].x = psl->rclBitBlt.xLeft; /* bounding rect in world space */
488: aptl[0].y = psl->rclBitBlt.yBottom;
489: aptl[1].x = psl->rclBitBlt.xRight;
490: aptl[1].y = psl->rclBitBlt.yTop;
491: aptl[2] = aptl[0];
492: aptl[3] = aptl[1];
493: GpiConvert( hpsClient, CVTC_WORLD, CVTC_DEVICE, 2L, &aptl[2]);
494: ptlOrg = aptl[2];
495: aptl[3].x -= ptlOrg.x - 1; /* bitmap rect of piece */
496: aptl[3].y -= ptlOrg.y - 1;
497: aptl[2].x = 0L;
498: aptl[2].y = 0L;
499: psl->aptlBitBlt[0] = aptl[0];
500: psl->aptlBitBlt[1] = aptl[1];
501: psl->aptlBitBlt[2] = aptl[2];
502: psl->aptlBitBlt[3] = aptl[3];
503:
504: /************************************************************************/
505: /* compute the piece control points */
506: /************************************************************************/
507: for ( l = 0; l < 12; l++)
508: aptlSides[l] = psl->aptlSides[l];
509: GpiConvert( hpsClient, CVTC_WORLD, CVTC_DEVICE, 12L, aptlSides);
510: for ( l = 0; l < 12; l++)
511: {
512: aptlSides[l].x -= ptlOrg.x;
513: aptlSides[l].y -= ptlOrg.y;
514: }
515:
516: /************************************************************************/
517: /* prepare the mask to punch a hole in the output bitmap */
518: /************************************************************************/
519: GpiSetClipPath( psl->hpsHole, 0L, SCP_RESET); /* no clip path */
520: GpiBitBlt( psl->hpsHole /* fill with 1's */
521: , NULL
522: , 2L
523: , &psl->aptlBitBlt[2]
524: , ROP_ONE
525: , BBO_IGNORE);
526:
527: GpiBeginPath( psl->hpsHole, 1L); /* define a clip path */
528: GpiMove( psl->hpsHole, &aptlSides[11]);
529: GpiPolySpline( psl->hpsHole, 12L, aptlSides);
530: GpiEndPath( psl->hpsHole);
531: GpiSetClipPath( psl->hpsHole, 1L, SCP_AND);
532: GpiBitBlt( psl->hpsHole /* fill with 0's */
533: , NULL
534: , 2L
535: , &psl->aptlBitBlt[2]
536: , ROP_ZERO
537: , BBO_IGNORE);
538: GpiSetClipPath( psl->hpsHole, 0L, SCP_RESET); /* clear the clip path */
539:
540: /************************************************************************/
541: /* prepare the mask to fill the hole in the output bitmap */
542: /************************************************************************/
543: aptl[0] = psl->aptlBitBlt[2];
544: aptl[1] = psl->aptlBitBlt[3];
545: aptl[2] = aptl[0];
546: GpiBitBlt( psl->hpsFill /* make inverse of hole */
547: , psl->hpsHole
548: , 3L
549: , aptl
550: , ROP_NOTSRCCOPY
551: , BBO_IGNORE);
552:
553: aptl[0] = psl->aptlBitBlt[2];
554: aptl[1] = psl->aptlBitBlt[3];
555: aptl[2].x = ptlOrg.x - ptlOffset.x; /* pick the right part */
556: aptl[2].y = ptlOrg.y - ptlOffset.y; /* of the sized bitmap */
557: GpiBitBlt( psl->hpsFill /* fill with data */
558: , hpsBitmapSize
559: , 3L
560: , aptl
561: , ROP_SRCAND
562: , BBO_IGNORE);
563: GpiSetClipPath( psl->hpsFill, 0L, SCP_RESET); /* clear the clip path */
564:
565: GpiSetColor( psl->hpsFill, CLR_RED); /* draw the outline */
566: GpiMove( psl->hpsFill, &aptlSides[11]);
567: GpiPolySpline( psl->hpsFill, 12L, aptlSides);
568: DrawPiece( hpsClient, psl, TRUE);
569: }
570: }
571: }
572:
573: /******************************************************************************/
574: /* */
575: /* Redraw the entire client window. */
576: /* */
577: /******************************************************************************/
578: VOID Redraw(VOID)
579: {
580: RECTL rclInvalid;
581: HRGN hrgnUpdt;
582: POINTL aptlUpdtNew[3];
583:
584: WinQueryWindowRect( hwndClient, &rclInvalid);
585: hrgnUpdt = GpiCreateRegion( hpsBitmapBuff, 1L, &rclInvalid);
586: DoDraw( hpsBitmapBuff, hrgnUpdt, TRUE);
587: GpiDestroyRegion( hpsBitmapBuff, hrgnUpdt);
588: aptlUpdtNew[0].x = rclInvalid.xLeft;
589: aptlUpdtNew[0].y = rclInvalid.yBottom;
590: aptlUpdtNew[1].x = rclInvalid.xRight;
591: aptlUpdtNew[1].y = rclInvalid.yTop;
592: ROUND_DOWN_MOD( aptlUpdtNew[0].x, lByteAlignX); /* round down */
593: ROUND_DOWN_MOD( aptlUpdtNew[0].y, lByteAlignY); /* round down */
594: ROUND_UP_MOD( aptlUpdtNew[1].x, lByteAlignX); /* round up */
595: ROUND_UP_MOD( aptlUpdtNew[1].y, lByteAlignY); /* round up */
596: aptlUpdtNew[2] = aptlUpdtNew[0];
597: GpiBitBlt( hpsClient
598: , hpsBitmapBuff
599: , 3L
600: , aptlUpdtNew
601: , ROP_SRCCOPY
602: , BBO_IGNORE );
603: }
604:
605: /******************************************************************************/
606: /* perform bitmap-based correlation */
607: /******************************************************************************/
608: PSEGLIST Correlate( pptl)
609: PPOINTL pptl;
610: {
611: PSEGLIST psl;
612: POINTL aptl[2];
613: LONG lColor;
614: RECTL rcl;
615:
616:
617: aptl[0] = aptl[1] = *pptl;
618: aptl[1].x++;
619: aptl[1].y++;
620: GpiBitBlt( hpsBitmapSave, NULL, 2L, aptl, ROP_ONE, BBO_IGNORE);
621: lColor = GpiQueryPel( hpsBitmapSave, pptl);
622: for( psl = pslTail; psl != NULL; psl = psl->pslPrev)
623: {
624: rcl = psl->rclCurrent;
625: GpiConvert( hpsClient, CVTC_MODEL, CVTC_DEVICE, 2L, (PPOINTL)&rcl);
626: rcl.xRight++;
627: rcl.yTop++;
628: if( WinPtInRect( habAsync, &rcl, pptl)) /* is point in bounding box? */
629: {
630: DrawPiece( hpsBitmapSave, psl, FALSE);
631: if( GpiQueryPel( hpsBitmapSave, pptl) != lColor)
632: break; /* got a hit */
633: }
634: }
635: return( psl);
636: }
637:
638: /******************************************************************************/
639: /* */
640: /* MyMessageBox */
641: /* */
642: /* Displays a message box with the given string. To simplify matters, */
643: /* the box will always have the same title ("Jigsaw"), will always */
644: /* have a single button ("Ok"), will always have an exclamation point */
645: /* icon, and will always be application modal. */
646: /* */
647: /******************************************************************************/
648: VOID MyMessageBox( hWnd, psz)
649: HWND hWnd;
650: PSZ psz;
651: {
652: WinMessageBox( HWND_DESKTOP
653: , hWnd
654: , psz
655: , szTitle
656: , NULL
657: , MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL );
658: }
659:
660: /******************************************************************************/
661: /* */
662: /* mark a whole island */
663: /* */
664: /******************************************************************************/
665: VOID MarkIsland( pslMark, fMark)
666: PSEGLIST pslMark;
667: BOOL fMark;
668: {
669: PSEGLIST psl;
670: BOOL fFirst;
671:
672: for( psl = pslMark, fFirst = TRUE
673: ; (psl != pslMark) || fFirst
674: ; psl = psl->pslNextIsland, fFirst = FALSE )
675: psl->fIslandMark = fMark; /* mark as island member */
676: }
677:
678:
679: /******************************************************************************/
680: /* Display Zoom factor */
681: /******************************************************************************/
682: VOID DisplayZoomFactor( lScaleFactor)
683: LONG lScaleFactor;
684: {
685:
686: sprintf(szZoomFact, "1:%d", -lScaleFactor + 1);
687: WinSetDlgItemText(hwndStatus, SID_ZOOMFACT, szZoomFact);
688: WinSendMsg(hwndZoomScrollBar, SBM_SETPOS,
689: MPFROMSHORT((USHORT) -lScaleFactor), 0L);
690:
691: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.