]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/statbox.cpp
Set missing Language: headers in PO files.
[wxWidgets.git] / src / msw / statbox.cpp
index 3bd2e55081e680b35f9a9b8d79e77c114e89664e..678a2594cff0245ac8310816db7a81ab8f8dc4f8 100644 (file)
@@ -4,7 +4,6 @@
 // Author:      Julian Smart
 // Modified by:
 // Created:     04/01/98
-// RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -82,7 +81,13 @@ bool wxStaticBox::Create(wxWindow *parent,
 
 #ifndef __WXWINCE__
     if (!wxSystemOptions::IsFalse(wxT("msw.staticbox.optimized-paint")))
+    {
         Connect(wxEVT_PAINT, wxPaintEventHandler(wxStaticBox::OnPaint));
+
+        // Our OnPaint() completely erases our background, so don't do it in
+        // WM_ERASEBKGND too to avoid flicker.
+        SetBackgroundStyle(wxBG_STYLE_PAINT);
+    }
 #endif // !__WXWINCE__
 
     return true;
@@ -99,11 +104,15 @@ WXDWORD wxStaticBox::MSWGetStyle(long style, WXDWORD *exstyle) const
     if ( exstyle )
     {
 #ifndef __WXWINCE__
+        // We may have children inside this static box, so use this style for
+        // TAB navigation to work if we ever use IsDialogMessage() to implement
+        // it (currently we don't because it's too buggy and implement TAB
+        // navigation ourselves, but this could change in the future).
+        *exstyle |= WS_EX_CONTROLPARENT;
+
         if (wxSystemOptions::IsFalse(wxT("msw.staticbox.optimized-paint")))
-            *exstyle = WS_EX_TRANSPARENT;
-        else
+            *exstyle |= WS_EX_TRANSPARENT;
 #endif
-            *exstyle = 0;
     }
 
     styleWin |= BS_GROUPBOX;
@@ -275,8 +284,14 @@ WXHRGN wxStaticBox::MSWGetRegionWithoutChildren()
     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);
+    // Iterate over all sibling windows as in the old wxWidgets API the
+    // controls appearing inside the static box were created as its siblings
+    // and not children. This is now deprecated but should still work.
+    //
+    // Also notice that we must iterate over all windows, not just all
+    // wxWindows, as there may be composite windows etc.
+    HWND child;
+    for ( child = ::GetWindow(GetHwndOf(GetParent()), GW_CHILD);
           child;
           child = ::GetWindow(child, GW_HWNDNEXT) )
     {
@@ -328,6 +343,23 @@ WXHRGN wxStaticBox::MSWGetRegionWithoutChildren()
         }
     }
 
+    // Also iterate over all children of the static box, we need to clip them
+    // out as well.
+    for ( child = ::GetWindow(GetHwnd(), GW_CHILD);
+          child;
+          child = ::GetWindow(child, GW_HWNDNEXT) )
+    {
+        if ( !::IsWindowVisible(child) )
+        {
+            // if the window isn't visible then it doesn't need clipped
+            continue;
+        }
+
+        ::GetWindowRect(child, &rc);
+        AutoHRGN hrgnChild(::CreateRectRgnIndirect(&rc));
+        ::CombineRgn(hrgn, hrgn, hrgnChild, RGN_DIFF);
+    }
+
     return (WXHRGN)hrgn;
 }
 
@@ -364,6 +396,7 @@ void wxStaticBox::PaintForeground(wxDC& dc, const RECT& rc)
     wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl();
     MSWDefWindowProc(WM_PAINT, (WPARAM)GetHdcOf(*impl), 0);
 
+#if wxUSE_UXTHEME
     // when using XP themes, neither setting the text colour nor transparent
     // background mode doesn't change anything: the static box def window proc
     // still draws the label in its own colours, so we need to redraw the text
@@ -485,6 +518,7 @@ void wxStaticBox::PaintForeground(wxDC& dc, const RECT& rc)
                        drawTextFlags | DT_RTLREADING);
         }
     }
+#endif // wxUSE_UXTHEME
 }
 
 void wxStaticBox::OnPaint(wxPaintEvent& WXUNUSED(event))
@@ -543,26 +577,4 @@ void wxStaticBox::OnPaint(wxPaintEvent& WXUNUSED(event))
 
 #endif // !__WXWINCE__
 
-
-wxPoint wxStaticBox::GetClientAreaOrigin() const
-{
-    // See: http://msdn.microsoft.com/en-us/library/aa511279.aspx
-    wxPoint pt = ConvertDialogToPixels(wxPoint(6,11));
-    return pt;
-}
-
-
-void wxStaticBox::DoGetClientSize(int *width, int *height) const
-{
-    // See: http://msdn.microsoft.com/en-us/library/aa511279.aspx
-    wxPoint lr = ConvertDialogToPixels(wxPoint(6,7));
-    wxPoint ul = GetClientAreaOrigin();
-    wxSize  sz = GetSize();
-    
-    if (width)
-        *width = sz.x - ul.x - lr.x;
-    if (height)
-        *height = sz.y - ul.y - lr.x;
-}
-
 #endif // wxUSE_STATBOX