* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: window.c,v 1.179 2004/01/27 09:36:14 weiden Exp $
+/* $Id: window.c,v 1.180 2004/02/04 01:10:25 rcampbell Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
static WORD WndProcHandlesArraySize = 0;
#define WPH_SIZE 0x40 /* the size to add to the WndProcHandle array each time */
+#define POINT_IN_RECT(p, r) (((r.bottom >= p.y) && (r.top <= p.y))&&((r.left <= p.x )&&( r.right >= p.x )))
+
/* PRIVATE FUNCTIONS **********************************************************/
/*
/*
- * @unimplemented
+ * @implemented
*/
-DWORD STDCALL
-NtUserChildWindowFromPointEx(HWND Parent,
+HWND STDCALL
+NtUserChildWindowFromPointEx(HWND hwndParent,
LONG x,
LONG y,
- UINT Flags)
+ UINT uiFlags)
{
- UNIMPLEMENTED
+ PWINDOW_OBJECT pParent, pCurrent, pLast;
+ POINT p = {x,y};
+ RECT rc;
+ BOOL bFirstRun = TRUE;
+
+ if(hwndParent)
+ {
+ pParent = IntGetWindowObject(hwndParent);
+ if(pParent)
+ {
+ ExAcquireFastMutexUnsafe (&pParent->ChildrenListLock);
+
+ pLast = IntGetWindowObject(pParent->LastChild->Self);
+ pCurrent = IntGetWindowObject(pParent->FirstChild->Self);
+
+ do
+ {
+ if (!bFirstRun)
+ {
+ pCurrent = IntGetWindowObject(pCurrent->NextSibling->Self);
+
+ }
+ else
+ bFirstRun = FALSE;
+ if(!pCurrent)
+ return (HWND)NULL;
+
+ rc.left = pCurrent->WindowRect.left - pCurrent->Parent->ClientRect.left;
+ rc.top = pCurrent->WindowRect.top - pCurrent->Parent->ClientRect.top;
+ rc.right = rc.left + (pCurrent->WindowRect.right - pCurrent->WindowRect.left);
+ rc.bottom = rc.top + (pCurrent->WindowRect.bottom - pCurrent->WindowRect.top);
+ DbgPrint("Rect: %i,%i,%i,%i\n",rc.left, rc.top, rc.right, rc.bottom);
+ if (POINT_IN_RECT(p,rc)) /* Found a match */
+ {
+ if ( (uiFlags & CWP_SKIPDISABLED) && (pCurrent->Style & WS_DISABLED) )
+ continue;
+ if( (uiFlags & CWP_SKIPTRANSPARENT) && (pCurrent->ExStyle & WS_EX_TRANSPARENT) )
+ continue;
+ if( (uiFlags & CWP_SKIPINVISIBLE) && !(pCurrent->Style & WS_VISIBLE) )
+ continue;
+
+ ExReleaseFastMutexUnsafe(&pParent->ChildrenListLock);
+ return pCurrent->Self;
+ }
+ }
+ while(pCurrent != pLast);
+
+ ExReleaseFastMutexUnsafe(&pParent->ChildrenListLock);
+ return (HWND)NULL;
+ }
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ }
- return(0);
+ return (HWND)NULL;
}
return (VOID)NtUserRedrawWindow(hWnd, Rect, 0, RDW_VALIDATE | RDW_NOCHILDREN);
}
-
-#define POINT_IN_RECT(p, r) (((r.bottom >= p.y) && (r.top <= p.y))&&((r.left <= p.x )&&( r.right >= p.x )))
static BOOL IsStaticClass(PWINDOW_OBJECT Window)
{
BOOL rc = FALSE;