窗体上绘制鼠标坐标 实现

最近看到很多帖子是关于窗体绘制鼠标坐标的问题,于是自己闲来无聊加上心血来潮,就写了一个基于对话框的鼠标坐标显示

 

开始吧

一、定义成员变量

m_strpt  :显示的坐标字串

 m_point :鼠标坐标位置

 m_Rect  :要绘制的区域

 

二、OnMouseMove获取鼠标坐标

鼠标坐标的获取当然在OnMouseMove消息函数里是一个比较简便的方式,一般不要求很精确的时候,就在这里面获取

用向导生成该函数,并增加代码,代码如下:

void CGetHostIPDlg::OnMouseMove(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default
  CRect rectpt;
  CString strpt;
 rectpt = CRect(m_point.x,m_point.y,m_point.x+m_strpt.GetLength()*12,m_point.y+20);
 InvalidateRect(&rectpt);//擦除原先鼠标坐标,否则会有残留的坐标

 strpt.Format("%d,%d",point.x,point.y);
 rectpt = CRect(point.x,point.y,point.x+strpt.GetLength()*12,point.y+20);
 m_strpt = strpt;
 m_point = point;
 m_Rect  = rectpt;
 InvalidateRect(&rectpt);//绘制当前鼠标坐标

 CDialog::OnMouseMove(nFlags, point);

}

 

三、OnPaint绘制

在OnPaint函数的else语句里

 else
 {
  CPaintDC dc(this);
  dc.DrawText(m_strpt,&m_Rect,DT_BOTTOM);
 
  CDialog::OnPaint();
 }

好了,现在就可以进行测试了,我们看到,在窗体内可以进行鼠标坐标的绘制显示了

但是我们也发现还有个问题:当鼠标移动到标题栏上或窗体外时,窗体上还依然绘制着原先的鼠标坐标

经过了VisualEleven 的指导后,终于搞定了,在此感谢VisualEleven

 

这个问题的原因是我们鼠标离开客户区的时候没有重绘我们上一次绘制的地方导致的

可以设置一个变量来判断是否在客户区内:m_bIn,

是,绘制鼠标坐标,不是,用背景色填充上次绘制的鼠标坐标

那么我们该如何处理呢?

 

四、有两个消息:WM_MOUSELEAVE,WM_MOUSEHOVER

这两个消息在向导里找不到,并没有相应的消息响应函数

我们通过重载BOOL PreTranslateMessage(MSG* pMsg)函数来捕捉这两个消息

1、在头文件public中声明一下:

virtual BOOL PreTranslateMessage(MSG* pMsg);

2、在cpp文件中

BOOL CGetHostIPDlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO: Add your specialized code here and/or call the base class
    if(WM_MOUSELEAVE == pMsg->message)
    {
        m_bIn = FALSE;
        InvalidateRect(m_Rect);
        return TRUE;
    }
    else if(WM_MOUSEHOVER == pMsg->message)
    {
        m_bIn = TRUE;
        InvalidateRect(m_Rect);
        return TRUE;
    }
    return CWnd::PreTranslateMessage(pMsg);
}

同时将OnPaint语句修改为如下:

 else
 {
  CPaintDC dc(this);
  if (m_bIn)
  {
        dc.DrawText(m_strpt,&m_Rect,DT_BOTTOM);
  }
  else
  {
        dc.FillSolidRect(&m_Rect,GetSysColor(COLOR_3DFACE));//对话框的系统颜色
  }

   CDialog::OnPaint();

}

五、_TrackMouseEvent

此时我们发现并没有捕获到这两个消息,为什么呢,这边还有个很牛叉的东东:

_TrackMouseEvent:在鼠标离开某一窗口或在某一窗口上停留超过某一特定时间长度时发送消息

于是我们在OnMouseMove函数的后面加如下语句:

TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.dwFlags = TME_HOVER | TME_LEAVE;

 tme.dwHoverTime = HOVER_DEFAULT;

 tme.hwndTrack = GetSafeHwnd();
_TrackMouseEvent(&tme);

 

于是,搞定……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值