]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/radiobox.cpp
Added licence/copyright information
[wxWidgets.git] / src / msw / radiobox.cpp
index 253c31204d8fbd005032d9aa9c5467e4bfb4f3cc..50e27bae8dbb4b8bec190469b0eb0d8130e968bb 100644 (file)
 
 #include "wx/msw/subwin.h"
 
+// This is switched off because in some situations, the radiobox
+// buttons simply don't appear when deferred sizing is on.
+// Instead, refreshing on WM_MOVE seems to at least cure the droppings.
+#define USE_DEFERRED_SIZING 0
+
 #if wxUSE_TOOLTIPS
     #if !defined(__GNUWIN32_OLD__) || defined(__CYGWIN10__)
         #include <commctrl.h>
@@ -545,7 +550,17 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
             height = heightOld;
     }
 
-    ::MoveWindow(GetHwnd(), xx, yy, width, height, TRUE);
+    // if our parent had prepared a defer window handle for us, use it (unless
+    // we are a top level window)
+    wxWindowMSW *parent = GetParent();
+
+#if USE_DEFERRED_SIZING
+    HDWP hdwp = parent && !IsTopLevel() ? (HDWP)parent->m_hDWP : NULL;
+#else
+    HDWP hdwp = 0;
+#endif    
+
+    wxMoveWindowDeferred(hdwp, this, GetHwnd(), xx, yy, width, height);
 
     // Now position all the buttons: the current button will be put at
     // wxPoint(x_offset, y_offset) and the new row/column will start at
@@ -642,8 +657,76 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
             x_offset += widthBtn + cx1;
         }
     }
+
+#if USE_DEFERRED_SIZING
+    if (parent)
+    {
+        // hdwp must be updated as it may have been changed
+        parent->m_hDWP = (WXHANDLE)hdwp;
+    }
+#endif
+}
+
+// ----------------------------------------------------------------------------
+// radio box drawing
+// ----------------------------------------------------------------------------
+
+#ifndef __WXWINCE__
+
+WXHRGN wxRadioBox::MSWGetRegionWithoutChildren()
+{
+    RECT rc;
+    ::GetWindowRect(GetHwnd(), &rc);
+    HRGN hrgn = ::CreateRectRgn(rc.left, rc.top, rc.right + 1, rc.bottom + 1);
+
+    const size_t count = GetCount();
+    for ( size_t i = 0; i < count; ++i )
+    {
+        ::GetWindowRect((*m_radioButtons)[i], &rc);
+        AutoHRGN hrgnchild(::CreateRectRgnIndirect(&rc));
+        ::CombineRgn(hrgn, hrgn, hrgnchild, RGN_DIFF);
+    }
+
+    return (WXHRGN)hrgn;
 }
 
+WXLRESULT
+wxRadioBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
+{
+    if ( nMsg == WM_PRINTCLIENT )
+    {
+        // we have to process WM_PRINTCLIENT ourselves as otherwise the radio
+        // buttons background would never be drawn unless we have a parent with
+        // non default background
+
+        // so check first if we have one
+        if ( !HandlePrintClient((WXHDC)wParam) )
+        {
+            // no, we don't, erase the background ourselves (don't use our own
+            // colour as with static box, see comments there)
+            wxBrush brush(GetParent()->GetBackgroundColour());
+            wxFillRect(GetHwnd(), (HDC)wParam, GetHbrushOf(brush));
+        }
+
+        return 0;
+    }
+    // FIXME: Without this, the radiobox corrupts other controls as it moves
+    // in a dynamic layout. Refreshing causes flicker, but it's better than
+    // leaving droppings. Note that for some reason, wxStaticBox doesn't need
+    // this (perhaps because it has no real children?)
+    else if (nMsg == WM_MOVE)
+    {
+        WXLRESULT res = wxControl::MSWWindowProc(nMsg, wParam, lParam);
+        wxRect rect = GetRect();
+        GetParent()->Refresh(true, & rect);
+        return res;
+    }
+
+    return wxStaticBox::MSWWindowProc(nMsg, wParam, lParam);
+}
+
+#endif // __WXWINCE__
+
 // ---------------------------------------------------------------------------
 // window proc for radio buttons
 // ---------------------------------------------------------------------------
@@ -807,60 +890,13 @@ LRESULT APIENTRY _EXPORT wxRadioBtnWndProc(HWND hwnd,
 
                 if ( processed )
                     return 0;
-
-                break;
             }
+            break;
 #endif // !__WXWINCE__
     }
 
     return ::CallWindowProc(CASTWNDPROC s_wndprocRadioBtn, hwnd, message, wParam, lParam);
 }
 
-WXHRGN wxRadioBox::MSWGetRegionWithoutChildren()
-{
-    RECT rc;
-    ::GetWindowRect(GetHwnd(), &rc);
-    HRGN hrgn = ::CreateRectRgn(rc.left, rc.top, rc.right + 1, rc.bottom + 1);
-
-    const size_t count = GetCount();
-    for ( size_t i = 0; i < count; ++i )
-    {
-        ::GetWindowRect((*m_radioButtons)[i], &rc);
-        AutoHRGN hrgnchild(::CreateRectRgnIndirect(&rc));
-        ::CombineRgn(hrgn, hrgn, hrgnchild, RGN_DIFF);
-    }
-
-    return (WXHRGN)hrgn;
-}
-
-WXLRESULT wxRadioBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
-{
-#ifndef __WXWINCE__
-    if ( nMsg == WM_PRINTCLIENT )
-    {
-        // first check to see if a parent window knows how to paint us better
-        for ( wxWindow *win = GetParent(); win; win = win->GetParent() )
-            if ( win->MSWPrintChild(this, wParam, lParam) )
-                return true;
-
-        // nope, so lets do it ourselves
-        RECT rc;
-        WXHBRUSH hbr = DoMSWControlColor((HDC)wParam, wxNullColour);
-        if ( !hbr )
-        {
-            wxBrush *brush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID);
-            hbr = (WXHBRUSH)brush->GetResourceHandle();
-        }
-
-        ::GetClientRect(GetHwnd(), &rc);
-        ::FillRect((HDC)wParam, &rc, (HBRUSH)hbr);
-
-        return true;
-    }
-#endif
-    // __WXWINCE__
-
-    return wxStaticBox::MSWWindowProc(nMsg, wParam, lParam);
-}
 #endif // wxUSE_RADIOBOX