使鼠标move消息在你的鼠标离开窗体后,还发到当前窗体上来,不过是在当前窗体还处于激活状态,如你在别的窗体上按了左右健,活动焦点离开后,就不起作用了!

解决方案 »

  1.   

    比如你在BUTTON控件的MOUSEMOVE中加入了SetCapture,当MOUSE移出BUTTON之外时BUTTON的也可以收到MOUSEMOVE消息。
      

  2.   

    The SetCapture function sets the mouse capture to the specified window belonging to the current thread. Once a window has captured the mouse, all mouse input is directed to that window, regardless of whether the cursor is within the borders of that window. Only one window at a time can capture the mouse. If the mouse cursor is over a window created by another thread, the system will direct mouse input to the specified window only if a mouse button is down. HWND SetCapture(
      HWND hWnd   // handle to window
    );
      

  3.   

    捕获鼠标。一般情况下,如果你的鼠标移出了某个窗口所在的范围,那么此窗口将不再继续收到鼠标消息,如果你用SetCapture进行了鼠标捕获,那么,即使你的鼠标移出了窗口,仍然可以收到鼠标消息,直到你ReleaseCapture或在某个窗口上进行点击为止。
      

  4.   

    The example in this section demonstrates how to track the mouse cursor. It contains portions of a window procedure that enables the user to draw lines in a window's client area by dragging the mouse. When the window procedure receives a WM_LBUTTONDOWN message, it captures the mouse and saves the coordinates of the cursor, using the coordinates as the starting point of the line. It also uses the ClipCursor function to confine the cursor to the client area during the line drawing operation. During the first WM_MOUSEMOVE message, the window procedure draws a line from the starting point to the current position of the cursor. During subsequent WM_MOUSEMOVE messages, the window procedure erases the previous line by drawing over it with an inverted pen color. Then it draws a new line from the starting point to the new position of the cursor. The WM_LBUTTONUP message signals the end of the drawing operation. The window procedure releases the mouse capture and frees the mouse from the client area. LRESULT APIENTRY MainWndProc(HWND hwndMain, UINT uMsg, WPARAM wParam, LPARAM lParam) 

        HDC hdc;                       // handle to device context 
        RECT rcClient;                 // client area rectangle 
        POINT ptClientUL;              // client upper left corner 
        POINT ptClientLR;              // client lower right corner 
        static POINTS ptsBegin;        // beginning point 
        static POINTS ptsEnd;          // new endpoint 
        static POINTS ptsPrevEnd;      // previous endpoint 
        static BOOL fPrevLine = FALSE; // previous line flag 
     
        switch (uMsg) 
        { 
            case WM_LBUTTONDOWN: 
     
                // Capture mouse input. 
     
                SetCapture(hwndMain); 
     
                // Retrieve the screen coordinates of the client area, 
                // and convert them into client coordinates. 
     
                GetClientRect(hwndMain, &rcClient); 
                ptClientUL.x = rcClient.left; 
                ptClientUL.y = rcClient.top; 
     
                // Add one to the right and bottom sides, because the 
                // coordinates retrieved by GetClientRect do not 
                // include the far left and lowermost pixels. 
     
                ptClientLR.x = rcClient.right + 1; 
                ptClientLR.y = rcClient.bottom + 1; 
                ClientToScreen(hwndMain, &ptClientUL); 
                ClientToScreen(hwndMain, &ptClientLR); 
     
                // Copy the client coordinates of the client area 
                // to the rcClient structure. Confine the mouse cursor 
                // to the client area by passing the rcClient structure 
                // to the ClipCursor function. 
     
                SetRect(&rcClient, ptClientUL.x, ptClientUL.y, 
                    ptClientLR.x, ptClientLR.y); 
                ClipCursor(&rcClient); 
     
                // Convert the cursor coordinates into a POINTS 
                // structure, which defines the beginning point of the 
                // line drawn during a WM_MOUSEMOVE message. 
     
                ptsBegin = MAKEPOINTS(lParam); 
                return 0; 
     
            case WM_MOUSEMOVE: 
     
                // When moving the mouse, the user must hold down 
                // the left mouse button to draw lines. 
     
                if (wParam & MK_LBUTTON) 
                { 
     
                    // Retrieve a device context (DC) for the client area. 
     
                    hdc = GetDC(hwndMain); 
     
                    // The following function ensures that pixels of 
                    // the previously drawn line are set to white and 
                    // those of the new line are set to black. 
     
                    SetROP2(hdc, R2_NOTXORPEN); 
     
                    // If a line was drawn during an earlier WM_MOUSEMOVE 
                    // message, draw over it. This erases the line by 
                    // setting the color of its pixels to white. 
     
                    if (fPrevLine) 
                    { 
                        MoveToEx(hdc, ptsBegin.x, ptsBegin.y, 
                            (LPPOINT) NULL); 
                        LineTo(hdc, ptsPrevEnd.x, ptsPrevEnd.y); 
                    } 
     
                    // Convert the current cursor coordinates to a 
                    // POINTS structure, and then draw a new line. 
     
                    ptsEnd = MAKEPOINTS(lParam); 
                    MoveToEx(hdc, ptsBegin.x, ptsBegin.y, (LPPOINT) NULL); 
                    LineTo(hdc, ptsEnd.x, ptsEnd.y); 
     
                    // Set the previous line flag, save the ending 
                    // point of the new line, and then release the DC. 
     
                    fPrevLine = TRUE; 
                    ptsPrevEnd = ptsEnd; 
                    ReleaseDC(hwndMain, hdc); 
                } 
                break; 
     
            case WM_LBUTTONUP: 
     
                // The user has finished drawing the line. Reset the 
                // previous line flag, release the mouse cursor, and 
                // release the mouse capture. 
     
                fPrevLine = FALSE; 
                ClipCursor(NULL); 
                ReleaseCapture(); 
                return 0; 
     
            case WM_DESTROY: 
                PostQuitMessage(0); 
                break; 
     
            // Process other messages. 
      

  5.   

    是呀,就是那样的,说个例子,CB中写在mousedown中的事件,在鼠标
    移出窗体后还可以再捕获,VC中不一样。
    比如想做一个程序,用鼠标的位置得到窗口的相关信息,在主程序窗口
    点击一次后,不放开鼠标,移到别的程序窗口上,在VC 中如果不用SetCapture
    放开鼠标的消息,主程序窗口就收不到,没办法得到目标窗口的信息了。
    SetCapture后就可以了。不过别忘了再ReleaseCapture,不然可坏了,呵呵
      

  6.   

    SetCapture  ( long hwnd  )  
    说明 
    将鼠标捕获设置到指定的窗口。在鼠标按钮按下的时候,这个窗口会为当前应用程序或整个系统接收所有鼠标输入 
    返回值 
    Long,之前拥有鼠标捕获的窗口的句柄 
    参数表 
    参数 类型及说明 
    hwnd  ,要接收所有鼠标输入的窗口的句柄 
     我的理解:与ReleaseCapture函数一起使用,用于判断鼠标离开 
      

  7.   

    CDialog::OnLButtonDown(..) {
    if(..)
    ...
    SetCapture();
    }CDialog::OnLButtonUp(..) {
    if(..)
    ..
    ReleaseCapture();
    }
      

  8.   

    在我印象中,这个函数好象只在windows3.2以前的版本中有效啊。
      

  9.   

    一个很简单的例子,Windows画图里面,你按住鼠标左键,拖拉鼠标,画出一条直线..
    在这个例子里,鼠标左键按下去以前,你根本不需要知道鼠标移动,鼠标目前位置的任何信息......
    但一旦鼠标左键一旦按下去以后,以及鼠标左键松开之前,你需要随时知道鼠标的位置情况......这个时候就可以用到SetCapture()
    在LButtonDown(...)里,SetCapture();
    在LButtonUp(....)里,添加: if(GetCapture() == this) ReleaseCapture();
    在OnMouseMove(..)里,添加: 
             if(GetCapture() == this)
             {
                 //添加你对鼠标位置的响应函数     
              }
      

  10.   

    SetCapture() 主要是为了把鼠标限制在客户区之内。比如你在画一条直线时就可以防止把直线画到客户区之外
      

  11.   

    SetCapture() 主要是为了捕捉鼠标,把鼠标限制在客户区之内。比如你在画一条直线时就可以防止把直线画到客户区之外
      

  12.   

    在WIN2000中也有效,我昨天还用了呢