PtInRect和WindowFromPoint判斷鼠標是否停留在指定窗口上

 

編者:李國帥

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

返回父窗口中包含了指定點的第一個看得見的子窗口的句柄。搜索僅限於直接的子窗口;不搜索孫輩和更深的後代窗口。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章