Annotation of pmsdk/samples/petzold/chap15/blowup.c, revision 1.1.1.1

1.1       root        1: /*------------------------------------
                      2:    BLOWUP.C -- Screen Capture Program
                      3:   ------------------------------------*/
                      4: 
                      5: #define INCL_WIN
                      6: #define INCL_GPI
                      7: #include <os2.h>
                      8: #include "blowup.h"
                      9: 
                     10: MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ;
                     11: 
                     12: CHAR szClientClass [] = "BlowUp" ;
                     13: HAB  hab ;
                     14: 
                     15: int main (void)
                     16:      {
                     17:      static ULONG flFrameFlags = FCF_TITLEBAR      | FCF_SYSMENU  |
                     18:                                  FCF_SIZEBORDER    | FCF_MINMAX   |
                     19:                                  FCF_SHELLPOSITION | FCF_TASKLIST |
                     20:                                  FCF_MENU          | FCF_ACCELTABLE ;
                     21:      HMQ          hmq ;
                     22:      HWND         hwndFrame, hwndClient ;
                     23:      QMSG         qmsg ;
                     24: 
                     25:      hab = WinInitialize (0) ;
                     26:      hmq = WinCreateMsgQueue (hab, 0) ;
                     27: 
                     28:      WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ;
                     29: 
                     30:      hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE,
                     31:                                      &flFrameFlags, szClientClass, NULL,
                     32:                                      0L, NULL, ID_RESOURCE, &hwndClient) ;
                     33: 
                     34:      WinSendMsg (hwndFrame, WM_SETICON,
                     35:                  WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE),
                     36:                  NULL) ;
                     37: 
                     38:      while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
                     39:           WinDispatchMsg (hab, &qmsg) ;
                     40: 
                     41:      WinDestroyWindow (hwndFrame) ;
                     42:      WinDestroyMsgQueue (hmq) ;
                     43:      WinTerminate (hab) ;
                     44:      return 0 ;
                     45:      }
                     46: 
                     47: BOOL BeginTracking (RECTL *prclTrack)
                     48:      {
                     49:      LONG      cxScreen, cyScreen, cxPointer, cyPointer ;
                     50:      TRACKINFO ti ;
                     51: 
                     52:      cxScreen  = WinQuerySysValue (HWND_DESKTOP, SV_CXSCREEN) ;
                     53:      cyScreen  = WinQuerySysValue (HWND_DESKTOP, SV_CYSCREEN) ;
                     54:      cxPointer = WinQuerySysValue (HWND_DESKTOP, SV_CXPOINTER) ;
                     55:      cyPointer = WinQuerySysValue (HWND_DESKTOP, SV_CYPOINTER) ;
                     56: 
                     57:                                    // Set up track rectangle for moving
                     58: 
                     59:      ti.cxBorder = 1 ;                       // Border width
                     60:      ti.cyBorder = 1 ;
                     61:      ti.cxGrid = 0 ;                         // Not used
                     62:      ti.cyGrid = 0 ;
                     63:      ti.cxKeyboard = 4 ;                     // Pixel increment for keyboard
                     64:      ti.cyKeyboard = 4 ;
                     65: 
                     66:      ti.rclBoundary.xLeft   = 0 ;            // Area for tracking rectangle
                     67:      ti.rclBoundary.yBottom = 0 ;
                     68:      ti.rclBoundary.xRight  = cxScreen ;
                     69:      ti.rclBoundary.yTop    = cyScreen ;
                     70: 
                     71:      ti.ptlMinTrackSize.x = 1 ;              // Minimum rectangle size
                     72:      ti.ptlMinTrackSize.y = 1 ;
                     73: 
                     74:      ti.ptlMaxTrackSize.x = cxScreen ;       // Maximum rectangle size
                     75:      ti.ptlMaxTrackSize.y = cyScreen ;
                     76:                                              // Initial position
                     77: 
                     78:      ti.rclTrack.xLeft   = (cxScreen - cxPointer) / 2 ;
                     79:      ti.rclTrack.yBottom = (cyScreen - cyPointer) / 2 ;
                     80:      ti.rclTrack.xRight  = (cxScreen + cxPointer) / 2 ;
                     81:      ti.rclTrack.yTop    = (cyScreen + cyPointer) / 2 ;
                     82: 
                     83:      ti.fs = TF_MOVE | TF_STANDARD | TF_SETPOINTERPOS ;     // Flags
                     84: 
                     85:      if (!WinTrackRect (HWND_DESKTOP, NULL, &ti))
                     86:           return FALSE ;
                     87:                                    // Switch to "sizing" pointer
                     88:      WinSetPointer (HWND_DESKTOP,
                     89:                WinQuerySysPointer (HWND_DESKTOP, SPTR_SIZENESW, FALSE)) ;
                     90: 
                     91:                                    // Track rectangle for sizing
                     92: 
                     93:      ti.fs = TF_RIGHT | TF_TOP | TF_STANDARD | TF_SETPOINTERPOS ;
                     94: 
                     95:      if (!WinTrackRect (HWND_DESKTOP, NULL, &ti))
                     96:           return FALSE ;
                     97: 
                     98:      *prclTrack = ti.rclTrack ;    // Final rectangle
                     99: 
                    100:      return TRUE ;
                    101:      }
                    102: 
                    103: HBITMAP CopyScreenToBitmap (RECTL *prclTrack)
                    104:      {
                    105:      BITMAPINFOHEADER bmp ;
                    106:      HBITMAP          hbm ;
                    107:      HDC              hdcMemory ;
                    108:      HPS              hps, hpsMemory ;
                    109:      LONG             alBmpFormats[2] ;
                    110:      POINTL           aptl[3] ;
                    111:      SIZEL            sizl ;
                    112:                                    // Create memory DC and PS
                    113: 
                    114:      hdcMemory = DevOpenDC (hab, OD_MEMORY, "*", 0L, NULL, NULL) ;
                    115: 
                    116:      sizl.cx = sizl.cy = 0 ;
                    117:      hpsMemory = GpiCreatePS (hab, hdcMemory, &sizl,
                    118:                               PU_PELS    | GPIF_DEFAULT |
                    119:                               GPIT_MICRO | GPIA_ASSOC) ;
                    120: 
                    121:                                    // Create bitmap for destination
                    122: 
                    123:      GpiQueryDeviceBitmapFormats (hpsMemory, 2L, alBmpFormats) ;
                    124: 
                    125:      bmp.cbFix     = sizeof bmp ;
                    126:      bmp.cx        = (USHORT) (prclTrack->xRight - prclTrack->xLeft) ;
                    127:      bmp.cy        = (USHORT) (prclTrack->yTop   - prclTrack->yBottom) ;
                    128:      bmp.cPlanes   = (USHORT) alBmpFormats[0] ;
                    129:      bmp.cBitCount = (USHORT) alBmpFormats[1] ;
                    130: 
                    131:      hbm = GpiCreateBitmap (hpsMemory, &bmp, 0L, NULL, NULL) ;
                    132: 
                    133:                                    // Copy from screen to bitmap
                    134:      if (hbm != NULL)
                    135:           {
                    136:           GpiSetBitmap (hpsMemory, hbm) ;
                    137:           hps = WinGetScreenPS (HWND_DESKTOP) ;
                    138: 
                    139:           aptl[0].x = 0 ;
                    140:           aptl[0].y = 0 ;
                    141:           aptl[1].x = bmp.cx ;
                    142:           aptl[1].y = bmp.cy ;
                    143:           aptl[2].x = prclTrack->xLeft ;
                    144:           aptl[2].y = prclTrack->yBottom ;
                    145: 
                    146:           WinLockVisRegions (HWND_DESKTOP, TRUE) ;
                    147: 
                    148:           GpiBitBlt (hpsMemory, hps, 3L, aptl, ROP_SRCCOPY, BBO_IGNORE);
                    149: 
                    150:           WinLockVisRegions (HWND_DESKTOP, FALSE) ;
                    151: 
                    152:           WinReleasePS (hps) ;
                    153:           }
                    154:                                    // Clean up
                    155:      GpiDestroyPS (hpsMemory) ;
                    156:      DevCloseDC (hdcMemory) ;
                    157: 
                    158:      return hbm ;
                    159:      }
                    160: 
                    161: HBITMAP CopyBitmap (HBITMAP hbmSrc)
                    162:      {
                    163:      BITMAPINFOHEADER bmp ;
                    164:      HBITMAP          hbmDst ;
                    165:      HDC              hdcSrc, hdcDst ;
                    166:      HPS              hpsSrc, hpsDst ;
                    167:      POINTL           aptl[3] ;
                    168:      SIZEL            sizl ;
                    169: 
                    170:                                    // Create memory DC's and PS's
                    171: 
                    172:      hdcSrc = DevOpenDC (hab, OD_MEMORY, "*", 0L, NULL, NULL) ;
                    173:      hdcDst = DevOpenDC (hab, OD_MEMORY, "*", 0L, NULL, NULL) ;
                    174: 
                    175:      sizl.cx = sizl.cy = 0 ;
                    176:      hpsSrc = GpiCreatePS (hab, hdcSrc, &sizl, PU_PELS    | GPIF_DEFAULT |
                    177:                                                GPIT_MICRO | GPIA_ASSOC) ;
                    178: 
                    179:      hpsDst = GpiCreatePS (hab, hdcDst, &sizl, PU_PELS    | GPIF_DEFAULT |
                    180:                                                GPIT_MICRO | GPIA_ASSOC) ;
                    181: 
                    182:                                    // Create bitmap
                    183: 
                    184:      GpiQueryBitmapParameters (hbmSrc, &bmp) ;
                    185:      hbmDst = GpiCreateBitmap (hpsDst, &bmp, 0L, NULL, NULL) ;
                    186: 
                    187:                                    // Copy from source to destination
                    188: 
                    189:      if (hbmDst != NULL)
                    190:           {
                    191:           GpiSetBitmap (hpsSrc, hbmSrc) ;
                    192:           GpiSetBitmap (hpsDst, hbmDst) ;
                    193: 
                    194:           aptl[0].x = aptl[0].y = 0 ;
                    195:           aptl[1].x = bmp.cx ;
                    196:           aptl[1].y = bmp.cy ;
                    197:           aptl[2]   = aptl[0] ;
                    198: 
                    199:           GpiBitBlt (hpsDst, hpsSrc, 3L, aptl, ROP_SRCCOPY, BBO_IGNORE) ;
                    200:           }
                    201:                                    // Clean up
                    202:      GpiDestroyPS (hpsSrc) ;
                    203:      GpiDestroyPS (hpsDst) ;
                    204:      DevCloseDC (hdcSrc) ;
                    205:      DevCloseDC (hdcDst) ;
                    206: 
                    207:      return hbmDst ;
                    208:      }
                    209: 
                    210: VOID BitmapCreationError (HWND hwnd)
                    211:      {
                    212:      WinMessageBox (HWND_DESKTOP, hwnd, "Cannot create bitmap.",
                    213:                     szClientClass, 0, MB_OK | MB_ICONEXCLAMATION) ;
                    214:      }
                    215: 
                    216: MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
                    217:      {
                    218:      static HBITMAP   hbm ;
                    219:      static HWND      hwndMenu ;
                    220:      static SHORT     sDisplay = IDM_ACTUAL ;
                    221:      HBITMAP          hbmClip ;
                    222:      HPS              hps ;
                    223:      RECTL            rclTrack, rclClient ;
                    224:      USHORT           usfInfo ;
                    225: 
                    226:      switch (msg)
                    227:           {
                    228:           case WM_CREATE:
                    229:                hwndMenu = WinWindowFromID (
                    230:                                WinQueryWindow (hwnd, QW_PARENT, FALSE),
                    231:                                FID_MENU) ;
                    232:                return 0 ;
                    233: 
                    234:           case WM_INITMENU:
                    235:                switch (SHORT1FROMMP (mp1))
                    236:                     {
                    237:                     case IDM_EDIT:
                    238:                          WinSendMsg (hwndMenu, MM_SETITEMATTR,
                    239:                                      MPFROM2SHORT (IDM_COPY, TRUE),
                    240:                                      MPFROM2SHORT (MIA_DISABLED,
                    241:                                           hbm != NULL ? 0 : MIA_DISABLED)) ;
                    242: 
                    243:                          WinSendMsg (hwndMenu, MM_SETITEMATTR,
                    244:                                      MPFROM2SHORT (IDM_PASTE, TRUE),
                    245:                                      MPFROM2SHORT (MIA_DISABLED,
                    246:                               WinQueryClipbrdFmtInfo (hab, CF_BITMAP, &usfInfo)
                    247:                                         ? 0 : MIA_DISABLED)) ;
                    248:                          return 0 ;
                    249:                     }
                    250:                break ;
                    251: 
                    252:           case WM_COMMAND:
                    253:                switch (COMMANDMSG(&msg)->cmd)
                    254:                     {
                    255:                     case IDM_COPY:
                    256:                                         // Make copy of stored bitmap
                    257: 
                    258:                          hbmClip = CopyBitmap (hbm) ;
                    259: 
                    260:                                         // Set clipboard data to copy of bitmap
                    261: 
                    262:                          if (hbmClip != NULL)
                    263:                               {
                    264:                               WinOpenClipbrd (hab) ;
                    265:                               WinEmptyClipbrd (hab) ;
                    266:                               WinSetClipbrdData (hab, (ULONG) hbmClip,
                    267:                                                  CF_BITMAP, CFI_HANDLE) ;
                    268:                               WinCloseClipbrd (hab) ;
                    269:                               }
                    270:                          else
                    271:                               BitmapCreationError (hwnd) ;
                    272:                          return 0 ;
                    273: 
                    274:                     case IDM_PASTE:
                    275:                                          // Get bitmap from clipboard
                    276: 
                    277:                          WinOpenClipbrd (hab) ;
                    278:                          hbmClip = WinQueryClipbrdData (hab, CF_BITMAP) ;
                    279: 
                    280:                          if (hbmClip != NULL)
                    281:                               {
                    282:                               if (hbm != NULL)
                    283:                                    GpiDeleteBitmap (hbm) ;
                    284: 
                    285:                                         // Make copy of it
                    286: 
                    287:                               hbm = CopyBitmap (hbmClip) ;
                    288: 
                    289:                               if (hbm == NULL)
                    290:                                    BitmapCreationError (hwnd) ;
                    291:                               }
                    292:                          WinCloseClipbrd (hab) ;
                    293:                          WinInvalidateRect (hwnd, NULL, FALSE) ;
                    294:                          return 0 ;
                    295: 
                    296:                     case IDM_CAPTURE:
                    297:                          if (BeginTracking (&rclTrack))
                    298:                               {
                    299:                               if (hbm != NULL)
                    300:                                    GpiDeleteBitmap (hbm) ;
                    301: 
                    302:                               hbm = CopyScreenToBitmap (&rclTrack) ;
                    303: 
                    304:                               if (hbm == NULL)
                    305:                                    BitmapCreationError (hwnd) ;
                    306: 
                    307:                               WinInvalidateRect (hwnd, NULL, FALSE) ;
                    308:                               }
                    309:                          return 0 ;
                    310: 
                    311:                     case IDM_ACTUAL:
                    312:                     case IDM_STRETCH:
                    313:                          WinSendMsg (hwndMenu, MM_SETITEMATTR,
                    314:                                      MPFROM2SHORT (sDisplay, TRUE),
                    315:                                      MPFROM2SHORT (MIA_CHECKED, 0)) ;
                    316: 
                    317:                          sDisplay = COMMANDMSG(&msg)->cmd ;
                    318: 
                    319:                          WinSendMsg (hwndMenu, MM_SETITEMATTR,
                    320:                                      MPFROM2SHORT (sDisplay, TRUE),
                    321:                                      MPFROM2SHORT (MIA_CHECKED, MIA_CHECKED)) ;
                    322: 
                    323:                          WinInvalidateRect (hwnd, NULL, FALSE) ;
                    324:                          return 0 ;
                    325:                     }
                    326: 
                    327:           case WM_PAINT:
                    328:                hps = WinBeginPaint (hwnd, NULL, NULL) ;
                    329:                GpiErase (hps) ;
                    330: 
                    331:                if (hbm != NULL)
                    332:                     {
                    333:                     WinQueryWindowRect (hwnd, &rclClient) ;
                    334: 
                    335:                     WinDrawBitmap (hps, hbm, NULL, (PPOINTL) &rclClient,
                    336:                                    CLR_NEUTRAL, CLR_BACKGROUND,
                    337:                                    sDisplay == IDM_STRETCH ?
                    338:                                         DBM_STRETCH : DBM_NORMAL) ;
                    339:                     }
                    340:                WinEndPaint (hps) ;
                    341:                return 0 ;
                    342: 
                    343:           case WM_DESTROY:
                    344:                if (hbm != NULL)
                    345:                     GpiDeleteBitmap (hbm) ;
                    346:                return 0 ;
                    347:           }
                    348:      return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
                    349:      }

unix.superglobalmegacorp.com

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