]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/radiobox.cpp
Remove always moving window to the top of the Z-order on on Show
[wxWidgets.git] / src / msw / radiobox.cpp
index a6df181a1a5f75d141b8895ffd11c2b34e7ed22f..baeb42a491ef70caf8e032e2064e97e53b917f9e 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        msw/radiobox.cpp
+// Name:        src/msw/radiobox.cpp
 // Purpose:     wxRadioBox implementation
 // Author:      Julian Smart
 // Modified by:
 // headers
 // ---------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "radiobox.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
@@ -369,6 +365,8 @@ void wxRadioBox::SetString(int item, const wxString& label)
     m_radioHeight[item] = wxDefaultCoord;
 
     ::SetWindowText((*m_radioButtons)[item], label.c_str());
+
+    InvalidateBestSize();
 }
 
 void wxRadioBox::SetSelection(int N)
@@ -423,7 +421,10 @@ bool wxRadioBox::Show(int item, bool show)
 
     BOOL ret = ::ShowWindow((*m_radioButtons)[item], show ? SW_SHOW : SW_HIDE);
 
-    return (ret != 0) == show;
+    bool changed = (ret != 0) == show;
+    if( changed )
+        InvalidateBestSize();
+    return changed;
 }
 
 WX_FORWARD_STD_METHODS_TO_SUBWINDOWS(wxRadioBox, wxStaticBox, m_radioButtons)
@@ -483,7 +484,7 @@ wxSize wxRadioBox::GetTotalButtonSize(const wxSize& sizeBtn) const
 
     // and also wide enough for its label
     int widthLabel;
-    GetTextExtent(GetTitle(), &widthLabel, NULL);
+    GetTextExtent(GetLabel(), &widthLabel, NULL);
     widthLabel += RADIO_SIZE; // FIXME this is bogus too
     if ( widthLabel > width )
         width = widthLabel;
@@ -493,7 +494,9 @@ wxSize wxRadioBox::GetTotalButtonSize(const wxSize& sizeBtn) const
 
 wxSize wxRadioBox::DoGetBestSize() const
 {
-    return GetTotalButtonSize(GetMaxButtonSize());
+    wxSize best = GetTotalButtonSize(GetMaxButtonSize());
+    CacheBestSize(best);
+    return best;
 }
 
 // Restored old code.
@@ -545,7 +548,7 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
             height = heightOld;
     }
 
-    ::MoveWindow(GetHwnd(), xx, yy, width, height, TRUE);
+    DoMoveWindow(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
@@ -644,6 +647,49 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
     }
 }
 
+// ----------------------------------------------------------------------------
+// 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)
+{
+    // 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?)
+    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,64 +853,12 @@ 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::MSWCalculateClippingRegion()
-{
-    RECT rc;
-    ::GetWindowRect(GetHwnd(), &rc);
-    HRGN hrgn = ::CreateRectRgn(rc.left, rc.top, rc.right + 1, rc.bottom + 1);
-
-    size_t count = GetCount();
-    for ( size_t i = 0; i < count; ++i )
-    {
-        ::GetWindowRect((*m_radioButtons)[i], &rc);
-        HRGN hrgnchild = ::CreateRectRgnIndirect(&rc);
-        ::CombineRgn(hrgn, hrgn, hrgnchild, RGN_DIFF);
-        ::DeleteObject(hrgnchild);
-    }
-
-    ::GetWindowRect(GetHwnd(), &rc);
-    ::OffsetRgn(hrgn, -rc.left, -rc.top);
-
-    return 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
-