POING point GetCursorPos(&point) ScreenToClient(&point); CRect rect; AfxGetMainWnd()->GetWindowRect(&rect); ScreenToClient(&rect); if(rect.PtInRect(point)) MessageBox("在客户区中");
POINT point GetCursorPos(&point) ScreenToClient(&point); CRect rect; AfxGetMainWnd()->GetWindowRect(&rect); ScreenToClient(&rect); if(rect.PtInRect(point)) MessageBox("在客户区中");
AfxGetMainWnd()->GetWindowRect(&rect);
ScreenToClient(&rect);
if(rect.PtInRect(point))
MessageBox("在客户区中");
可能大家没有明白我的问题,我需要在鼠标移出窗口时,执行某些动作。首先,鼠标移到窗口外,不会发消息给窗口,所以在什么消息响应函数中设置都只能得到鼠标在窗口的消息,但鼠标移到窗口外,并不会发送WM_MOUSEMOVE、 WM_NCHITTEST等类似的消息给窗口,因此,依然无法得到消息。继续等待.....
WM_NCHITTEST则测试鼠标点和窗口的非客户区之间的关系
SetCapture()函数已经用到鼠标拖动中,并且有释放捕捉的函数,
因此,都不是标准用法;不推荐使用。继续等待.....
GetCursorPos(&point)
ScreenToClient(&point);
CRect rect;
AfxGetMainWnd()->GetWindowRect(&rect);
ScreenToClient(&rect);
if(rect.PtInRect(point))
MessageBox("在客户区中");
GetCursorPos(&point)
ScreenToClient(&point);
CRect rect;
AfxGetMainWnd()->GetWindowRect(&rect);
ScreenToClient(&rect);
if(rect.PtInRect(point))
MessageBox("在客户区中");
我定义了一个视图类CFinanceView,在类定义文件中添加消息处理函数的声明:
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);然后在类实现文件中添加消息映射:
BEGIN_MESSAGE_MAP(CFinanceView, CFormView)
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave) //自己定义的消息
END_MESSAGE_MAP()添加鼠标移动消息:
void CFinanceView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
//监控鼠标离开
tme.dwFlags = TME_LEAVE;
tme.hwndTrack = this->m_hWnd; ::_TrackMouseEvent(&tme); CFormView::OnMouseMove(nFlags, point);
}处理鼠标离开消息
LRESULT CFinanceView::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
MessageBox("鼠标已离开本窗口");
return 0;
}
使用方法:
1、在头文件声明消息响应函数
afx_msg void OnMouseLeave();
2、在cpp文件定义消息响应函数
void CIMyWin::OnMouseLeave()
{
MessageBox("鼠标已离开");
m_bTrackLeave=FALSE;
}
3、添加消息映射
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
4、调用_TrackMouseEvent();捕获鼠标离开的事件
void CMyWin::OnMouseMove(UINT nFlags, CPoint point)
{
if (!m_bTrackLeave)
{// 鼠标第一次移入窗口时, 请求一个WM_MOUSELEAVE 消息
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE;
_TrackMouseEvent(&tme);
m_bTrackLeave = TRUE;
}
CWnd::OnMouseMove(nFlags, point);
}