本来是想做一个控件,当鼠标移入的时候控件高亮度显示,移出时恢复,
我也知道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了,但当鼠标快速移动时模拟会出现“误判”---捕捉不到消息。这下可如何是好?难道为了实现这么一个功能还要大张旗鼓地用勾子函数监视鼠标?大家探讨探讨!
我也知道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了,但当鼠标快速移动时模拟会出现“误判”---捕捉不到消息。这下可如何是好?难道为了实现这么一个功能还要大张旗鼓地用勾子函数监视鼠标?大家探讨探讨!
解决方案 »
- vc api串口 回显问题
- 关于PDF Creator编程
- outlook编程显示没有"默认的邮件客户。或者当前的邮件客户不能满足邮件消息的要求。请运行Microsoft Office Outlook并设为默认邮件客户。
- 我刚读研, 方向是图像处理.恳求达人给点建议!!
- 再问最简单的vc程序
- mscomm用在没有vc的机器上的问题?
- 一个很菜鸟的问题.如何在编辑框中换行并且每换一行如出一个整数n.(int n=0,n<1000,n++)
- delete this; 对吗?
- 用vc++来做一个播放器?谁会,给点提示啊.急急急!!!
- ADO连接数据库一个增删查数据库的窗口问题
- 所有的分奉献了,控件问题有点难!!
- 多项目的工程中,一个dll项目内直接使用另一个dll项目内的对话框原代码文件,请问资源会不会有问题?
详情在MSDN.
#define WM_MOUSEHOVER 0x02A1
#define WM_MOUSELEAVE 0x02A3
#endif还要注意几个宏,版本低的话,是找不到定义的
t_MouseEvent.cbSize = sizeof(TRACKMOUSEEVENT);
t_MouseEvent.dwFlags = TME_LEAVE | TME_HOVER;
t_MouseEvent.hwndTrack = m_hWnd;
t_MouseEvent.dwHoverTime = 30;::_TrackMouseEvent(&t_MouseEvent);
.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);
}