home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / progwin / chap16 / blowup2.c next >
Encoding:
C/C++ Source or Header  |  1990-11-12  |  5.6 KB  |  175 lines

  1. /*------------------------------------------------
  2.    BLOWUP2.C -- Capture Screen Image to Clipboard
  3.                 (c) Charles Petzold, 1990
  4.   ------------------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include <stdlib.h>
  8.  
  9. long FAR PASCAL WndProc (HWND, WORD, WORD, LONG) ;
  10.  
  11. int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
  12.                     LPSTR lpszCmdLine, int nCmdShow)
  13.      {
  14.      static char szAppName [] = "Blowup2" ;
  15.      HWND        hwnd ;
  16.      MSG         msg ;
  17.      WNDCLASS    wndclass ;
  18.  
  19.      if (!hPrevInstance) 
  20.           {
  21.           wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  22.           wndclass.lpfnWndProc   = WndProc ;
  23.           wndclass.cbClsExtra    = 0 ;
  24.           wndclass.cbWndExtra    = 0 ;
  25.           wndclass.hInstance     = hInstance ;
  26.           wndclass.hIcon         = NULL ;
  27.           wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  28.           wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
  29.           wndclass.lpszMenuName  = NULL ;
  30.           wndclass.lpszClassName = szAppName ;
  31.  
  32.           RegisterClass (&wndclass) ;
  33.           }
  34.  
  35.      hwnd = CreateWindow (szAppName, szAppName, 
  36.                           WS_OVERLAPPEDWINDOW,
  37.                           CW_USEDEFAULT, CW_USEDEFAULT,
  38.                           CW_USEDEFAULT, CW_USEDEFAULT,
  39.                           NULL, NULL, hInstance, NULL) ;
  40.  
  41.      ShowWindow (hwnd, nCmdShow) ;
  42.      UpdateWindow (hwnd) ;
  43.  
  44.      while (GetMessage (&msg, NULL, 0, 0))
  45.           {
  46.           TranslateMessage (&msg) ;
  47.           DispatchMessage (&msg) ;
  48.           }
  49.      return msg.wParam ;
  50.      }
  51.  
  52. void InvertBlock (HWND hwnd, POINT org, POINT len)
  53.      {
  54.      HDC   hdc ;
  55.  
  56.      hdc = CreateDC ("DISPLAY", NULL, NULL, NULL) ;
  57.      ClientToScreen (hwnd, &org) ;
  58.      PatBlt (hdc, org.x, org.y, len.x, len.y, DSTINVERT) ;
  59.      DeleteDC (hdc) ;
  60.      }
  61.  
  62. long FAR PASCAL WndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
  63.      {
  64.      static BOOL  bCapturing, bBlocking ;
  65.      static POINT org, len ;
  66.      static short cxClient, cyClient ;
  67.      BITMAP       bm ;
  68.      HDC          hdc, hdcMem ;
  69.      HBITMAP      hBitmap ;
  70.      PAINTSTRUCT  ps ;
  71.  
  72.      switch (message)
  73.           {
  74.           case WM_SIZE:
  75.                cxClient = LOWORD (lParam) ;
  76.                cyClient = HIWORD (lParam) ;
  77.                return 0 ;
  78.  
  79.           case WM_LBUTTONDOWN:
  80.                if (!bCapturing)
  81.                     {
  82.                     bCapturing = TRUE ;
  83.                     SetCapture (hwnd) ;
  84.                     SetCursor (LoadCursor (NULL, IDC_CROSS)) ;
  85.                     }
  86.                else if (!bBlocking)
  87.                     {
  88.                     bBlocking = TRUE ;
  89.                     org = MAKEPOINT (lParam) ;
  90.                     }
  91.                return 0 ;
  92.  
  93.           case WM_MOUSEMOVE:
  94.                if (bCapturing)
  95.                     SetCursor (LoadCursor (NULL, IDC_CROSS)) ;
  96.  
  97.                if (bBlocking)
  98.                     {
  99.                     len = MAKEPOINT (lParam) ;
  100.                     len.x -= org.x ;
  101.                     len.y -= org.y ;
  102.  
  103.                     InvertBlock (hwnd, org, len) ;
  104.                     InvertBlock (hwnd, org, len) ;
  105.                     }
  106.                return 0 ;
  107.  
  108.           case WM_LBUTTONUP:
  109.                if (!bBlocking)
  110.                     break ;
  111.  
  112.                bCapturing = bBlocking = FALSE ;
  113.                SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
  114.                ReleaseCapture () ;
  115.  
  116.                if (len.x == 0 || len.y == 0)
  117.                     break ;
  118.  
  119.                hdc = GetDC (hwnd) ;
  120.                hdcMem = CreateCompatibleDC (hdc) ;
  121.                hBitmap = CreateCompatibleBitmap (hdc,
  122.                                     abs (len.x), abs (len.y)) ;
  123.                if (hBitmap)
  124.                     {
  125.                     SelectObject (hdcMem, hBitmap) ;
  126.                     StretchBlt (hdcMem, 0, 0, abs (len.x), abs (len.y),
  127.                          hdc, org.x, org.y, len.x, len.y, SRCCOPY) ;
  128.  
  129.                     OpenClipboard (hwnd) ;
  130.                     EmptyClipboard () ;
  131.                     SetClipboardData (CF_BITMAP, hBitmap) ;
  132.                     CloseClipboard () ;
  133.  
  134.                     InvalidateRect (hwnd, NULL, TRUE) ;
  135.                     }
  136.                else
  137.                     MessageBeep (0) ;
  138.  
  139.                DeleteDC (hdcMem) ;
  140.                ReleaseDC (hwnd, hdc) ;
  141.                return 0 ;
  142.  
  143.           case WM_PAINT:
  144.                InvalidateRect (hwnd, NULL, TRUE) ;
  145.                hdc = BeginPaint (hwnd, &ps) ;
  146.                OpenClipboard (hwnd) ;
  147.  
  148.                if (hBitmap = GetClipboardData (CF_BITMAP))
  149.                     {
  150.                     SetCursor (LoadCursor (NULL, IDC_WAIT)) ;
  151.  
  152.                     hdcMem = CreateCompatibleDC (hdc) ;
  153.                     SelectObject (hdcMem, hBitmap) ;
  154.                     GetObject (hBitmap, sizeof (BITMAP), (LPSTR) &bm) ;
  155.  
  156.                     SetStretchBltMode (hdc, COLORONCOLOR) ;
  157.                     StretchBlt (hdc, 0, 0, cxClient, cyClient,
  158.                                 hdcMem, 0, 0, bm.bmWidth, bm.bmHeight,
  159.                                                   SRCCOPY) ;
  160.  
  161.                     SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
  162.                     DeleteDC (hdcMem) ;
  163.                     }
  164.  
  165.                CloseClipboard () ;
  166.                EndPaint (hwnd, &ps) ;
  167.                return 0 ;
  168.  
  169.           case WM_DESTROY:
  170.                PostQuitMessage (0) ;
  171.                return 0 ;
  172.           }
  173.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  174.      }
  175.