home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / win_lrn / comm / setcapt.c < prev    next >
C/C++ Source or Header  |  1988-08-10  |  5KB  |  133 lines

  1. /*
  2.  *  SetCapture() & ReleaseCapture()
  3.  *  setcapt.c
  4.  *
  5.  *  This program demonstrates the use of the functions SetCapture()
  6.  *  and ReleaseCapture(). It causes all subsequent mouse input to be
  7.  *  sent to the specified window, regardless of the position of the
  8.  *  mouse cursor. Capture can be released by pressing the right
  9.  *  mouse button.
  10.  *
  11.  */
  12.  
  13. #include "windows.h"
  14. #include "stdio.h"
  15. #include "string.h"
  16.  
  17. long FAR PASCAL SampleWindowProc (HWND, unsigned, WORD, LONG);
  18.  
  19. /* Procedure called when the application is loaded for the first time */
  20. BOOL WinInit( hInstance )
  21. HANDLE hInstance;
  22. {
  23.     WNDCLASS   wcClass;
  24.  
  25.     /* registering the parent window class */
  26.     wcClass.hCursor        = LoadCursor( NULL, IDC_ARROW );
  27.     wcClass.hIcon          = LoadIcon (hInstance, (LPSTR)"WindowIcon");
  28.     wcClass.lpszMenuName   = (LPSTR)NULL;
  29.     wcClass.lpszClassName  = (LPSTR)"Setcapt";
  30.     wcClass.hbrBackground  = (HBRUSH)GetStockObject( WHITE_BRUSH );
  31.     wcClass.hInstance      = hInstance;
  32.     wcClass.style          = CS_HREDRAW | CS_VREDRAW;
  33.     wcClass.lpfnWndProc    = SampleWindowProc;
  34.     wcClass.cbClsExtra     = 0;
  35.     wcClass.cbWndExtra     = 0;
  36.  
  37.     RegisterClass( (LPWNDCLASS)&wcClass );
  38.     return TRUE;        /* Initialization succeeded */
  39. }
  40.  
  41.  
  42. int PASCAL WinMain( hInstance, hPrevInstance, lpszCmdLine, cmdShow )
  43. HANDLE hInstance, hPrevInstance;
  44. LPSTR lpszCmdLine;
  45. int cmdShow;
  46. {
  47.     HWND   hWnd;                /* Handle to the parent window    */
  48.     MSG    msg;                 /* Window messages                */
  49.  
  50.     WinInit (hInstance);
  51.  
  52.     hWnd = CreateWindow((LPSTR)"Setcapt",
  53.                         (LPSTR)"Setting Mouse Capture",
  54.                         WS_OVERLAPPEDWINDOW,
  55.                         50,                /* x         */
  56.                         50,                /* y         */
  57.                         600,               /* width     */
  58.                         250,               /* height    */
  59.                         (HWND)NULL,        /* no parent */
  60.                         (HMENU)NULL,       /* use class menu */
  61.                         (HANDLE)hInstance, /* handle to window instance */
  62.                         (LPSTR)NULL        /* no params to pass on */
  63.                        );
  64.  
  65.     /* Make window visible according to the way the app is activated */
  66.     ShowWindow( hWnd, cmdShow );
  67.     UpdateWindow( hWnd );
  68.  
  69.     /* All mouse input will be sent to this window */
  70.     MessageBox (hWnd, (LPSTR)"Press OK to capture the mouse", (LPSTR)"Start", MB_OK);
  71.     SetCapture (hWnd);
  72.           
  73.     /* The window message loop */
  74.     while (GetMessage ((LPMSG)&msg, NULL, 0, 0))
  75.       { 
  76.          TranslateMessage ((LPMSG)&msg);
  77.          DispatchMessage  ((LPMSG)&msg);
  78.       }
  79.   
  80.     return (int)msg.wParam;
  81. }
  82.  
  83.  
  84. /* The window procedure */
  85. long FAR PASCAL SampleWindowProc (hWnd, message, wParam, lParam)
  86. HWND     hWnd;
  87. unsigned message;
  88. WORD     wParam;
  89. LONG     lParam;
  90. {
  91.     POINT ptMousePos;      /* The location of the current mouse position */
  92.     HDC   hDC;             /* Handle to the display context              */
  93.     char  szBuffer[40];    /* String buffer used for output              */
  94.     short nBytes;          /* Number of character in the string buffer   */
  95.  
  96.     switch (message)
  97.       {
  98.         case WM_PAINT:
  99.           hDC = GetDC (hWnd);
  100.           TextOut (hDC, 10, 10, (LPSTR)"Even when the mouse is out of this window,", 42);
  101.           TextOut (hDC, 10, 20, (LPSTR)"the mouse input is still sent to this window.", 45);
  102.           TextOut (hDC, 10, 30, (LPSTR)"Press the right mouse button to release the mouse capture.", 58);
  103.           ValidateRect (hWnd, (LPRECT)NULL);
  104.           ReleaseDC (hWnd, hDC);
  105.           break; 
  106.  
  107.         /* All the mouse messages will come through this window procedure
  108.          * after the mouse is captured, even if the mouse is outside of 
  109.          * this window.
  110.          */
  111.         case WM_MOUSEMOVE:
  112.           hDC = GetDC (hWnd);
  113.           ptMousePos = MAKEPOINT (lParam);
  114.           nBytes = sprintf (szBuffer, "The Mouse is now at: X = %d, Y = %d   ", 
  115.                             ptMousePos.x, ptMousePos.y);
  116.           TextOut (hDC, 50, 50, (LPSTR)szBuffer, nBytes);
  117.           ReleaseDC (hWnd, hDC);
  118.           break;
  119.  
  120.         /* The mouse must be released before you can exit this program */
  121.         case WM_RBUTTONDOWN:
  122.           ReleaseCapture();
  123.           MessageBox (hWnd, (LPSTR)"Mouse is released",
  124.                       (LPSTR)"ReleaseCapture()", MB_OK);
  125.           break;
  126.  
  127.         default:
  128.           return (DefWindowProc (hWnd, message, wParam, lParam));
  129.           break;
  130.       }
  131.     return 0L;
  132. }
  133.