最近看到很多帖子是关于窗体绘制鼠标坐标的问题,于是自己闲来无聊加上心血来潮,就写了一个基于对话框的鼠标坐标显示
开始吧
一、定义成员变量:
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);
于是,搞定……