我在自绘Button类中:
void CShade3dButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if ( !m_bOver )
{
SetCapture();
this->Invalidate(FALSE);
}
else
{
ASSERT(GetCapture() == this);
CRect rect;
GetClientRect(&rect); if ( !rect.PtInRect( point))
{
m_bOver = FALSE;
Invalidate(FALSE);
ReleaseCapture(); }
}
CButton::OnMouseMove(nFlags, point);
}如果仅仅是鼠标移动,没有单击按钮,则可以检测到over,out。
但是一旦我单击了按钮,则不能检测到over,out事件。并且当加入了
ASSERT(GetCapture() == this);
后,发现居然出现断言失败。疑问:
SetCapture()设置后,如果又有一个窗口也做了这个设置,那此时到底是谁在capure?
为什么会出现断言失败?

解决方案 »

  1.   

    当前没有包括自己在内的任何一个窗口设置SetCapture()时,GetCapture()返回NULL
      

  2.   

    m_bOver的初值应为FALSE,
    SetCapture()后加上:
    m_bOver = TRUE ;
      

  3.   

    更正:由于复制过来时,删除了一些不必要的东西,同时也不小心删了有用的东西
    CShade3dButton::CShade3dButton()
    {
       m_bOver = FALSE;
    }void CShade3dButton::OnMouseMove(UINT nFlags, CPoint point)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    if ( !m_bOver )
    {
    SetCapture();
                      m_bOver = TRUE;
    this->Invalidate(FALSE);
    }
    else
    {
    ASSERT(GetCapture() == this);
    CRect rect;
    GetClientRect(&rect); if ( !rect.PtInRect( point))
    {
    m_bOver = FALSE;
    Invalidate(FALSE);
    ReleaseCapture(); }
    }
    CButton::OnMouseMove(nFlags, point);
    }
      

  4.   

    断言失败时,GetCapture()返回值为NULL,猜想可能是BUTTONDOWN时CButton取消了捕获操作void CShade3dButton::OnMouseMove(UINT nFlags, CPoint point) 
    { CWnd *pWnd = GetCapture() ; CRect rect;
    GetClientRect(&rect); if ( !rect.PtInRect( point))
    {
    if( m_bOver ) 
    Invalidate(FALSE);
    m_bOver = FALSE;
    if( pWnd == this )
    ReleaseCapture();
    }
    else 
    {
    if( !pWnd ) 
    SetCapture();
      if( !m_bOver )
    Invalidate(FALSE);
               m_bOver = TRUE;
    }
    CButton::OnMouseMove(nFlags, point);
    }