127 lines
2.5 KiB
C
127 lines
2.5 KiB
C
|
#define TestWF(hwnf, f) (GetWindowLong(hwnd, GWL_STYLE) & (f))
|
||
|
|
||
|
BOOL DVAIsClipped(HDC hdc, RECT& rc)
|
||
|
{
|
||
|
RECT rcClip;
|
||
|
|
||
|
if (GetClipBox(hdc, &rcClip) != SIMPLEREGION)
|
||
|
return TRUE;
|
||
|
|
||
|
if (rc.left < rcClip.left ||
|
||
|
rc.top < rcClip.top ||
|
||
|
rc.right > rcClip.right ||
|
||
|
rc.bottom > rcClip.bottom)
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
int DVAGetClipList(HWND hwnd, LPRECT prc, LPRECT RectList, int RectCount)
|
||
|
{
|
||
|
RECT rc;
|
||
|
HWND hwndP;
|
||
|
HWND hwndT;
|
||
|
|
||
|
if (RectCount == 0 || !IsVisible(hwnd))
|
||
|
return 0;
|
||
|
|
||
|
//
|
||
|
// get the client area of the window
|
||
|
//
|
||
|
GetClientRect(hwnd, RectList);
|
||
|
|
||
|
if (prcTest)
|
||
|
IntersectRect(RectList, RectList, prc);
|
||
|
|
||
|
ClientToScreen(hwnd, (LPPOINT)RectList);
|
||
|
ClientToScreen(hwnd, (LPPOINT)RectList + 1);
|
||
|
|
||
|
RectCount = 1;
|
||
|
RectList[1] = RectList[0];
|
||
|
|
||
|
//
|
||
|
// walk all children of hwnd and remove them if needed
|
||
|
//
|
||
|
if (TestWF(hwnd WS_CLIPCHILDREN))
|
||
|
{
|
||
|
RectCount = ExcludeWindowRects(RectList, RectCount,
|
||
|
GetWindow(hwnd, GW_CHILD), NULL);
|
||
|
|
||
|
if (RectCount == 0)
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// walk all the siblings of hwnd and exclude them from the list.
|
||
|
//
|
||
|
for (; (hwndP = GetWindow(hwnd, GW_PARENT)) != NULL; hwnd = hwndP)
|
||
|
{
|
||
|
GetWindowRect(hwndP, &rc);
|
||
|
RectCount = IntersectRectList(RectList, RectCount, &rc;
|
||
|
|
||
|
if (RectCount == 0)
|
||
|
return 0;
|
||
|
|
||
|
if (TestWF(hwnd, WS_CLIPSIBLINGS))
|
||
|
{
|
||
|
RectCount = ExcludeWindowRects(RectList, RectCount,
|
||
|
GetWindow(hwndP, GW_CHILD), hwnd);
|
||
|
|
||
|
if (RectCount == 0)
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return RectCount;
|
||
|
}
|
||
|
|
||
|
int ExcludeWindowRects(LPRECT RectList, int RectCount, HWND hwndA, HWND hwndB)
|
||
|
{
|
||
|
RECT rc;
|
||
|
|
||
|
for (hwnd = hwndA; hwnd != NULL && hwnd != hwndB; hwnd = GetWindow(hwnd, GW_HWNDNEXT))
|
||
|
{
|
||
|
if (!IsWindowVisible(hwnd))
|
||
|
continue;
|
||
|
|
||
|
// Don't subtract off transparent windows...
|
||
|
//
|
||
|
if (TestWF(hwnd, WEFTRANSPARENT))
|
||
|
continue;
|
||
|
|
||
|
GetWindowRect(hwnd, &rc);
|
||
|
|
||
|
RectCount = ExcludeRectList(RectList, RectCount, &rc);
|
||
|
|
||
|
if (RectCount == 0)
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
return RectCount;
|
||
|
}
|
||
|
|
||
|
|
||
|
int ExcludeRectList(LPRECT RectList, int RectCount, LPRECT prc)
|
||
|
{
|
||
|
int i;
|
||
|
int n;
|
||
|
RECT rc;
|
||
|
|
||
|
if (RectCount == 0)
|
||
|
return 0;
|
||
|
|
||
|
SubtractRect(RectList, prc);
|
||
|
|
||
|
for (i=1; i <= RectCount; i++)
|
||
|
{
|
||
|
if (!IntersectRect(&rc, &RectList[i], prc))
|
||
|
continue;
|
||
|
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
|
||
|
}
|
||
|
}
|