Annotation of os232sdk/toolkt20/c/samples/snap/snap.c, revision 1.1

1.1     ! root        1: /*
        !             2: * snap.c -- PM snapshot utility
        !             3: *
        !             4: * Created by Microsoft, IBM Corporation 1990
        !             5: *
        !             6: *      DISCLAIMER OF WARRANTIES.  The following [enclosed] code is 
        !             7: *      sample code created by Microsoft Corporation and/or IBM 
        !             8: *      Corporation. This sample code is not part of any standard 
        !             9: *      Microsoft or IBM product and is provided to you solely for 
        !            10: *      the purpose of assisting you in the development of your 
        !            11: *      applications.  The code is provided "AS IS", without 
        !            12: *      warranty of any kind.  Neither Microsoft nor IBM shall be 
        !            13: *      liable for any damages arising out of your use of the sample 
        !            14: *      code, even if they have been advised of the possibility of 
        !            15: *      such damages.
        !            16: *
        !            17: */
        !            18: #define                INCL_WIN
        !            19: #define                INCL_GPI
        !            20: #define                INCL_DEV
        !            21: #define                INCL_DOSMEMMGR
        !            22: #include       <os2.h>
        !            23: #include       "snap.h"
        !            24: 
        !            25: /* Global variables */
        !            26: char szSnap[5];
        !            27: 
        !            28: HAB    habSnap;
        !            29: HMQ    hmqSnap;
        !            30: HWND   hwndSnap, hwndSnapFrame;
        !            31: HWND   hwndNextClipViewer;
        !            32: HPS    hpsScr;
        !            33: 
        !            34: HPOINTER hptrSnap;
        !            35: HPOINTER hptrHand;
        !            36: HPOINTER hptrSelect;
        !            37: 
        !            38: RECTL wrcRgn;                   /* holds coordinates of selected region. */
        !            39: RECTL rcScreen;                 /* rectangle for the screen for bounding */
        !            40: 
        !            41: int  wSnapMode = IDM_WINDOW;    /* snap either selected window or region. */
        !            42: 
        !            43: BOOL fSnapWnd = FALSE;  /* snap selected window? */
        !            44: BOOL fSnapRgn = FALSE;  /* snap selected region? */
        !            45: BOOL fSelect = FALSE;   /* in the process of selecting region? */
        !            46: BOOL fNCArea = FALSE;   /* exclude nonclient area of window in snap? */
        !            47: BOOL fHide = TRUE;      /* hide snap's window while snapping */
        !            48: 
        !            49: 
        !            50: /* Function prototypes */
        !            51: MRESULT EXPENTRY SnapWndProc(HWND, USHORT, MPARAM, MPARAM);
        !            52: MRESULT EXPENTRY AboutWndProc(HWND, USHORT, MPARAM, MPARAM);
        !            53: MRESULT EXPENTRY SaveFileDlgProc(HWND, USHORT, MPARAM, MPARAM);
        !            54: HFILE OpenSaveFile(HWND);
        !            55: void SnapWindow(ULONG);
        !            56: BOOL SnapInit(void);
        !            57: void SnapPaint(HPS);
        !            58: void SnapRegion(HPS);
        !            59: void DrawRgn(HPS);
        !            60: void SortRect(PRECTL, PRECTL);
        !            61: void SaveBitmap(void);
        !            62: void SaveBitmap2(HFILE hFile, HBITMAP hbm);
        !            63: void convert(NPBYTE pbuf, USHORT cch, USHORT cch2);
        !            64: HDC CreateDC(PSZ, HDC);
        !            65: void Copy(NPBYTE, NPBYTE, USHORT);
        !            66: int cdecl main(void);
        !            67: BOOL   GetMem(PPVOID, ULONG);
        !            68: 
        !            69: 
        !            70: /* Routines */
        !            71: int cdecl main(void)
        !            72: {
        !            73:     QMSG msg;
        !            74:     ULONG ctlData;
        !            75: 
        !            76:     if (!SnapInit())
        !            77:         return(FALSE);
        !            78: 
        !            79:     ctlData = FCF_TITLEBAR | FCF_MINMAX | FCF_SIZEBORDER |
        !            80:             FCF_SYSMENU | FCF_MENU | FCF_ICON;
        !            81:     hwndSnapFrame = WinCreateStdWindow(HWND_DESKTOP,
        !            82:             FS_ICON, &ctlData,
        !            83:             (PCH)szSnap, (PCH)szSnap,
        !            84:             0L,
        !            85:             NULL, 1,
        !            86:             (HWND *)&hwndSnap);
        !            87: 
        !            88: 
        !            89:     if (!hwndSnap)
        !            90:         return(FALSE);
        !            91: 
        !            92:     WinSetWindowPos(hwndSnapFrame, 0, 0, 0, 200, 75, SWP_SIZE | SWP_MOVE);
        !            93:     WinShowWindow(hwndSnapFrame, TRUE);
        !            94: 
        !            95:     WinSetFocus(HWND_DESKTOP, hwndSnap);
        !            96:     WinQueryWindowRect(HWND_DESKTOP, &rcScreen);
        !            97: 
        !            98:     if (WinOpenClipbrd(habSnap)) {
        !            99:         WinSetClipbrdViewer(habSnap, hwndSnap);
        !           100:         WinCloseClipbrd(habSnap);
        !           101:     }
        !           102: 
        !           103:     while (WinGetMsg(habSnap, (PQMSG)&msg, NULL, NULL, NULL)) {
        !           104:         WinDispatchMsg(habSnap, (PQMSG)&msg);
        !           105:     }
        !           106: 
        !           107:     WinDestroyPointer(hptrSnap);
        !           108:     WinDestroyPointer(hptrHand);
        !           109:     WinDestroyPointer(hptrSelect);
        !           110: 
        !           111:     WinDestroyWindow(hwndSnapFrame);
        !           112:     WinDestroyMsgQueue(hmqSnap);
        !           113: 
        !           114:     WinTerminate(habSnap);
        !           115: 
        !           116:     return 0;
        !           117: } /* end winmain */
        !           118: 
        !           119: 
        !           120: HDC CreateDC(lpszDriver, hdcCompat)
        !           121: PSZ lpszDriver;
        !           122: HDC hdcCompat;
        !           123: {
        !           124:     struct {
        !           125:         ULONG *lpLogAddr;
        !           126:         PSZ lpszDriver;
        !           127:     } opendc;
        !           128: 
        !           129:     opendc.lpLogAddr = NULL;
        !           130:     opendc.lpszDriver = lpszDriver;
        !           131: 
        !           132:     return((HDC)DevOpenDC(habSnap, OD_MEMORY, (PSZ)"*", 2L,
        !           133:             (PDEVOPENDATA)&opendc, hdcCompat));
        !           134: }
        !           135: 
        !           136: BOOL SnapInit(void)
        !           137: {
        !           138:     /*
        !           139:      * Initialize the HAB
        !           140:      */
        !           141:     habSnap = WinInitialize(NULL);
        !           142: 
        !           143:     hmqSnap = WinCreateMsgQueue(NULL, 0);
        !           144: 
        !           145:     WinLoadString(habSnap, (ULONG)0, IDS_SNAP, sizeof(szSnap), (PCH)szSnap);
        !           146: 
        !           147:     hptrSnap = WinLoadPointer(HWND_DESKTOP, (HMODULE)NULL, IDR_PTR_SNAP);
        !           148:     hptrHand = WinLoadPointer(HWND_DESKTOP, (HMODULE)NULL, IDR_PTR_HAND);
        !           149:     hptrSelect = WinLoadPointer(HWND_DESKTOP, (HMODULE)NULL, IDR_PTR_SELECT);
        !           150: 
        !           151:     if (!WinRegisterClass(habSnap, (PCH)szSnap, SnapWndProc, (ULONG)0, 0))
        !           152:         return(FALSE);
        !           153: 
        !           154:     /*
        !           155:      * We assume an empty clipboard when we start.
        !           156:      */
        !           157:     WinOpenClipbrd(habSnap);
        !           158:     WinEmptyClipbrd(habSnap);
        !           159:     WinCloseClipbrd(habSnap);
        !           160: } /* end snapinit */
        !           161: 
        !           162: 
        !           163: MRESULT EXPENTRY SnapWndProc(hwnd, message, mp1, mp2)
        !           164: HWND    hwnd;
        !           165: USHORT  message;
        !           166: MPARAM  mp1;
        !           167: MPARAM  mp2;
        !           168: {
        !           169:     HWND hwndMenu;
        !           170:     HPS hps;
        !           171:     RECTL wrcUpdate;
        !           172:     POINTL wptTemp;
        !           173: 
        !           174:     switch (message) {
        !           175:         case WM_BUTTON1DOWN:
        !           176:             if (fSnapWnd) {
        !           177:                 WinSetPointer(HWND_DESKTOP, hptrSnap);
        !           178:                 SnapWindow(LONGFROMMP(mp1));
        !           179:                 WinSetCapture(HWND_DESKTOP, (HWND)NULL);
        !           180:                 fSnapWnd = FALSE;
        !           181:             } else if (fSnapRgn) {
        !           182:                 wptTemp.x = SHORT1FROMMP(mp1);
        !           183:                 wptTemp.y = SHORT2FROMMP(mp1);
        !           184:                 WinMapWindowPoints(hwndSnap, (HWND)HWND_DESKTOP,
        !           185:                         (PPOINTL)&wptTemp, 1);
        !           186:                 wrcRgn.yTop = wrcRgn.yBottom = wptTemp.y;
        !           187:                 wrcRgn.xRight = wrcRgn.xLeft = wptTemp.x;
        !           188:                 hpsScr = WinGetScreenPS(HWND_DESKTOP);
        !           189:                 DrawRgn(hpsScr);
        !           190:                 WinReleasePS(hpsScr);
        !           191:                 fSelect = TRUE;
        !           192:                 break;
        !           193:             } else {
        !           194:                 return(WinDefWindowProc(hwnd, message, mp1, mp2));
        !           195:             }
        !           196:             break;
        !           197: 
        !           198:         case WM_MOUSEMOVE:
        !           199:             if (fSelect) {
        !           200:                 hpsScr = WinGetScreenPS(HWND_DESKTOP);
        !           201:                 DrawRgn(hpsScr);
        !           202:                 wptTemp.x = LOUSHORT(mp1);
        !           203:                 wptTemp.y = HIUSHORT(mp1);
        !           204:                 WinMapWindowPoints(hwndSnap, (HWND)HWND_DESKTOP,
        !           205:                         (PPOINTL)&wptTemp, 1);
        !           206:                 wrcRgn.yTop = wptTemp.y;
        !           207:                 wrcRgn.xRight = wptTemp.x;
        !           208:                 DrawRgn(hpsScr);
        !           209:                 WinReleasePS(hpsScr);
        !           210:                 break;
        !           211:             }
        !           212:             if (fSnapWnd || fSnapRgn) {
        !           213:                 break;
        !           214:             } else {
        !           215:                 return(WinDefWindowProc(hwnd, message, mp1, mp2));
        !           216:             }
        !           217:             break;
        !           218: 
        !           219:         case WM_BUTTON1UP:
        !           220:             if (fSelect) {
        !           221:                 WinSetCapture(HWND_DESKTOP, (HWND)NULL);
        !           222:                 hpsScr = WinGetScreenPS(HWND_DESKTOP);
        !           223:                 DrawRgn(hpsScr);
        !           224:                 SnapRegion(hpsScr);
        !           225:                 WinReleasePS(hpsScr);
        !           226:                 fSnapRgn = FALSE;
        !           227:                 fSelect = FALSE;
        !           228:             }
        !           229:             break;
        !           230: 
        !           231:         case WM_DRAWCLIPBOARD:
        !           232:             WinInvalidateRect(hwnd, (PRECTL)NULL, TRUE);
        !           233:             break;
        !           234: 
        !           235:         case WM_PAINT:
        !           236:             hps = WinBeginPaint(hwnd, NULL, &wrcUpdate);
        !           237:             WinFillRect(hps, &wrcUpdate, SYSCLR_WINDOW);
        !           238:             SnapPaint(hps);
        !           239:             WinEndPaint(hps);
        !           240:             break;
        !           241: 
        !           242:         case WM_INITMENU:
        !           243:             hwndMenu = WinWindowFromID(hwndSnapFrame, FID_MENU);
        !           244:             WinSendMsg(hwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_REGION, TRUE),
        !           245:                 MPFROM2SHORT(MIA_CHECKED, wSnapMode == IDM_REGION ? MIA_CHECKED : 0));
        !           246:             WinSendMsg(hwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_WINDOW, TRUE),
        !           247:                 MPFROM2SHORT(MIA_CHECKED, wSnapMode == IDM_WINDOW ? MIA_CHECKED : 0));
        !           248:             WinSendMsg(hwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_NCAREA, TRUE),
        !           249:                 MPFROM2SHORT(MIA_CHECKED, fNCArea ? MIA_CHECKED : 0));
        !           250:             WinSendMsg(hwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_HIDE, TRUE),
        !           251:                 MPFROM2SHORT(MIA_CHECKED, fHide ? MIA_CHECKED : 0));
        !           252:             WinSendMsg(hwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_NCAREA, TRUE),
        !           253:                 MPFROM2SHORT(MIA_DISABLED, wSnapMode == IDM_WINDOW ? 0 : MIA_DISABLED));
        !           254:             break;
        !           255: 
        !           256:         case WM_COMMAND:
        !           257:             switch ((USHORT)mp1) {
        !           258:                 case IDM_SAVE:
        !           259:                     SaveBitmap();
        !           260:                     break;
        !           261: 
        !           262:                 case IDM_SNAP:
        !           263:                     WinSetCapture(HWND_DESKTOP, hwnd);
        !           264:                     if (fHide)
        !           265:                         WinShowWindow(hwndSnapFrame, FALSE);
        !           266:                     if (wSnapMode == IDM_WINDOW) {
        !           267:                         fSnapWnd = TRUE;
        !           268:                         WinSetPointer(HWND_DESKTOP, hptrHand);
        !           269:                     } else {
        !           270:                         fSnapRgn = TRUE;
        !           271:                         WinSetPointer(HWND_DESKTOP, hptrSelect);
        !           272:                     }
        !           273:                     break;
        !           274: 
        !           275:                 case IDM_WINDOW:
        !           276:                 case IDM_REGION:
        !           277:                     wSnapMode = SHORT1FROMMP(mp1);
        !           278:                     break;
        !           279: 
        !           280:                 case IDM_NCAREA:
        !           281:                     fNCArea = !fNCArea;
        !           282:                     break;
        !           283: 
        !           284:                 case IDM_HIDE:
        !           285:                     fHide = !fHide;
        !           286:                     break;
        !           287: 
        !           288:                 case IDM_ABOUT:
        !           289:                     WinDlgBox(HWND_DESKTOP, hwnd,
        !           290:                        (PFNWP)AboutWndProc, NULL, IDD_INFO, (PCH)NULL);
        !           291:                     break;
        !           292:             }
        !           293:             break;
        !           294: 
        !           295:         default:
        !           296:             return(WinDefWindowProc(hwnd, message, mp1, mp2));
        !           297:     }
        !           298: 
        !           299:     return(0L);
        !           300: 
        !           301: } /* end snapwndproc */
        !           302: 
        !           303: 
        !           304: void SnapPaint(hps)
        !           305: HPS hps;
        !           306: {
        !           307:     HBITMAP hbm;
        !           308:     POINTL   pt;
        !           309:     BITMAPINFOHEADER bminfo;
        !           310:     RECTL rc;
        !           311: 
        !           312:     WinOpenClipbrd(habSnap);
        !           313:     WinQueryWindowRect(hwndSnap, &rc);
        !           314: 
        !           315:     if (hbm = (HBITMAP)WinQueryClipbrdData(habSnap, CF_BITMAP)) {
        !           316:         GpiQueryBitmapParameters(hbm, &bminfo);
        !           317:         pt.x = 0;
        !           318:         pt.y = rc.yTop - bminfo.cy;
        !           319:         WinDrawBitmap(hps, hbm, (PRECTL)NULL, (PPOINTL)&pt,
        !           320:                 0L, 0L, DBM_NORMAL | DBM_IMAGEATTRS);
        !           321:     }
        !           322: 
        !           323:     WinCloseClipbrd(habSnap);
        !           324: 
        !           325: } /* end SnapPaint */
        !           326: 
        !           327: 
        !           328: void SnapWindow(loc)
        !           329: ULONG loc;
        !           330: {
        !           331:     BITMAPINFOHEADER bminfo;
        !           332:     POINTL  pt;
        !           333:     HWND hwnd;
        !           334:     HWND hwndT;
        !           335:     RECTL rc, rcTmp;
        !           336:     HPS  hpsWnd, hpsMem;
        !           337:     HDC  hdc;
        !           338:     HBITMAP hbm, hbmOld;
        !           339:     int  cx, cy;
        !           340:     POINTL rgpt[3];
        !           341:     SIZEL size;
        !           342: 
        !           343:     pt.y = HIUSHORT(loc);
        !           344:     pt.x = LOUSHORT(loc);
        !           345: 
        !           346:     WinMapWindowPoints(hwndSnap, HWND_DESKTOP, (PPOINTL)&pt, 1);
        !           347:     if ((hwnd = WinWindowFromPoint(HWND_DESKTOP, (PPOINTL)&pt, FALSE, FALSE)) == NULL)
        !           348:         return;
        !           349:     /* get size of target window. clip to screen. */
        !           350:     if (fNCArea)  /* snap only the client area if it exists */
        !           351:         if ((hwndT = WinWindowFromID(hwnd, FID_CLIENT)) != NULL)
        !           352:             hwnd = hwndT;
        !           353:     WinQueryWindowRect(hwnd, &rcTmp);
        !           354:     /* bound window rectangle to screen. */
        !           355:     WinMapWindowPoints(hwnd, HWND_DESKTOP, (PPOINTL)&rcTmp.xLeft, 2);
        !           356:     WinIntersectRect(habSnap, &rc, &rcTmp, &rcScreen);
        !           357:     WinMapWindowPoints(HWND_DESKTOP, hwnd, (PPOINTL)&rc.xLeft, 2);
        !           358:     cx = (USHORT)(rc.xRight - rc.xLeft);
        !           359:     cy = (USHORT)(rc.yTop - rc.yBottom);
        !           360: 
        !           361:     /* get window PS */
        !           362:     hpsWnd = WinGetPS(hwnd);
        !           363: 
        !           364:     /* Create a memory DC */
        !           365:     hdc = CreateDC((PSZ)"MEMORY", (HDC)NULL);
        !           366: 
        !           367:     /* create a memory PS */
        !           368:     size.cx = cx;
        !           369:     size.cy = cy;
        !           370:     hpsMem = GpiCreatePS( habSnap, hdc, &size,
        !           371:             PU_ARBITRARY | GPIT_NORMAL | GPIA_ASSOC );
        !           372: 
        !           373:     /* Create a bitmap */
        !           374:     bminfo.cbFix = sizeof(BITMAPINFOHEADER);
        !           375:     bminfo.cx = cx;
        !           376:     bminfo.cy = cy;
        !           377:     bminfo.cPlanes = 1;
        !           378:     bminfo.cBitCount = 4;
        !           379:     if (!(hbm = GpiCreateBitmap(hpsMem, (PBITMAPINFOHEADER2)&bminfo, 0L, 0, 0)))
        !           380:         WinMessageBox((HWND)HWND_DESKTOP, hwndSnap,
        !           381:             (PCH)"Insufficient memory to create the bitmap.", (PCH)NULL,
        !           382:             0, MB_OK);
        !           383:     else {
        !           384:         /* put the bitmap into the memory PS */
        !           385:         hbmOld = GpiSetBitmap(hpsMem, hbm);
        !           386: 
        !           387:         /* copy the window to the memory PS */
        !           388:         rgpt[0].x = 0;
        !           389:         rgpt[0].y = 0;
        !           390:         rgpt[1].x = cx;
        !           391:         rgpt[1].y = cy;
        !           392:         rgpt[2].x = rc.xLeft;
        !           393:         rgpt[2].y = rc.yBottom;
        !           394:         GpiBitBlt(hpsMem, hpsWnd, 3L, (PPOINTL)&rgpt[0], ROP_SRCCOPY, 0L);
        !           395: 
        !           396:         /* free the bitmap */
        !           397:         GpiSetBitmap(hpsMem, hbmOld);
        !           398: 
        !           399:         /* store the bitmap */
        !           400:         WinOpenClipbrd(habSnap);
        !           401:         WinEmptyClipbrd(habSnap);
        !           402:         WinSetClipbrdData(habSnap, (ULONG)hbm, CF_BITMAP, CFI_HANDLE);
        !           403:         WinCloseClipbrd(habSnap);
        !           404:     }
        !           405: 
        !           406:     /* destroy the memory DC */
        !           407:     GpiAssociate( hpsMem, NULL );
        !           408:     DevCloseDC(hdc);
        !           409: 
        !           410:     /* get rid of the PSs */
        !           411:     GpiDestroyPS(hpsMem);
        !           412:     WinReleasePS(hpsWnd);
        !           413: 
        !           414:     if (fHide)
        !           415:         WinShowWindow(hwndSnapFrame, TRUE);
        !           416: 
        !           417: } /* end snapwindow */
        !           418: 
        !           419: 
        !           420: void SnapRegion(hpsScr)
        !           421: HPS hpsScr;
        !           422: {
        !           423:     HDC hdc;
        !           424:     HBITMAP hbm, hbmOld;
        !           425:     BITMAPINFOHEADER bminfo;
        !           426:     RECTL rcTmp;
        !           427:     int cx, cy;
        !           428:     POINTL rgpt[3];
        !           429:     HPS hpsMem;
        !           430:     SIZEL size;
        !           431: 
        !           432:     SortRect((PRECTL)&wrcRgn, (PRECTL)&rcTmp);
        !           433: 
        !           434:     cx = (USHORT)(rcTmp.xRight - rcTmp.xLeft);
        !           435:     cy = (USHORT)(rcTmp.yTop - rcTmp.yBottom);
        !           436: 
        !           437:     /* Create a memory DC */
        !           438:     hdc = CreateDC((PSZ)"MEMORY", (HDC)NULL);
        !           439: 
        !           440:     /* create a memory PS */
        !           441:     size.cx = cx;
        !           442:     size.cy = cy;
        !           443:     hpsMem = GpiCreatePS( habSnap, hdc, &size,
        !           444:             PU_ARBITRARY | GPIT_NORMAL | GPIA_ASSOC );
        !           445: 
        !           446:     /* Create a bitmap */
        !           447:     bminfo.cbFix = sizeof(BITMAPINFOHEADER);
        !           448:     bminfo.cx = cx;
        !           449:     bminfo.cy = cy;
        !           450:     bminfo.cPlanes = 1;
        !           451:     bminfo.cBitCount = 4;
        !           452:     if (!(hbm = GpiCreateBitmap(hpsMem, (PBITMAPINFOHEADER2)&bminfo, 0L, 0, 0))) {
        !           453:         WinMessageBox((HWND)HWND_DESKTOP, hwndSnap,
        !           454:             (PCH)"Insufficient memory to create the bitmap.", (PCH)NULL,
        !           455:             0, MB_OK);
        !           456:     } else {
        !           457:         /* put the bitmap into the memory PS */
        !           458:         hbmOld = GpiSetBitmap(hpsMem, hbm);
        !           459: 
        !           460:         /* copy the window to the memory PS */
        !           461:         rgpt[0].x = 0;
        !           462:         rgpt[0].y = 0;
        !           463:         rgpt[1].x = cx;
        !           464:         rgpt[1].y = cy;
        !           465:         rgpt[2].x = rcTmp.xLeft;
        !           466:         rgpt[2].y = rcTmp.yBottom;
        !           467:         GpiBitBlt(hpsMem, hpsScr, 3L, (PPOINTL)&rgpt[0], ROP_SRCCOPY, 0L);
        !           468: 
        !           469:         /* free the bitmap */
        !           470:         GpiSetBitmap(hpsMem, hbmOld);
        !           471: 
        !           472:         /* store the bitmap */
        !           473:         WinOpenClipbrd(habSnap);
        !           474:         WinEmptyClipbrd(habSnap);
        !           475:         WinSetClipbrdData(habSnap, (ULONG)hbm, CF_BITMAP, CFI_HANDLE);
        !           476:         WinCloseClipbrd(habSnap);
        !           477:     }
        !           478:     /* destroy the memory DC */
        !           479:     GpiAssociate( hpsMem, NULL );
        !           480:     DevCloseDC(hdc);
        !           481: 
        !           482:     /* get rid of the PS */
        !           483:     GpiDestroyPS(hpsMem);
        !           484: 
        !           485:     if (fHide)
        !           486:         WinShowWindow(hwndSnapFrame, TRUE);
        !           487: 
        !           488: } /* end snapregion */
        !           489: 
        !           490: void DrawRgn(hps)
        !           491: HPS hps;
        !           492: {
        !           493:     RECTL rc;
        !           494: 
        !           495:     SortRect((PRECTL)&wrcRgn, (PRECTL)&rc);
        !           496: 
        !           497:     WinDrawBorder(hps, (PRECTL)&rc, 1, 1, SYSCLR_WINDOW, SYSCLR_WINDOW,
        !           498:             DB_DESTINVERT | DB_STANDARD);
        !           499: }
        !           500: 
        !           501: void SortRect(pwrcIn, pwrcSorted)
        !           502: PRECTL pwrcIn, pwrcSorted;
        !           503: {
        !           504:     if (pwrcIn->yTop > pwrcIn->yBottom) {
        !           505:         pwrcSorted->yTop = pwrcIn->yTop;
        !           506:         pwrcSorted->yBottom = pwrcIn->yBottom;
        !           507:     } else {
        !           508:         pwrcSorted->yTop = pwrcIn->yBottom;
        !           509:         pwrcSorted->yBottom = pwrcIn->yTop;
        !           510:     }
        !           511:     if (pwrcIn->xRight > pwrcIn-> xLeft) {
        !           512:         pwrcSorted->xRight = pwrcIn->xRight;
        !           513:         pwrcSorted->xLeft = pwrcIn->xLeft;
        !           514:     } else {
        !           515:         pwrcSorted->xRight = pwrcIn->xLeft;
        !           516:         pwrcSorted->xLeft = pwrcIn->xRight;
        !           517:     }
        !           518: }
        !           519: 
        !           520: MRESULT EXPENTRY AboutWndProc(hwnd, message, mp1, mp2)
        !           521: HWND    hwnd;
        !           522: USHORT  message;
        !           523: MPARAM   mp1;
        !           524: MPARAM   mp2;
        !           525: {
        !           526:     switch (message) {
        !           527:         case WM_COMMAND:
        !           528:             WinDismissDlg(hwnd, TRUE);
        !           529:             break;
        !           530:         default:
        !           531:             return(WinDefDlgProc(hwnd, message, mp1, mp2));
        !           532:             break;
        !           533:     }
        !           534:     return 0L;
        !           535: 
        !           536: } /* end aboutwndproc */
        !           537: 
        !           538: void SaveBitmap(void)
        !           539: {
        !           540:     HFILE hFile;
        !           541:     HBITMAP hbm;
        !           542:     HPOINTER hptr, hptrWait;
        !           543: 
        !           544:     WinOpenClipbrd(habSnap);
        !           545:     if ((hbm = (HBITMAP)WinQueryClipbrdData(habSnap, CF_BITMAP)) == NULL) {
        !           546:         WinCloseClipbrd(habSnap);
        !           547:         return;
        !           548:     }
        !           549: 
        !           550:     if (hFile = OpenSaveFile(hwndSnap)) {
        !           551:         hptr = WinQueryPointer(HWND_DESKTOP);
        !           552:         hptrWait = WinQuerySysPointer(HWND_DESKTOP, SPTR_WAIT, TRUE);
        !           553:         WinSetPointer(HWND_DESKTOP, hptrWait);
        !           554:         SaveBitmap2(hFile, hbm);
        !           555:         WinSetPointer(HWND_DESKTOP, hptr);
        !           556:         WinDestroyPointer(hptrWait);
        !           557:     } else
        !           558:         WinAlarm(HWND_DESKTOP, WA_ERROR);
        !           559: 
        !           560:     WinCloseClipbrd(habSnap);
        !           561: }
        !           562: 
        !           563: /***************************************************************************\
        !           564: * hFile is a handle to an open file.  This is closed on exit.
        !           565: \***************************************************************************/
        !           566: void SaveBitmap2(hFile, hbm)
        !           567: HFILE hFile;
        !           568: HBITMAP hbm;
        !           569: {
        !           570:     /*
        !           571:      * Currently, this puts stuff out in Win386 paint format.
        !           572:      */
        !           573:     typedef struct _WIN386PAINT {
        !           574:         USHORT key1;
        !           575:         USHORT key2;
        !           576:         USHORT dxFile;
        !           577:         USHORT dyFile;
        !           578:         USHORT ScrAspectX;
        !           579:         USHORT ScrAspectY;
        !           580:         USHORT PrnAspectX;
        !           581:         USHORT PrnAspectY;
        !           582:         USHORT dxPrinter;
        !           583:         USHORT dyPrinter;
        !           584:         USHORT AspCorX;
        !           585:         USHORT AspCorY;
        !           586:         USHORT wCheck;
        !           587:         USHORT res1;
        !           588:         USHORT res2;
        !           589:         USHORT res3;
        !           590:     } FHDR;
        !           591:     FHDR hdr;
        !           592:     USHORT  i;
        !           593:     ULONG cBytesWritten;
        !           594:     USHORT *pIndex;
        !           595:     USHORT *pIndexT;
        !           596:     NPBYTE pScanLine, pBits, pBitsT;
        !           597:     USHORT *phdr;
        !           598:     USHORT cbIndexTable, cbScanLine, cbScanLineExp, cbBmpLine;
        !           599:     HDC hdc;
        !           600:     HBITMAP hbmOld;
        !           601:     BITMAPINFOHEADER bminfo;
        !           602:     BITMAPINFO2 bminfo2;
        !           603:     HPS hpsMem;
        !           604:     SIZEL size;
        !           605: 
        !           606:     /*
        !           607:      * write header
        !           608:      */
        !           609:     GpiQueryBitmapParameters(hbm, &bminfo);
        !           610:     hdr.key1 = 0x694C;
        !           611:     hdr.key2 = 0x536E;
        !           612:     hdr.dxFile = bminfo.cx;
        !           613:     hdr.dyFile = bminfo.cy;
        !           614:     hdr.ScrAspectX = 26;
        !           615:     hdr.ScrAspectY = 30;
        !           616:     hdr.PrnAspectX = 0x12c;
        !           617:     hdr.PrnAspectY = 0x12c;
        !           618:     hdr.dxPrinter = 0x8df;
        !           619:     hdr.dyPrinter = 0xce1;
        !           620:     hdr.AspCorX = 0;
        !           621:     hdr.AspCorY = 0;
        !           622: 
        !           623:     phdr = (USHORT *)&hdr;
        !           624:     hdr.wCheck = 0;
        !           625:     for (i=0; i < 12; i++)
        !           626:         hdr.wCheck ^= *phdr++;
        !           627: 
        !           628:     hdr.res1 = 0;
        !           629:     hdr.res2 = 0;
        !           630:     hdr.res3 = 0;
        !           631: 
        !           632:     DosWrite(hFile, (PSZ)&hdr, sizeof(FHDR), &cBytesWritten);
        !           633: 
        !           634:     /* calculate sizes */
        !           635:     cbIndexTable = sizeof(unsigned int) * bminfo.cy;
        !           636:     cbScanLine = (bminfo.cx + 7) >> 3;
        !           637:     cbScanLineExp = cbScanLine + ((cbScanLine + 0xff) >> 8);
        !           638:     cbBmpLine = (cbScanLine + 3) & 0xfffc;
        !           639: 
        !           640:     /*
        !           641:      * Write index table - (no compression)
        !           642:      */
        !           643:     /* allocate pIndex */
        !           644:     if (GetMem((PPVOID)&pIndex, cbIndexTable))
        !           645:         goto Exit;
        !           646:     
        !           647:     pIndexT = pIndex;
        !           648:     for (i=0; i < bminfo.cy; i++)
        !           649:         *pIndexT++ = cbScanLineExp;
        !           650: 
        !           651:     DosWrite(hFile, (PSZ)pIndex, cbIndexTable, &cBytesWritten);
        !           652: 
        !           653:     /* free pIndex */
        !           654:     DosFreeMem((PVOID)pIndex);
        !           655: 
        !           656:     /*
        !           657:      * Write out each scan line
        !           658:      */
        !           659:     /* allocate pScanLine */
        !           660:     if (GetMem((PPVOID)&pScanLine, cbScanLineExp))
        !           661:         goto Exit;
        !           662:     /* allocate pBits */
        !           663:     if (GetMem((PPVOID)&pBits, cbBmpLine*bminfo.cy))
        !           664:         goto Exit;
        !           665: 
        !           666:     /* specify the bitmap format we want */
        !           667:     bminfo.cPlanes = 1;
        !           668:     bminfo.cBitCount = 1;
        !           669: 
        !           670:     /* Create memory DC */
        !           671:     hdc = CreateDC((PSZ)"MEMORY", (HDC)NULL);
        !           672: 
        !           673:     /* create a memory PS */
        !           674:     size.cx = bminfo.cx;
        !           675:     size.cy = bminfo.cy;
        !           676:     hpsMem = GpiCreatePS( habSnap, hdc, &size,
        !           677:             PU_ARBITRARY | GPIT_NORMAL | GPIA_ASSOC);
        !           678: 
        !           679:     hbmOld = GpiSetBitmap(hpsMem, hbm);
        !           680:     GpiQueryBitmapBits(hpsMem, (LONG)0, (LONG)bminfo.cy, (PBYTE)pBits, &bminfo2);
        !           681: 
        !           682:     pBitsT = pBits + cbBmpLine * bminfo.cy;
        !           683:     for (i = 0; i < bminfo.cy; i++) {
        !           684:         pBitsT -= cbBmpLine;
        !           685:         Copy(pBitsT, pScanLine, cbScanLine);
        !           686:         convert(pScanLine, cbScanLine, cbScanLineExp);
        !           687:         DosWrite(hFile, (PSZ)pScanLine, cbScanLineExp, &cBytesWritten);
        !           688:     }
        !           689: 
        !           690:     /* free pBits and pScanLine */
        !           691:     DosFreeMem((PVOID)pBits);
        !           692:     DosFreeMem((PVOID)pScanLine);
        !           693: 
        !           694:     GpiAssociate(hpsMem, NULL);
        !           695:     DevCloseDC(hdc);
        !           696:     GpiDestroyPS(hpsMem);
        !           697: 
        !           698: Exit:
        !           699:     DosClose(hFile);
        !           700: }
        !           701: 
        !           702: 
        !           703: /***************************************************************************\
        !           704: * Insert apropriate repeat count bytes into the scanline given.
        !           705: \***************************************************************************/
        !           706: void convert(pbuf, cch, cch2)
        !           707: NPBYTE pbuf;
        !           708: USHORT cch; /* exact length of buffer BEFORE count bytes have been added */
        !           709: USHORT cch2; /* AFTER conversion size */
        !           710: {
        !           711:     NPBYTE pWrite, pRead;
        !           712: 
        !           713:     pWrite = pbuf + cch2 - 1;
        !           714:     pRead = pbuf + cch - 1;
        !           715:     while (pWrite > pbuf) {
        !           716:         *pWrite-- = *pRead--;
        !           717:         if (((pWrite - pbuf) & 0x00ff) == 0) {
        !           718:             *pWrite-- = (BYTE)((pbuf + cch2 - pWrite) < 0x100 ?
        !           719:                     (pbuf + cch2 - pWrite) : 0xff);
        !           720:         }
        !           721:     }
        !           722: }
        !           723: 
        !           724: void Copy(src, dest, cb)
        !           725: NPBYTE src;
        !           726: NPBYTE dest;
        !           727: USHORT cb;
        !           728: {
        !           729:     USHORT i;
        !           730: 
        !           731:     for (i = 0; i < cb; i++)
        !           732:         *dest++ = *src++;
        !           733: }
        !           734: 
        !           735: HFILE OpenSaveFile(hwnd)
        !           736: HWND hwnd;
        !           737: {
        !           738:     HFILE   hFile= 0L;
        !           739:     DLGP    dlgp;
        !           740:     char    fName[32];
        !           741:     ULONG  action;
        !           742: 
        !           743:     dlgp.cch = 32;
        !           744:     dlgp.psz = fName;
        !           745:     if (WinDlgBox(HWND_DESKTOP, hwnd, (PFNWP)SaveFileDlgProc, NULL,
        !           746:             IDD_SAVEFILE, (PVOID)&dlgp) != 0) {
        !           747:         DosOpen(fName, &hFile, &action, 0L, 0, 0x0011, 0x0011, 0L);
        !           748:     }
        !           749:     return(hFile);
        !           750: }
        !           751: 
        !           752: MRESULT EXPENTRY SaveFileDlgProc(hwnd, msg, mp1, mp2)
        !           753: HWND hwnd;
        !           754: USHORT msg;
        !           755: MPARAM mp1;
        !           756: MPARAM mp2;
        !           757: {
        !           758:     DLGP *pdlgp;
        !           759:     SHORT cch;
        !           760: 
        !           761:     switch (msg) {
        !           762:     case WM_INITDLG:
        !           763:         /* squirl away the dlgp pointer in a reentrant fashion */
        !           764:         WinSetWindowULong(hwnd, QWL_USER, (ULONG)mp2);
        !           765:         break;
        !           766: 
        !           767:     case WM_CHAR:
        !           768:         if ( ((USHORT)mp1 & KC_VIRTUALKEY) &&
        !           769:                 ((SHORT2FROMMP(mp2) == VK_NEWLINE) ||
        !           770:                  (SHORT2FROMMP(mp2) == VK_ENTER)) ) {
        !           771:             if (pdlgp = (DLGP *)WinQueryWindowULong(hwnd, QWL_USER)) {
        !           772:                 cch = WinQueryWindowText(WinWindowFromID(hwnd, ID_FILEENTRY),
        !           773:                         pdlgp->cch, pdlgp->psz);
        !           774:                 WinDismissDlg(hwnd, cch);
        !           775:             } else {
        !           776:                 WinDismissDlg(hwnd, 0);
        !           777:             }
        !           778:             return(0);
        !           779:         }
        !           780:         break;
        !           781:     }
        !           782: 
        !           783:     return(WinDefDlgProc(hwnd, msg, mp1, mp2));
        !           784: }
        !           785: 
        !           786: BOOL
        !           787: GetMem (ppv, cb)
        !           788: PPVOID ppv;
        !           789: ULONG  cb;
        !           790: {
        !           791:     BOOL       f;
        !           792: 
        !           793:     f = DosAllocMem(ppv, cb, fPERM|PAG_COMMIT);
        !           794:     if (f) {
        !           795:        WinMessageBox(HWND_DESKTOP, HWND_DESKTOP,
        !           796:                "Sorry, Not enough memory",  NULL, 0, MB_OK);
        !           797:        *ppv = NULL;
        !           798:        return TRUE;
        !           799:     }
        !           800:     return FALSE;
        !           801: }

unix.superglobalmegacorp.com

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