添加鼠标移出区域消息

前两天完成项目任务,需要给按钮添加一个Tooltip提示,要求是点击按钮时出现提示,鼠标离开按钮时提示消失,再次点击按钮提示才再次出现。易知,提示可以用MFC的CToolTipCtrl类实现,比较简单,而要求鼠标离开按钮时消失就需要动动脑筋了,首先想到的是重载按钮类,添加鼠标移出响应事件,即响应WM_MOUSELEAVE消息,添加响应函数后,发现当鼠标移出按钮时,并不会执行此函数,在网上找资料知道了解决方法,参考网址

http://topic.csdn.net/t/20041214/17/3644793.html

http://blog.163.com/around-wind/blog/static/27123075200772041220614/

解决方法为

要响应WM_MOUSELEAVE,就要先响应WM_MOUSEMOVE,在其响应函数中,编写如下代码

void CTipButton::OnMouseMove(UINT nFlags, CPoint point)
{
    // TODO: Add your message handler code here and/or call default
    if   (!m_bTrackLeave)
    {
        // 鼠标第一次移入窗口时,请求一个WM_MOUSELEAVE消息
        TRACKMOUSEEVENT tme;
        tme.cbSize = sizeof(tme);
        tme.hwndTrack = m_hWnd;
        tme.dwFlags = TME_LEAVE;
        _TrackMouseEvent(&tme);
        m_bTrackLeave = TRUE;
    }

    CButton::OnMouseMove(nFlags, point);
}

其中是要事先声明的成员变量,并要做如下初始化

CTipButton::CTipButton()
{
    m_bTrackLeave = FALSE;
}

然后再在移出响应函数中编写自己想要的移出响应代码

void CTipButton::OnMouseLeave()
{
    // TODO: Add your message handler code here and/or call default
    。。。

    CButton::OnMouseLeave();
}

 

网上还有人提出如下方法

重载CDialog::PreTranslateMsg,如下  
  BOOL   CTestDlg::PreTranslateMessage(MSG*   pMsg)    
  {  
  //   TODO:   Add   your   specialized   code   here   and/or   call   the   base   class  
  CWnd*   pWnd   =   GetDlgItem(IDC_BUTTON1);  
  if   (pMsg->message   ==   WM_MOUSEMOVE  
  &&   pMsg->hwnd   ==   pWnd->GetSafeHwnd())  
  {  
  CPoint   point(LOWORD(pMsg->lParam),   HIWORD(pMsg->lParam));  
  CRect   rect;  
  pWnd->GetClientRect(rect);  
  if   (rect.PtInRect(point))  
  {  
  AfxMessageBox("ok");  
  }  
  }  
  return   CDialog::PreTranslateMessage(pMsg);  
  }

未经测试,不知能否完成功能,按代码意思应该是可以的,但感觉不如第一种方法规范,不过这种方法用到的几个函数对以我们理解MFC的消息映射机制还是很有帮助的,也算收藏了。类似的代码也列举如下吧

LRESULT   CTreeCtrlDlg::OnMouseLeave(WPARAM   wParam,   LPARAM   lParam)
{
int   xPos   =   LOWORD(lParam);
int   yPos   =   HIWORD(lParam);
CRect   rect;
GetClientRect(&rect);
CPoint   curPt;
GetCursorPos(&curPt);
ScreenToClient(&curPt);
if(!rect.PtInRect(curPt))
{
m_Hover   =   FALSE;
}
else
     
m_Hover   =   TRUE;
}
m_bTracking   =   FALSE;
return   0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值