|
|
1.1 ! root 1: /* ! 2: appdoc.c - MDI application ! 3: Created by Microsoft Corporation, 1989 ! 4: */ ! 5: #define INCL_WINSYS ! 6: #define INCL_WINCOMMON ! 7: #define INCL_WINMESSAGEMGR ! 8: #define INCL_WINFRAMEMGR ! 9: #define INCL_WINPOINTERS ! 10: #define INCL_WINMENUS ! 11: #define INCL_WINWINDOWMGR ! 12: #define INCL_WINACCELERATORS ! 13: #define INCL_WININPUT ! 14: #define INCL_WINHEAP ! 15: #define INCL_WINSCROLLBARS ! 16: #define INCL_WINRECTANGLES ! 17: #define INCL_WINCOUNTRY ! 18: #define INCL_GPIPRIMITIVES ! 19: #define INCL_GPILOGCOLORTABLE ! 20: ! 21: #include <os2.h> ! 22: #include <string.h> ! 23: #include <stdlib.h> ! 24: #include <stdio.h> ! 25: #include "app.h" ! 26: #include "appdata.h" ! 27: #include "mdi.h" ! 28: #include "mdidata.h" ! 29: ! 30: /* Function prototypes */ ! 31: VOID AppHScroll(HWND hwnd, MPARAM mp1, MPARAM mp2); ! 32: VOID AppVScroll(HWND hwnd, MPARAM mp1, MPARAM mp2); ! 33: VOID AppEraseBackground(HWND hwnd, HPS hps); ! 34: VOID AppPaint(HWND hwnd); ! 35: VOID MDIClose(HWND hwndClient); ! 36: BOOL MDICreate(HWND); ! 37: BOOL MDIDestroy(HWND); ! 38: BOOL MDIActivate(HWND, BOOL); ! 39: ! 40: /* ! 41: * The array of RGB values for the rounded ! 42: * rectangles. ! 43: */ ! 44: LONG aclrRGB[16] = { ! 45: RGB_RED, RGB_WHITE, RGB_GREEN, RGB_BLACK, ! 46: RGB_BLUE, RGB_WHITE, RGB_YELLOW, RGB_BLACK, ! 47: RGB_CYAN, RGB_BLACK, RGB_PINK, RGB_BLACK, ! 48: RGB_WHITE, RGB_PINK, RGB_BLACK, RGB_RED ! 49: }; ! 50: ! 51: ! 52: MRESULT CALLBACK DocWndProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) ! 53: { ! 54: ! 55: switch (msg) { ! 56: ! 57: case WM_CREATE: ! 58: if (MDICreate(hwnd) == FALSE) ! 59: return (TRUE); ! 60: break; ! 61: ! 62: case WM_DESTROY: ! 63: MDIDestroy(hwnd); ! 64: break; ! 65: ! 66: case WM_CLOSE: ! 67: MDIClose(hwnd); ! 68: break; ! 69: ! 70: case WM_HSCROLL: ! 71: AppHScroll(hwnd, mp1, mp2); ! 72: break; ! 73: ! 74: case WM_VSCROLL: ! 75: AppVScroll(hwnd, mp1, mp2); ! 76: break; ! 77: ! 78: case WM_ERASEBACKGROUND: ! 79: AppEraseBackground(hwnd, (HPS)mp1); ! 80: break; ! 81: ! 82: case WM_PAINT: ! 83: AppPaint(hwnd); ! 84: break; ! 85: ! 86: case WM_ACTIVATE: ! 87: MDIActivate(hwnd, (BOOL)SHORT1FROMMP(mp1)); ! 88: break; ! 89: ! 90: default: ! 91: return(WinDefWindowProc(hwnd, msg, mp1, mp2)); ! 92: break; ! 93: } ! 94: ! 95: return (0L); ! 96: } ! 97: ! 98: ! 99: VOID AppEraseBackground(HWND hwnd, HPS hps) ! 100: { ! 101: RECTL rclPaint; ! 102: HWND hwndFrame, hwndClient; ! 103: register NPDOC npdoc; ! 104: ! 105: npdoc = NPDOCFROMCLIENT(hwnd); ! 106: hwndFrame = WinQueryWindow(hwnd, QW_PARENT, FALSE); ! 107: ! 108: /* ! 109: * We know the main client is around so ! 110: * go ahead and erase it. ! 111: */ ! 112: WinQueryWindowRect(hwnd, &rclPaint); ! 113: WinMapWindowPoints(hwnd, hwndFrame, (PPOINTL)&rclPaint, 2); ! 114: WinFillRect(hps, &rclPaint, npdoc->clrBackground); ! 115: ! 116: /* ! 117: * Now check to see which of the other client windows ! 118: * are around and erase them. ! 119: * ! 120: * We do all this to avoid erasing the splitbars. ! 121: */ ! 122: if (npdoc->fs & DF_SPLITVERT) { ! 123: ! 124: hwndClient = WinWindowFromID(hwndFrame, ID_CLIENT2); ! 125: /* ! 126: * If it became invisible due to the frame ! 127: * window getting too small, then don't ! 128: * bother drawing. ! 129: */ ! 130: if (WinIsWindowVisible(hwndClient) != FALSE) { ! 131: WinQueryWindowRect(hwndClient, &rclPaint); ! 132: WinMapWindowPoints(hwndClient, hwndFrame, ! 133: (PPOINTL)&rclPaint, 2); ! 134: WinFillRect(hps, &rclPaint, npdoc->clrBackground); ! 135: } ! 136: } ! 137: ! 138: if (npdoc->fs & DF_SPLITHORZ) { ! 139: ! 140: hwndClient = WinWindowFromID(hwndFrame, ID_CLIENT3); ! 141: if (WinIsWindowVisible(hwndClient) != FALSE) { ! 142: WinQueryWindowRect(hwndClient, &rclPaint); ! 143: WinMapWindowPoints(hwndClient, hwndFrame, ! 144: (PPOINTL)&rclPaint, 2); ! 145: WinFillRect(hps, &rclPaint, npdoc->clrBackground); ! 146: } ! 147: } ! 148: ! 149: /* ! 150: * If we're split in both directions, then there's ! 151: * a ID_CLIENT4 window. ! 152: */ ! 153: if ((npdoc->fs & (DF_SPLITHORZ | DF_SPLITVERT)) == ! 154: (DF_SPLITHORZ | DF_SPLITVERT)) { ! 155: ! 156: hwndClient = WinWindowFromID(hwndFrame, ID_CLIENT4); ! 157: if (WinIsWindowVisible(hwndClient) != FALSE) { ! 158: WinQueryWindowRect(hwndClient, &rclPaint); ! 159: WinMapWindowPoints(hwndClient, hwndFrame, ! 160: (PPOINTL)&rclPaint, 2); ! 161: WinFillRect(hps, &rclPaint, npdoc->clrBackground); ! 162: } ! 163: } ! 164: } ! 165: ! 166: ! 167: VOID AppHScroll(HWND hwnd, MPARAM mp1, MPARAM mp2) ! 168: { ! 169: HWND hwndFrame; ! 170: NPDOC npdoc; ! 171: RECTL rclPaintBottom, rclPaintTop; ! 172: RECTL rclWindowBottom, rclWindowTop; ! 173: HWND hwndClientBottom, hwndClientTop; ! 174: HWND hwndScrollbar; ! 175: register NPVIEW npviewBottom, npviewTop; ! 176: SHORT posSlider, xOriginOld; ! 177: USHORT cmd, idScrollbar; ! 178: ! 179: hwndFrame = WinQueryWindow(hwnd, QW_PARENT, FALSE); ! 180: npdoc = NPDOCFROMCLIENT(hwnd); ! 181: ! 182: idScrollbar = SHORT1FROMMP(mp1); ! 183: ! 184: switch (idScrollbar) { ! 185: ! 186: case FID_HORZSCROLL: ! 187: hwndClientTop = hwnd; ! 188: if (npdoc->fs & DF_SPLITHORZ) { ! 189: hwndClientBottom = WinWindowFromID(hwndFrame, ID_CLIENT3); ! 190: } else { ! 191: hwndClientBottom = NULL; ! 192: } ! 193: break; ! 194: ! 195: case ID_HORZSCROLL2: ! 196: hwndClientTop = WinWindowFromID(hwndFrame, ID_CLIENT2); ! 197: if (npdoc->fs & DF_SPLITHORZ) { ! 198: hwndClientBottom = WinWindowFromID(hwndFrame, ID_CLIENT4); ! 199: } else { ! 200: hwndClientBottom = NULL; ! 201: } ! 202: break; ! 203: } ! 204: ! 205: hwndScrollbar = WinWindowFromID(hwndFrame, idScrollbar); ! 206: ! 207: npviewTop = NPVIEWFROMCLIENT(hwndClientTop); ! 208: WinQueryWindowRect(hwndClientTop, &rclWindowTop); ! 209: ! 210: if (hwndClientBottom != NULL) { ! 211: npviewBottom = NPVIEWFROMCLIENT(hwndClientBottom); ! 212: WinQueryWindowRect(hwndClientBottom, &rclWindowBottom); ! 213: } ! 214: ! 215: posSlider = (SHORT)WinSendMsg(hwndScrollbar, SBM_QUERYPOS, NULL, NULL); ! 216: ! 217: cmd = SHORT2FROMMP(mp2); ! 218: switch (cmd) { ! 219: ! 220: case SB_LINELEFT: ! 221: posSlider -= 16; ! 222: break; ! 223: ! 224: case SB_LINERIGHT: ! 225: posSlider += 16; ! 226: break; ! 227: ! 228: case SB_PAGELEFT: ! 229: posSlider -= ((SHORT)rclWindowTop.xRight - 16); ! 230: break; ! 231: ! 232: case SB_PAGERIGHT: ! 233: posSlider += ((SHORT)rclWindowTop.xRight - 16); ! 234: break; ! 235: ! 236: case SB_SLIDERPOSITION: ! 237: posSlider = SHORT1FROMMP(mp2); ! 238: break; ! 239: } ! 240: ! 241: WinSendMsg(hwndScrollbar, SBM_SETPOS, MPFROMSHORT(posSlider), NULL); ! 242: ! 243: xOriginOld = npviewTop->xOrigin; ! 244: npviewTop->xOrigin = (SHORT)WinSendMsg(hwndScrollbar, SBM_QUERYPOS, NULL, NULL); ! 245: WinScrollWindow(hwndClientTop, xOriginOld - npviewTop->xOrigin, 0, ! 246: NULL, NULL, NULL, &rclPaintTop, NULL); ! 247: ! 248: if (hwndClientBottom != NULL) { ! 249: xOriginOld = npviewBottom->xOrigin; ! 250: npviewBottom->xOrigin = npviewTop->xOrigin; ! 251: WinScrollWindow(hwndClientBottom, xOriginOld - npviewBottom->xOrigin, ! 252: 0, NULL, NULL, NULL, &rclPaintBottom, NULL); ! 253: } ! 254: ! 255: WinMapWindowPoints(hwndClientTop, hwndFrame, (PPOINTL)&rclPaintTop, 2); ! 256: WinInvalidateRect(hwndFrame, &rclPaintTop, TRUE); ! 257: ! 258: if (hwndClientBottom != NULL) { ! 259: WinMapWindowPoints(hwndClientBottom, hwndFrame, (PPOINTL)&rclPaintBottom, 2); ! 260: WinInvalidateRect(hwndFrame, &rclPaintBottom, TRUE); ! 261: } ! 262: } ! 263: ! 264: ! 265: VOID AppVScroll(HWND hwnd, MPARAM mp1, MPARAM mp2) ! 266: { ! 267: HWND hwndFrame; ! 268: NPDOC npdoc; ! 269: RECTL rclPaintRight, rclPaintLeft; ! 270: RECTL rclWindowRight, rclWindowLeft; ! 271: HWND hwndClientRight, hwndClientLeft; ! 272: HWND hwndScrollbar; ! 273: register NPVIEW npviewRight, npviewLeft; ! 274: SHORT posSlider, yOriginOld; ! 275: USHORT cmd, idScrollbar; ! 276: ! 277: hwndFrame = WinQueryWindow(hwnd, QW_PARENT, FALSE); ! 278: npdoc = NPDOCFROMCLIENT(hwnd); ! 279: ! 280: idScrollbar = SHORT1FROMMP(mp1); ! 281: ! 282: switch (idScrollbar) { ! 283: ! 284: case FID_VERTSCROLL: ! 285: hwndClientLeft = hwnd; ! 286: if (npdoc->fs & DF_SPLITVERT) { ! 287: hwndClientRight = WinWindowFromID(hwndFrame, ID_CLIENT2); ! 288: } else { ! 289: hwndClientRight = NULL; ! 290: } ! 291: break; ! 292: ! 293: case ID_VERTSCROLL2: ! 294: hwndClientLeft = WinWindowFromID(hwndFrame, ID_CLIENT3); ! 295: if (npdoc->fs & DF_SPLITVERT) { ! 296: hwndClientRight = WinWindowFromID(hwndFrame, ID_CLIENT4); ! 297: } else { ! 298: hwndClientRight = NULL; ! 299: } ! 300: break; ! 301: } ! 302: ! 303: hwndScrollbar = WinWindowFromID(hwndFrame, idScrollbar); ! 304: ! 305: npviewLeft = NPVIEWFROMCLIENT(hwndClientLeft); ! 306: WinQueryWindowRect(hwndClientLeft, &rclWindowLeft); ! 307: ! 308: if (hwndClientRight != NULL) { ! 309: npviewRight = NPVIEWFROMCLIENT(hwndClientRight); ! 310: WinQueryWindowRect(hwndClientRight, &rclWindowRight); ! 311: } ! 312: ! 313: posSlider = (SHORT)WinSendMsg(hwndScrollbar, SBM_QUERYPOS, NULL, NULL); ! 314: ! 315: cmd = SHORT2FROMMP(mp2); ! 316: switch (cmd) { ! 317: ! 318: case SB_LINEUP: ! 319: posSlider -= 16; ! 320: break; ! 321: ! 322: case SB_LINEDOWN: ! 323: posSlider += 16; ! 324: break; ! 325: ! 326: case SB_PAGEUP: ! 327: posSlider -= ((SHORT)rclWindowLeft.yTop - 16); ! 328: break; ! 329: ! 330: case SB_PAGEDOWN: ! 331: posSlider += ((SHORT)rclWindowLeft.yTop - 16); ! 332: break; ! 333: ! 334: case SB_SLIDERPOSITION: ! 335: posSlider = SHORT1FROMMP(mp2); ! 336: break; ! 337: } ! 338: ! 339: WinSendMsg(hwndScrollbar, SBM_SETPOS, MPFROMSHORT(posSlider), NULL); ! 340: ! 341: yOriginOld = npviewLeft->yOrigin; ! 342: npviewLeft->yOrigin = (SHORT)WinSendMsg(hwndScrollbar, SBM_QUERYPOS, NULL, NULL); ! 343: WinScrollWindow(hwndClientLeft, 0, npviewLeft->yOrigin - yOriginOld, ! 344: NULL, NULL, NULL, &rclPaintLeft, NULL); ! 345: ! 346: if (hwndClientRight != NULL) { ! 347: yOriginOld = npviewRight->yOrigin; ! 348: npviewRight->yOrigin = npviewLeft->yOrigin; ! 349: WinScrollWindow(hwndClientRight, 0, npviewRight->yOrigin - yOriginOld, ! 350: NULL, NULL, NULL, &rclPaintRight, NULL); ! 351: } ! 352: ! 353: WinMapWindowPoints(hwndClientLeft, hwndFrame, (PPOINTL)&rclPaintLeft, 2); ! 354: WinInvalidateRect(hwndFrame, &rclPaintLeft, TRUE); ! 355: ! 356: if (hwndClientRight != NULL) { ! 357: WinMapWindowPoints(hwndClientRight, hwndFrame, (PPOINTL)&rclPaintRight, 2); ! 358: WinInvalidateRect(hwndFrame, &rclPaintRight, TRUE); ! 359: } ! 360: } ! 361: ! 362: ! 363: VOID AppPaint(HWND hwnd) ! 364: { ! 365: HPS hps; ! 366: RECTL rclPaint, rclWindow, rclTest, rclDst; ! 367: POINTL ptl, ptlPatternRef; ! 368: register NPVIEW npview; ! 369: AREABUNDLE abnd; ! 370: LONG clrStart, clrEnd, clrInc, clr; ! 371: SHORT i, j; ! 372: ! 373: hps = WinBeginPaint(hwnd, (HPS)NULL, &rclPaint); ! 374: ! 375: /* ! 376: * Go into RGB mode. ! 377: */ ! 378: GpiCreateLogColorTable(hps, 0L, LCOLF_RGB, 0L, 0L, NULL); ! 379: ! 380: /* ! 381: * Make rclPaint an inclusive-inclusive rectangle ! 382: * since that's how GpiBox() will be output. ! 383: */ ! 384: rclPaint.xLeft--; ! 385: rclPaint.yBottom--; ! 386: ! 387: npview = NPVIEWFROMCLIENT(hwnd); ! 388: ! 389: /* ! 390: * Set the pattern to be at the top-left ! 391: * since we're top-left aligning the bits. ! 392: */ ! 393: WinQueryWindowRect(hwnd, (PRECTL)&rclWindow); ! 394: ptlPatternRef.x = rclWindow.xLeft - npview->xOrigin; ! 395: ptlPatternRef.y = rclWindow.yTop + npview->yOrigin; ! 396: GpiSetPatternRefPoint(hps, &ptlPatternRef); ! 397: ! 398: for (i = 0; i < 8; i++) { ! 399: ! 400: clr = clrStart = aclrRGB[i * 2]; ! 401: clrEnd = aclrRGB[(i * 2) + 1]; ! 402: clrInc = (clrEnd - clrStart) / 8; ! 403: ! 404: for (j = 0; j < 8; j++) { ! 405: abnd.lColor = clr + (j * clrInc); ! 406: GpiSetAttrs(hps, PRIM_AREA, ABB_COLOR, 0L, (PBUNDLE)&abnd); ! 407: ! 408: /* ! 409: * Only draw the box if it's going to ! 410: * be visible in the update region. ! 411: */ ! 412: WinSetRect(NULL, &rclTest, 10 + (i * 75), ! 413: (SHORT)rclWindow.yTop - 75 - (j * 75), 75 + (i * 75), ! 414: (SHORT)rclWindow.yTop - 10 - (j * 75)); ! 415: ! 416: WinOffsetRect(NULL, &rclTest, -npview->xOrigin, npview->yOrigin); ! 417: ! 418: if (WinIntersectRect(NULL, &rclDst, &rclTest, &rclPaint)) { ! 419: ! 420: ptl.x = rclTest.xLeft; ! 421: ptl.y = rclTest.yTop; ! 422: GpiSetCurrentPosition(hps, (PPOINTL)&ptl); ! 423: ! 424: ptl.x = rclTest.xRight; ! 425: ptl.y = rclTest.yBottom; ! 426: GpiBox(hps, DRO_OUTLINEFILL, (PPOINTL)&ptl, 40L, 40L); ! 427: } ! 428: } ! 429: } ! 430: ! 431: WinEndPaint(hps); ! 432: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.