怎么样捕捉WM_MOUSELEAVE和WM_MOUSEHOVER消息?

liuzongqiang 2006-08-20 03:24:41
本来是想做一个控件,当鼠标移入的时候控件高亮度显示,移出时恢复,
我也知道WINDOWS里有WM_MOUSELEAVE 和 WM_MOUSEHOVER消息,可以直接用捕捉,但我在MFC里这样做动完全没有反应。
我的步骤是平常那样先加入消息映射:

ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
然后,在头文件加入相应函数:

afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);
最后在CPP文件实现,但从结果中看,程序并没有捕捉到这两个消息。

为了试验是不是MFC不响应这两个消息,我又重载了WindowProc代码如下
LRESULT CGraphicButton::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if (message==WM_MOUSELEAVE)MessageBox("mouse leave");
return CButton::WindowProc(message, wParam, lParam);
}

结果仍然没有捕捉到消息,
现在为了模拟这两个消息,我只好重载OnNcHitTest了,但当鼠标快速移动时模拟会出现“误判”---捕捉不到消息。

这下可如何是好?难道为了实现这么一个功能还要大张旗鼓地用勾子函数监视鼠标?大家探讨探讨!
...全文
2015 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuzongqiang 2006-08-22
  • 打赏
  • 举报
回复
这是我试验的代码,共享:
.h文件加入:
afx_msg LRESULT OnMouseLeave(WPARAM ,LPARAM );
afx_msg LRESULT OnMouseHover(WPARAM ,LPARAM );

.cpp文件加入:
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover)
LRESULT CIconButton::OnMouseLeave(WPARAM wParam,LPARAM lParam)
{
InvalidateRect(NULL);
return 0;
}

LRESULT CIconButton::OnMouseHover(WPARAM wParam,LPARAM lParam)
{
CClientDC dc(this);
CRect rt;
GetClientRect(&rt);
dc.Draw3dRect(0,0,
m_rect.right-m_rect.left,m_rect.bottom-m_rect.top,
RGB(0,0,0),RGB(10,10,10));
return 0;
}


void CIconButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

CButton::OnMouseMove(nFlags, point);
TRACKMOUSEEVENT tme;
tme.cbSize=sizeof(TRACKMOUSEEVENT);
tme.dwFlags=TME_HOVER | TME_LEAVE;
tme.dwHoverTime=HOVER_DEFAULT;
tme.hwndTrack=m_hWnd;
_TrackMouseEvent(&tme);
}
liuzongqiang 2006-08-22
  • 打赏
  • 举报
回复
控件的这个功能已经做好了。谢谢各位!!
liuzongqiang 2006-08-22
  • 打赏
  • 举报
回复
谢谢各位的热心帮助,我正在试验。
mynamelj 2006-08-21
  • 打赏
  • 举报
回复
同意楼上的
aa3000 2006-08-21
  • 打赏
  • 举报
回复
TRACKMOUSEEVENT t_MouseEvent;
t_MouseEvent.cbSize = sizeof(TRACKMOUSEEVENT);
t_MouseEvent.dwFlags = TME_LEAVE | TME_HOVER;
t_MouseEvent.hwndTrack = m_hWnd;
t_MouseEvent.dwHoverTime = 30;

::_TrackMouseEvent(&t_MouseEvent);
cleverwyq 2006-08-21
  • 打赏
  • 举报
回复
#if((_WIN32_WINNT >= 0x0400) || (WINVER >= 0x0500))
#define WM_MOUSEHOVER 0x02A1
#define WM_MOUSELEAVE 0x02A3
#endif

还要注意几个宏,版本低的话,是找不到定义的
leon7909 2006-08-20
  • 打赏
  • 举报
回复
TrackMouseEvent.
iswjh 2006-08-20
  • 打赏
  • 举报
回复
WM_MOUSELEAVE,WM_MOUSEHOVER这两个消息是和TrackMouseEvent这个API函数配合使用的。而且当窗口接收到这两个消息后,必须再次调用TrackMouseEvent,否则窗口不会再收到这两个消息。
详情在MSDN.
aluzi 2006-08-20
  • 打赏
  • 举报
回复
c里面没有网页上那种mouseout、mouseover的消息的。

要自己处理mousemove
Snow_Ice11111 2006-08-20
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20060210/22/4550219.html

15,979

社区成员

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

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