Annotation of pmsdk/samples/mdi/appdoc.c, revision 1.1

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: }

unix.superglobalmegacorp.com

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