有谁知道SetCapture()的用法吗?
给个例子吧~

解决方案 »

  1.   

    你是什么意思?SetCapture不就是对鼠标的行踪进行追踪吗?有什么具体问题?
      

  2.   

    SetCapture()捕获捉鼠标。用后 ReleaseCapture();
      

  3.   

    BLOKOUT2.C
    /*----------------------------------------------------------------------------
        BLOKOUT2.C --  Mouse Button & Capture Demo Program
    (c) Charles Petzold, 1998
    ----------------------------------------------------------------------------*/#include <windows.h>
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR szCmdLine, int iCmdShow)
    {
          static TCHAR  szAppName[] = TEXT ("BlokOut2") ;
          HWND          hwnd ;
          MSG           msg ;
          WNDCLASS      wndclass ;     wndclass.style   = CS_HREDRAW | CS_VREDRAW ;
          wndclass.lpfnWndProc    = WndProc ;
          wndclass.cbClsExtra     = 0 ;
          wndclass.cbWndExtra     = 0 ;
          wndclass.hInstance      = hInstance ;
          wndclass.hIcon          = LoadIcon (NULL, IDI_APPLICATION) ;
      wndclass.hCursor        = LoadCursor (NULL, IDC_ARROW) ;
          wndclass.hbrBackground  = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
          wndclass.lpszMenuName  = NULL ;
          wndclass.lpszClassName  = szAppName ;
         
    if (!RegisterClass (&wndclass))
          {
       MessageBox ( NULL, TEXT ("Program requires Windows NT!"), 
    szAppName, MB_ICONERROR) ;
    return 0 ;
      }      hwnd = CreateWindow ( szAppName, TEXT ("Mouse Button & Capture Demo"),
    WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        NULL, NULL, hInstance, NULL) ;
         
          ShowWindow (hwnd, iCmdShow) ;
          UpdateWindow (hwnd) ;
         
          while (GetMessage (&msg, NULL, 0, 0))
          {
               TranslateMessage (&msg) ;
               DispatchMessage (&msg) ;
          }
          return msg.wParam ;
    }void DrawBoxOutline (HWND hwnd, POINT ptBeg, POINT ptEnd)
    {
          HDC hdc ;
          hdc = GetDC (hwnd) ;
          SetROP2 (hdc, R2_NOT) ;
          SelectObject (hdc, GetStockObject (NULL_BRUSH)) ;
          Rectangle (hdc, ptBeg.x, ptBeg.y, ptEnd.x, ptEnd.y) ;
         
          ReleaseDC (hwnd, hdc) ;
    }LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
    {
          static BOOL  fBlocking, fValidBox ;
          static POINT ptBeg, ptEnd, ptBoxBeg, ptBoxEnd ;
          HDC          hdc ;
          PAINTSTRUCT  ps ;
         
          switch (message)
          {
          case  WM_LBUTTONDOWN :
               ptBeg.x = ptEnd.x = LOWORD (lParam) ;
               ptBeg.y = ptEnd.y = HIWORD (lParam) ;
              
               DrawBoxOutline (hwnd, ptBeg, ptEnd) ;           SetCapture (hwnd) ;
               SetCursor (LoadCursor (NULL, IDC_CROSS)) ;
              
               fBlocking = TRUE ;
               return 0 ;
              
          case  WM_MOUSEMOVE :
               if (fBlocking)
               {
                    SetCursor (LoadCursor (NULL, IDC_CROSS)) ;
                   
                    DrawBoxOutline (hwnd, ptBeg, ptEnd) ;
                   
                    ptEnd.x = LOWORD (lParam) ;
                    ptEnd.y = HIWORD (lParam) ;
                   
                    DrawBoxOutline (hwnd, ptBeg, ptEnd) ;
               }
             return 0 ;
              
          case  WM_LBUTTONUP :
               if (fBlocking)
               {
                    DrawBoxOutline (hwnd, ptBeg, ptEnd) ;
                   
                    ptBoxBeg    = ptBeg ;
                    ptBoxEnd.x  = LOWORD (lParam) ;
                    ptBoxEnd.y  = HIWORD (lParam) ;
                   
                    ReleaseCapture () ;
                    SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
                   
                    fBlocking  = FALSE ;
                    fValidBox   = TRUE ;
                   
                    InvalidateRect (hwnd, NULL, TRUE) ;
               }
               return 0 ;
              
          case  WM_CHAR :
               if (fBlocking & wParam == '\x1B')       // i.e., Escape
               {
                    DrawBoxOutline (hwnd, ptBeg, ptEnd) ;
                    ReleaseCapture () ;
                    SetCursor (LoadCursor (NULL, IDC_ARROW)) ;                fBlocking = FALSE ;
               }
               return 0 ;
              
          case  WM_PAINT :
               hdc = BeginPaint (hwnd, &ps) ;
              
               if (fValidBox)
              {
                    SelectObject (hdc, GetStockObject (BLACK_BRUSH)) ;
                    Rectangle (hdc, ptBoxBeg.x, ptBoxBeg.y,
                         ptBoxEnd.x, ptBoxEnd.y) ;
               }
              
               if (fBlocking)
               {
                    SetROP2 (hdc, R2_NOT) ;
                    SelectObject (hdc, GetStockObject (NULL_BRUSH)) ;
                    Rectangle (hdc, ptBeg.x, ptBeg.y, ptEnd.x, ptEnd.y) ;
               }
              
               EndPaint (hwnd, &ps) ;
               return 0 ;
              
          case  WM_DESTROY :
               PostQuitMessage (0) ;
               return 0 ;
          }
          return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    摘自《Windows Programming》
      

  4.   

    直接输入SetCapture()不就可以了吗?没有参数的。
    setcapture之后,鼠标的状态是不变的,你还可以捕获LButtonDown等消息,只是当鼠标离开窗体以后,还能捕捉到。这就是他的用途。记得用了SetCapture()之后,还要用ReleaseCapture()将它释放,否则,鼠标会很不听话的。
      

  5.   

    在LButtonDown中用SetCapture捕获鼠标,MouseMove中操作,LButtonUp中用ReleaseCapture释放鼠标!