WXHRGN wxStaticBox::MSWGetRegionWithoutChildren() { RECT rc; ::GetWindowRect(GetHwnd(), &rc); HRGN hrgn = ::CreateRectRgn(rc.left, rc.top, rc.right + 1, rc.bottom + 1); // 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 ) { // Don't clip any static boxes, not just this one. This will // result in flicker in overlapping static boxes, but at least // they will all be drawn correctly and we shouldn't have // overlapping windows anyway. 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 ) { style &= ~WS_CLIPSIBLINGS; ::SetWindowLong(child, GWL_STYLE, style); // MSDN: "If you have changed certain window data using // SetWindowLong, you must call SetWindowPos to have the // changes take effect." ::SetWindowPos(child, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); } AutoHRGN hrgnChild(::CreateRectRgnIndirect(&rc)); ::CombineRgn(hrgn, hrgn, hrgnChild, RGN_DIFF); } } return (WXHRGN)hrgn; }
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 ) { style &= ~WS_CLIPSIBLINGS; ::SetWindowLong(child, GWL_STYLE, style); // MSDN: "If you have changed certain window data using // SetWindowLong, you must call SetWindowPos to have the // changes take effect." ::SetWindowPos(child, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); } AutoHRGN hrgnChild(::CreateRectRgnIndirect(&rc)); ::CombineRgn(hrgn, hrgn, hrgnChild, RGN_DIFF); } } return (WXHRGN)hrgn; }