編者:李國帥
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
返回父窗口中包含了指定點的第一個看得見的子窗口的句柄。搜索僅限於直接的子窗口;不搜索孫輩和更深的後代窗口。