MyException - 我的异常网
当前位置:我的异常网» VC/MFC » 上面三个消息之间有联系吗?//为什么wm_mousemove消

上面三个消息之间有联系吗?//为什么wm_mousemove消息处理再次发送这个消息呢?

www.MyException.Cn  网友分享于:2013-01-12  浏览:81次
下面三个消息之间有联系吗???//为什么wm_mousemove消息处理再次发送这个消息呢???

BEGIN_MESSAGE_MAP(CBitWnd, CWnd)
//{{AFX_MSG_MAP(CBitWnd)
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
END_MESSAGE_MAP()

LRESULT CBitWnd::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
m_nState = m_bMute ? kActiveBit : kNormalBit;
m_nState = (m_lpBit->GetItemNums() > 1) ? m_nState : kNormalBit;

m_bTracking = FALSE;
this->Invalidate();
return 0;
}

LRESULT CBitWnd::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
m_nState = (m_lpBit->GetItemNums() > 1) ? kHoverBit : kNormalBit;
m_nState = m_bMute ? kActiveBit : m_nState;

this->Invalidate();
return 0;
}

void CBitWnd::OnMouseMove(UINT nFlags, CPoint point) 
{
if( !m_bTracking )
{
TRACKMOUSEEVENT tme = {0};
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 1;
m_bTracking = _TrackMouseEvent(&tme);
}
if( m_bNotify )
{
ASSERT( GetParent() != NULL );
this->ClientToScreen(&point);
GetParent()->ScreenToClient(&point);
GetParent()->SendMessage(WM_MOUSEMOVE, nFlags, MAKELPARAM(point.x, point.y));
}
}


------解决方案--------------------
先从概念上面说:
OnMouseLeave WM_MOUSELEAVE   是鼠标离开窗体时触发
OnMouseHover WM_MOUSEHOVER   是鼠标悬停时触发
OnMouseMove ON_WM_MOUSEMOVE  是鼠标移动时触发

也就是说鼠标移入窗体后,OnMouseMove最先触发,过一段时间再触发OnMouseHover
------解决方案--------------------
引用:
通知父窗口有啥意义???????
引用:WM_MOUSEHOVER和WM_MOUSELEAVE这两个消息的启用是需要在OnMouseMove中激活的
继续发送WM_MOUSEMOVE并不是自己发给自己
而是对父窗口的一个通知
那就得问你了
这代码是你写的
有什么作用你应该最清楚啊
从代码上看我们也只能看出这么多

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有