home *** CD-ROM | disk | FTP | other *** search
/ Phoenix CD 2.0 / Phoenix_CD.cdr / 01e / msjall.zip / MSJV2-3.ZIP / BLOWUP.ALL next >
Text File  |  1987-10-30  |  7KB  |  244 lines

  1. Microsoft Systems Journal
  2. Volume 2; Issue 2; July, 1987
  3.  
  4. Code Listings For:
  5.  
  6.     BLOWUP
  7.     pp. 51-58
  8.  
  9. Author(s): Charles Petzold
  10. Title:     BLOWUP: A Windows Utility for Viewing and Manipulating Bitmaps
  11.  
  12.  
  13.  
  14.  
  15. /* BLOWUP.C -- Capture Screen Image to Clipboard by Charles Petzold */
  16.  
  17. #include <windows.h>
  18. #include <stdlib.h>
  19.  
  20. long FAR PASCAL WndProc (HWND, unsigned, WORD, LONG) ;
  21.  
  22. int PASCAL WinMain (hInstance, hPrevInstance, lpszCmdLine, nCmdShow)
  23.      HANDLE         hInstance, hPrevInstance ;
  24.      LPSTR          lpszCmdLine ;
  25.      int            nCmdShow ;
  26.      {
  27.      static char    szAppName [] = "Blowup" ;
  28.      HWND           hWnd ;
  29.      MSG            msg ;
  30.      WNDCLASS       wndclass ;
  31.  
  32.      if (!hPrevInstance) 
  33.           {
  34.           wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  35.           wndclass.lpfnWndProc   = WndProc ;
  36.           wndclass.cbClsExtra    = 0 ;
  37.           wndclass.cbWndExtra    = 0 ;
  38.           wndclass.hInstance     = hInstance ;
  39.           wndclass.hIcon         = NULL ;
  40.           wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  41.           wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
  42.           wndclass.lpszMenuName  = NULL ;
  43.           wndclass.lpszClassName = szAppName ;
  44.  
  45.           if (!RegisterClass (&wndclass))
  46.                return FALSE ;
  47.           }
  48.  
  49.      hWnd = CreateWindow (szAppName, szAppName, 
  50.                     WS_TILEDWINDOW,
  51.                     0, 0, 0, 0,
  52.                     NULL, NULL, hInstance, NULL) ;
  53.  
  54.      ShowWindow (hWnd, nCmdShow) ;
  55.      UpdateWindow (hWnd) ;
  56.  
  57.      while (GetMessage (&msg, NULL, 0, 0))
  58.           {
  59.           TranslateMessage (&msg) ;
  60.           DispatchMessage (&msg) ;
  61.           }
  62.      return msg.wParam ;
  63.      }
  64.  
  65. void InvertBlock (hWnd, org, len)
  66.      HWND  hWnd ;
  67.      POINT org, len ;
  68.      {
  69.      HDC   hDC ;
  70.  
  71.      hDC = CreateDC ("DISPLAY", NULL, NULL, NULL) ;
  72.      ClientToScreen (hWnd, &org) ;
  73.      PatBlt (hDC, org.x, org.y, len.x, len.y, DSTINVERT) ;
  74.      DeleteDC (hDC) ;
  75.      }
  76.  
  77. long FAR PASCAL WndProc (hWnd, iMessage, wParam, lParam)
  78.      HWND           hWnd ;
  79.      unsigned       iMessage ;
  80.      WORD           wParam ;
  81.      LONG           lParam ;
  82.      {
  83.      static BOOL    bCapturing, bBlocking ;
  84.      static HWND    hWndNext ;
  85.      static POINT   org, len ;
  86.      static short   xClient, yClient ;
  87.      BITMAP         bm ;
  88.      HDC            hDC, hMemDC ;
  89.      HBITMAP        hBitmap ;
  90.      PAINTSTRUCT    ps ;
  91.  
  92.      switch (iMessage)
  93.           {
  94.           case WM_CREATE:
  95.                hWndNext = SetClipboardViewer (hWnd) ;
  96.                break ;
  97.  
  98.           case WM_SIZE:
  99.                xClient = LOWORD (lParam) ;
  100.                yClient = HIWORD (lParam) ;
  101.                break ;
  102.  
  103.           case WM_LBUTTONDOWN:
  104.                if (!bCapturing)
  105.                     {
  106.                     bCapturing = TRUE ;
  107.                     SetCapture (hWnd) ;
  108.                     SetCursor (LoadCursor (NULL, IDC_CROSS)) ;
  109.                     }
  110.                else if (!bBlocking)
  111.                     {
  112.                     bBlocking = TRUE ;
  113.                     org = MAKEPOINT (lParam) ;
  114.                     }
  115.                break ;
  116.  
  117.           case WM_MOUSEMOVE:
  118.                if (bCapturing)
  119.                     SetCursor (LoadCursor (NULL, IDC_CROSS)) ;
  120.  
  121.                if (bBlocking)
  122.                     {
  123.                     len = MAKEPOINT (lParam) ;
  124.                     len.x -= org.x ;
  125.                     len.y -= org.y ;
  126.  
  127.                     InvertBlock (hWnd, org, len) ;
  128.                     InvertBlock (hWnd, org, len) ;
  129.                     }
  130.                break ;
  131.  
  132.           case WM_LBUTTONUP:
  133.                if (!bBlocking)
  134.                     break ;
  135.  
  136.                bCapturing = bBlocking = FALSE ;
  137.                SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
  138.                ReleaseCapture () ;
  139.  
  140.                if (len.x == 0 || len.y == 0)
  141.                     break ;
  142.  
  143.                hDC = GetDC (hWnd) ;
  144.                hMemDC = CreateCompatibleDC (hDC) ;
  145.                hBitmap = CreateCompatibleBitmap (hDC,
  146.                                    abs (len.x), abs (len.y)) ;
  147.                if (hBitmap)
  148.                     {
  149.                     SelectObject (hMemDC, hBitmap) ;
  150.                     StretchBlt (hMemDC, 0, 0, abs (len.x), abs (len.y),
  151.                          hDC, org.x, org.y, len.x, len.y, SRCCOPY) ;
  152.  
  153.                     OpenClipboard (hWnd) ;
  154.                     EmptyClipboard () ;
  155.                     SetClipboardData (CF_BITMAP, hBitmap) ;
  156.                     CloseClipboard () ;
  157.                     }
  158.                else
  159.                     MessageBeep (0) ;
  160.  
  161.                DeleteDC (hMemDC) ;
  162.                ReleaseDC (hWnd, hDC) ;
  163.                break ;
  164.  
  165.           case WM_PAINT:
  166.                hDC = BeginPaint (hWnd, &ps) ;
  167.                OpenClipboard (hWnd) ;
  168.  
  169.                if (hBitmap = GetClipboardData (CF_BITMAP))
  170.                     {
  171.                     SetCursor (LoadCursor (NULL, IDC_WAIT)) ;
  172.  
  173.                     hMemDC = CreateCompatibleDC (hDC) ;
  174.                     SelectObject (hMemDC, hBitmap) ;
  175.                     GetObject (hBitmap, sizeof (BITMAP), (LPSTR) &bm) ;
  176.  
  177.                     SetStretchBltMode (hDC, COLORONCOLOR) ;
  178.                     StretchBlt (hDC, 0, 0, xClient, yClient,
  179.                                 hMemDC, 0, 0, bm.bmWidth, bm.bmHeight,
  180.                                                   SRCCOPY) ;
  181.  
  182.                     SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
  183.                     DeleteDC (hMemDC) ;
  184.                     }
  185.                CloseClipboard () ;
  186.                EndPaint (hWnd, &ps) ;
  187.                break ;
  188.  
  189.           case WM_DRAWCLIPBOARD :
  190.                if (hWndNext)
  191.                     SendMessage (hWndNext, iMessage, wParam, lParam) ;
  192.  
  193.                InvalidateRect (hWnd, NULL, TRUE) ;
  194.                break;
  195.  
  196.           case WM_CHANGECBCHAIN :
  197.                if (wParam == hWndNext)
  198.                     hWndNext = LOWORD (lParam) ;
  199.  
  200.                else if (hWndNext)
  201.                     SendMessage (hWndNext, iMessage, wParam, lParam) ;
  202.                break ;
  203.  
  204.           case WM_DESTROY:
  205.                ChangeClipboardChain (hWnd, hWndNext) ;
  206.                PostQuitMessage (0) ;
  207.                break ;
  208.  
  209.           default:
  210.                return DefWindowProc (hWnd, iMessage, wParam, lParam) ;
  211.           }
  212.      return 0L ;
  213.      }
  214. =============================[ End Listing ]==================================
  215.  
  216.  
  217.  
  218.  
  219. MAKE File for BLOWUP
  220.  
  221.  
  222. blowup.obj : blowup.c
  223.      cl -c -d -D LINT_ARGS -Gsw -Os -W2 -Zdp blowup.c
  224.  
  225. blowup.exe : blowup.obj blowup.def
  226.      link4 blowup, /align:16, /map /line, slibw, blowup
  227.      mapsym blowup
  228. =============================[ End Listing ]==================================
  229.  
  230.  
  231.  
  232. DEF File for BLOWUP
  233.  
  234.  
  235. NAME           BLOWUP
  236. DESCRIPTION    'Capture Screen Image to Clipboard by Charles Petzold'
  237. STUB           'WINSTUB.EXE'
  238. CODE           MOVABLE
  239. DATA           MOVABLE MULTIPLE
  240. HEAPSIZE       1024
  241. STACKSIZE      4096
  242. EXPORTS        WndProc
  243. =============================[ End Listing ]==================================
  244.