既然鼠标离开了窗口,点就已经不起作用了,也就是说else后就不起作用了。

解决方案 »

  1.   

    哈哈,告诉你用settime GetCapture,不要用SetCapture啊,那很占系统资源
      

  2.   

    我对vc也不熟悉,我说说我的看法:
    只有当鼠标在你的对话框之内时windows才会将鼠标消息发给你的应用程序,
    你的对话框消息处理过程才会对它进行处理(当然如果你进行了鼠标捕捉除外),
    上面你的程序在wm_mousemove消息处理程序中实现这样的功能是有问题的,因为
    你的对话框只可能接收到鼠标在对话框范围之内的鼠标移动消息,当鼠标移出对话框
    之后,你的程序不可能收到wm_mousemove消息了,所以你的OnMouseMove()函数中
    的else后的部分永远都不可能得到执行。
      

  3.   

    to supperlxf(嘿嘿) 我试试你的方法。应该不错
      

  4.   

    用_TrackMouseEvent()函数把,可以达到ToolBar那样的灵敏效果:
    //set track mousre event
    TRACKMOUSEEVENT TMEStruct = {
    sizeof(TRACKMOUSEEVENT),
    TME_LEAVE,
    m_hWnd,
    0
    };
    _TrackMouseEvent(&TMEStruct);
    //cancel track mouse event
    TRACKMOUSEEVENT TMEStruct = {
    sizeof(TRACKMOUSEEVENT),
    TME_CANCEL | TME_LEAVE,
    m_hWnd,
    0
    };
    _TrackMouseEvent(&TMEStruct);
    然后就可以在窗口中手工重载WM_MOUSELEAVE消息,此消息在鼠标离开窗口时就会发给窗口.
      

  5.   

    谢谢 In355Hz(好象一条狗)  请看看,我现在改成这样。
    好象只能响应else 的语句了。鼠标放上去,没有反应。 void CRf001Dlg::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
       
    CPoint point;
        CRect rect;
        GetWindowRect(&rect);
        ClientToScreen(&point);    if (rect.PtInRect(point))
        {
    ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100,  SWP_SHOWWINDOW);    }
    else
        {
    ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,200, 410, 250, 100,  SWP_SHOWWINDOW);
       
        }
    CDialog::OnTimer(nIDEvent);
    }
      

  6.   

    这样:
      void CRf001Dlg::OnTimer(UINT nIDEvent) 
    {
        // TODO: Add your message handler code here and/or call default
      
        CPoint point;
        CRect rect;
        GetWindowRect(&rect);
        //  ClientToScreen(&point);    if (rect.PtInRect(point))
        {
        ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100,  SWP_SHOWWINDOW);    }
        else
        {
        ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,200, 410, 250, 100,  SWP_SHOWWINDOW);
      
        }
        CDialog::OnTimer(nIDEvent);
      

  7.   

    漏了:  void CRf001Dlg::OnTimer(UINT nIDEvent) 
    {
        // TODO: Add your message handler code here and/or call default
      
        CPoint point;
        CRect rect;
        //GetWindowRect(&rect);
        //  ClientToScreen(&point);
        GetCapture(.....)
        if (rect.PtInRect(point))
        {
        ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100,  SWP_SHOWWINDOW);    }
        else
        {
        ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,200, 410, 250, 100,  SWP_SHOWWINDOW);
      
        }
        CDialog::OnTimer(nIDEvent);
    }   
      

  8.   

    to  supperlxf(嘿嘿) 鼠标离开后,还是没有响应
      

  9.   

    void CRf001Dlg::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
       
    CPoint point;
        CRect rect;
        GetWindowRect(&rect);
    //    ClientToScreen(&point);
    GetCapture();
        
        if (rect.PtInRect(point))
        {
    ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100,  SWP_SHOWWINDOW);    }
    else
        {
    ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,160, 110, 250, 100,  SWP_SHOWWINDOW);
       
        }
    CDialog::OnTimer(nIDEvent);
    }
      

  10.   

    看我这:
         void CRf001Dlg::OnTimer(UINT nIDEvent) 
    {
        // TODO: Add your message handler code here and/or call default
      
        CPoint point;
        CRect rect;
        GetWindowRect(&rect);
        //  ClientToScreen(&point);
        GetCapture(point)
        if (rect.PtInRect(point))
        {
        ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100,  SWP_SHOWWINDOW);    }
        else
        {
        ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,200, 410, 250, 100,  SWP_SHOWWINDOW);
      
        }
        CDialog::OnTimer(nIDEvent);
    }  
      

  11.   

    吐血:
      
        void CRf001Dlg::OnTimer(UINT nIDEvent) 
    {
        // TODO: Add your message handler code here and/or call default
      
        CPoint point;
        CRect rect;
        GetWindowRect(&rect);
        //  ClientToScreen(&point);
        point=GetCapture();
        if (rect.PtInRect(point))
        {
        ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100,  SWP_SHOWWINDOW);    }
        else
        {
        ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,200, 410, 250, 100,  SWP_SHOWWINDOW);
      
        }
        CDialog::OnTimer(nIDEvent);
    }    
      

  12.   

    supperlxf(嘿嘿) 你先试一下吧,还是不行。
      

  13.   

    运行成功看:
     POINT point;
        CRect rect;
        GetWindowRect(&rect);
    ::GetCursorPos(&point);
    if (rect.PtInRect(point))
        {
        ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, 110, 280, 100,  SWP_SHOWWINDOW);
    ::MessageBox(0," "," ",0);
        }
        else
        {
        ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,200, 410, 250, 100,  SWP_SHOWWINDOW);
      
        } CDialog::OnTimer(nIDEvent);
      

  14.   

    谢谢  supperlxf(嘿嘿) 问题解决了。 我会给分的,  还有个问题,
    我的程序一开始出现在屏幕中央,  怎样是它一开始就显示在最上方。  再加20分。
      

  15.   

    oncreate时
    ::SetWindowPos (GetSafeHwnd(), HWND_TOPMOST,100, -20, 280, 20,  SWP_SHOWWINDOW);
    分我不要了,你放了我吧