为什么响应消息WM_MOUSELEAVE而不响应消息WM_MOUSEHOVER

牛虻&专家 2012-09-30 03:58:32
以下是程序的代码:
头文件-------------------------------------------------------------------------------
class CMyButton :public CButton
{
public:
CMyButton(void);
~CMyButton(void);
LRESULT OnMouseLeave(WPARAM wParam,LPARAM lParam);
LRESULT OnMouseHover(WPARAM wParam,LPARAM lParam);
protected:
bool m_bTracked;
DECLARE_MESSAGE_MAP()
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
};

源文件-----------------------------------------------------------------------------
#include "StdAfx.h"
#include "MyButton.h"


CMyButton::CMyButton(void)
{
m_bTracked=true;
}


CMyButton::~CMyButton(void)
{
}
BEGIN_MESSAGE_MAP(CMyButton, CButton)
ON_WM_MOUSEMOVE()
ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover)
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
END_MESSAGE_MAP()


void CMyButton::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_bTracked){
TRACKMOUSEEVENT tme;
ZeroMemory(&tme,sizeof(TRACKMOUSEEVENT));
tme.cbSize=sizeof(TRACKMOUSEEVENT)+1;
tme.dwFlags=TME_HOVER|TME_LEAVE;
tme.dwHoverTime=1; //鼠标在按钮上停留超过1s,就认为是HOVER
tme.hwndTrack=this->m_hWnd;
if(::_TrackMouseEvent(&tme))
m_bTracked=false;
}
CButton::OnMouseMove(nFlags, point);
}
LRESULT CMyButton::OnMouseLeave(WPARAM wParam,LPARAM lParam)
{
RedrawWindow();
TRACE(_T("Leave---------------------------"));
m_bTracked=true;
return 0;
}
LRESULT CMyButton::OnMouseHover(WPARAM wParam,LPARAM lParam)
{
RedrawWindow();
TRACE(_T("Hover---------------------------"));
m_bTracked=false;
return 0;
}


求各位大侠指点?
...全文
381 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
烟袅许伊 2014-04-18
  • 打赏
  • 举报
回复
这个问题解决了么?
向立天 2013-04-04
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
潇潇雨云 2012-12-24
  • 打赏
  • 举报
回复
onmouseover与onmousemove的区别    时间上,onmousemove事件触发后再触发onmouseover事件; 动作上,onmouseover只在刚进入区域时触发。 onmousemove除了刚进入区域时触发外,在区域内移动鼠标也会触发。
X443999167 2012-12-24
  • 打赏
  • 举报
回复
Invalidate(FALSE); 我也出现过只响应leave不响应over的情况, 我的出现这个是因为在自绘函数DrawItem中出现了Invalidate(FALSE), 你看以看看你的代码中是否是因为这个。
jiejieaiai 2012-10-08
  • 打赏
  • 举报
回复
if(m_bTracked) 是不是为false了
进不去里面的代码变量呢
BlackGhost 2012-10-08
  • 打赏
  • 举报
回复
tme.cbSize=sizeof(TRACKMOUSEEVENT)+1; ?
看不见的裂痕 2012-10-08
  • 打赏
  • 举报
回复
tme.dwFlags=TME_HOVER|TME_LEAVE;

这个就用一个TME_HOVER看看。
m_bTracked=false;都用true看看
lslsyqyq 2012-10-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

if(m_bTracked)
去掉这句,应该是因为OnMouseHover先响应,OnMouseMove后响应,所以m_bTracked不满足
[/Quote]

这个说法不对吧
if不执行的话,TrackMouseEvent都没有注册 还谈什么 TME_HOVER TME_LEAVE

看不出来为什么不响应WM_MOUSEHOVER 多调试看看
sumos 2012-10-07
  • 打赏
  • 举报
回复
if(m_bTracked){
TRACKMOUSEEVENT tme;
ZeroMemory(&tme,sizeof(TRACKMOUSEEVENT));
tme.cbSize=sizeof(TRACKMOUSEEVENT)+1;
tme.dwFlags=TME_HOVER|TME_LEAVE;
tme.dwHoverTime=1; //鼠标在按钮上停留超过1s,就认为是HOVER
tme.hwndTrack=this-> m_hWnd;
if(::_TrackMouseEvent(&tme))
m_bTracked=false;
没必要加上HOVER,反正只有第一次进入时才执行此if,所以在此处调用或者自己发送HOVER消息就可以了
}
hdg3707 2012-09-30
  • 打赏
  • 举报
回复
if(m_bTracked)
去掉这句,应该是因为OnMouseHover先响应,OnMouseMove后响应,所以m_bTracked不满足

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧