fixed status bar positioning to work both with and without sizers (patch 1199639...
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 28 Aug 2005 16:21:36 +0000 (16:21 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 28 Aug 2005 16:21:36 +0000 (16:21 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35351 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/msw/statbr95.h
src/msw/statbr95.cpp

index ae978e38b31069f9afe525d696e96c82c33ba58d..1223307636ec8cecf346201e1c0417a3c5d23f7d 100644 (file)
@@ -45,6 +45,7 @@ wxMSW:
 - Fixed asynchronous playback of large sound files in wxSound.
 - Added wxDynamicLibrary::GetSymbolAorW().
 - Fixed default size of wxStaticText controls with border being too small.
+- Fixed bugs with wxStatusBar positioning (with or withour sizers) (Jamie Gadd)
 
 wxGTK:
 
index 980a919feb8ccad30532d5d92b2cf5ba343b24bc..022c4e51ee382d87295d7e0d51c09f24a76ca6bc 100644 (file)
@@ -68,6 +68,10 @@ protected:
     // override base class virtual
     void DoMoveWindow(int x, int y, int width, int height);
 
+    virtual WXLRESULT MSWWindowProc(WXUINT nMsg,
+                                    WXWPARAM wParam,
+                                    WXLPARAM lParam);
+
 private:
     DECLARE_DYNAMIC_CLASS_NO_COPY(wxStatusBar95)
 };
index 37b9b03f73c7822e6263418f242a23067461b37d..c5ba278494049afeeb2e79b9969221a1734653dc 100644 (file)
@@ -119,7 +119,7 @@ bool wxStatusBar95::Create(wxWindow *parent,
     InheritAttributes();
 
     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_MENUBAR));
-    
+
     // we must refresh the frame size when the statusbar is created, because
     // its client area might change
     wxFrame *frame = wxDynamicCast(GetParent(), wxFrame);
@@ -279,18 +279,17 @@ bool wxStatusBar95::GetFieldRect(int i, wxRect& rect) const
 
 void wxStatusBar95::DoMoveWindow(int x, int y, int width, int height)
 {
-    // the status bar wnd proc must be forwarded the WM_SIZE message whenever
-    // the stat bar position/size is changed because it normally positions the
-    // control itself along bottom or top side of the parent window - failing
-    // to do so will result in nasty visual effects
-    FORWARD_WM_SIZE(GetHwnd(), SIZE_RESTORED, x, y, SendMessage);
-
-    // but now, when the standard status bar wnd proc did all it wanted to do,
-    // move the status bar to its correct location - usually this call may be
-    // omitted because for normal status bars (positioned along the bottom
-    // edge) the position is already set correctly, but if the user wants to
-    // position them in some exotic location, this is really needed
-    wxWindowMSW::DoMoveWindow(x, y, width, height);
+    if ( GetParent()->IsSizeDeferred() )
+    {
+        wxWindowMSW::DoMoveWindow(x, y, width, height);
+    }
+    else
+    {
+        // parent pos/size isn't deferred so do it now but don't send
+        // WM_WINDOWPOSCHANGING since we don't want to change pos/size later
+        ::SetWindowPos(GetHwnd(), NULL, x, y, width, height,
+                       SWP_NOZORDER | SWP_NOSENDCHANGING);
+    }
 
     // adjust fields widths to the new size
     SetFieldsWidth();
@@ -340,5 +339,46 @@ void wxStatusBar95::SetStatusStyles(int n, const int styles[])
     }
 }
 
+WXLRESULT
+wxStatusBar95::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
+{
+    if ( nMsg == WM_WINDOWPOSCHANGING )
+    {
+        WINDOWPOS *lpPos = (WINDOWPOS *)lParam;
+        int x, y, w, h;
+        GetPosition(&x, &y);
+        GetSize(&w, &h);
+
+        lpPos->x  = x;
+        lpPos->y  = y;
+        lpPos->cx = w;
+        lpPos->cy = h;
+
+        return 0;
+    }
+    if ( nMsg == WM_NCLBUTTONDOWN )
+    {
+        // if hit-test is on gripper then send message to TLW to begin
+        // resizing. It is possible to send this message to any window.
+        if ( wParam == HTBOTTOMRIGHT )
+        {
+            wxWindow *win;
+
+            for ( win = GetParent(); win; win = win->GetParent() )
+            {
+                if ( win->IsTopLevel() )
+                {
+                    SendMessage(GetHwndOf(win), WM_NCLBUTTONDOWN,
+                                wParam, lParam);
+
+                    return 0;
+                }
+            }
+        }
+    }
+
+    return wxStatusBarBase::MSWWindowProc(nMsg, wParam, lParam);
+}
+
 #endif // __WIN95__ && wxUSE_NATIVE_STATUSBAR