编者:李国帅
qq:9611153 微信lgs9611153
时间:2012/06/20
背景原因:
在vc界面程序的开发中,会遇到这样的需求,当鼠标悬停在当前程序的某个自定义控件窗口上时,显示某些信息或者进行某些操作。
那么就会碰到,如果控件没有在前台显示或者被半遮挡,进行误判怎么办?
问题描述:
下面如果打印记录
(XXXCtrl:1) (2012/06/20 10:09:34) CDlgPlayer::OnTimer MoveOver Player!
那么鼠标是否在控件上放呢?可能不是,因为程序可能在后台。
原因使用如下代码:
POINT mousepoint;
GetCursorPos(&mousepoint);
CRect rect;
GetWindowRect(&rect);
int nCmdShow = SW_SHOW;
if(rect.PtInRect(mousepoint))
{
CNetLog::printlog(LOG_INFO,"%s MoveOver Player!",__FUNCTION__);
}
else
{
nCmdShow = SW_HIDE;
}
即便是窗口没有在最前端显示,PtInRect也会判断为true。
WindowFromPoint:
这时候需要配合另一个函数WindowFromPoint,判断此点所在的窗口是不是自己想要的窗口
HWND hDlg = NULL;
hDlg = m_paryPlayer->GetSafeHwnd();
::GetWindowRect(hDlg,rect);
if (rect.PtInRect(ptMouse))
CWnd* pWnd = WindowFromPoint(mousepoint);
POINT ptMouse;
GetCursorPos(&ptMouse);
HWND hWin=WindowFromPoint(ptMouse);
另外WindowFromPoint这个函数是有缺点的。有些窗口比如WinRar中的某些控件窗口就检测不到。WindowFromPoint函数不获取隐藏或禁止的窗口句柄,即使点在该窗口内。
HWND WindowFromPoint( POINT Point);功能:返回包含点的窗口句柄(如果是文本返回包含文本的窗口),Point参数指屏幕坐标。如果不存在窗口包含这个点,则返回NULL。如果窗口无效或者隐藏,则返回NUL。
两个相似的winapi:
ChildWindowFromPoint
HWND ChildWindowFromPoint (HWND hWnd, LONG xPoint, LONG yPoint); 函数功能:返回父窗口中包含了指定点的第一个子窗口的句柄(如果是组合控件返回组合控件,而不是子控件)。 函数参数:hWnd 父窗口的句柄 xPoint 点的X坐标,yPoint 点的Y坐标,以像素为单位。
RealChildWindowFromPoint
返回父窗口中包含了指定点的第一个看得见的子窗口的句柄。搜索仅限于直接的子窗口;不搜索孙辈和更深的后代窗口。