home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / msj / msjv2_3 / blowup / blowup.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-03-02  |  6.4 KB  |  216 lines

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