+ wxLogLastError(_T("CreateRectRgn()"));
+ return;
+ }
+
+ ::CombineRgn(hrgn, hrgn, hrgnRect, RGN_DIFF);
+}
+
+void wxStaticBox::MSWGetRegionWithoutSelf(WXHRGN hRgn, int w, int h)
+{
+ HRGN hrgn = (HRGN)hRgn;
+
+ // remove the area occupied by the static box borders from the region
+ int borderTop, border;
+ GetBordersForSizer(&borderTop, &border);
+
+ // top
+ SubtractRectFromRgn(hrgn, 0, 0, w, borderTop);
+
+ // bottom
+ SubtractRectFromRgn(hrgn, 0, h - border, w, h);
+
+ // left
+ SubtractRectFromRgn(hrgn, 0, 0, border, h);
+
+ // right
+ SubtractRectFromRgn(hrgn, w - border, 0, w, h);
+}
+
+WXHRGN wxStaticBox::MSWGetRegionWithoutChildren()
+{
+ RECT rc;
+ ::GetWindowRect(GetHwnd(), &rc);
+ HRGN hrgn = ::CreateRectRgn(rc.left, rc.top, rc.right + 1, rc.bottom + 1);
+ bool foundThis = false;
+
+ // iterate over all child windows (not just wxWindows but all windows)
+ for ( HWND child = ::GetWindow(GetHwndOf(GetParent()), GW_CHILD);
+ child;
+ child = ::GetWindow(child, GW_HWNDNEXT) )
+ {
+ if ( ! ::IsWindowVisible(child) )
+ {
+ // if the window isn't visible then it doesn't need clipped
+ continue;
+ }
+
+ LONG style = ::GetWindowLong(child, GWL_STYLE);
+ wxString str(wxGetWindowClass(child));
+ str.UpperCase();
+ if ( str == wxT("BUTTON") && (style & BS_GROUPBOX) == BS_GROUPBOX )
+ {
+ if ( child == GetHwnd() )
+ foundThis = true;
+
+ // Any static boxes below this one in the Z-order can't be clipped
+ // since if we have the case where a static box with a low Z-order
+ // is nested inside another static box with a high Z-order then the
+ // nested static box would be painted over. Doing it this way
+ // unfortunately results in flicker if the Z-order of nested static
+ // boxes is not inside (lowest) to outside (highest) but at least
+ // they are still shown.
+ if ( foundThis )
+ continue;
+ }
+
+ ::GetWindowRect(child, &rc);
+ if ( ::RectInRegion(hrgn, &rc) )
+ {
+ // need to remove WS_CLIPSIBLINGS from all sibling windows
+ // that are within this staticbox if set
+ if ( style & WS_CLIPSIBLINGS )