From c07103f267adc57a49d2fffa12acdd06b3ff7a57 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 28 Aug 2005 16:21:36 +0000 Subject: [PATCH] fixed status bar positioning to work both with and without sizers (patch 1199639 by Jamie Gadd) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35351 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + include/wx/msw/statbr95.h | 4 +++ src/msw/statbr95.cpp | 66 +++++++++++++++++++++++++++++++-------- 3 files changed, 58 insertions(+), 13 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index ae978e38b3..1223307636 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -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: diff --git a/include/wx/msw/statbr95.h b/include/wx/msw/statbr95.h index 980a919feb..022c4e51ee 100644 --- a/include/wx/msw/statbr95.h +++ b/include/wx/msw/statbr95.h @@ -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) }; diff --git a/src/msw/statbr95.cpp b/src/msw/statbr95.cpp index 37b9b03f73..c5ba278494 100644 --- a/src/msw/statbr95.cpp +++ b/src/msw/statbr95.cpp @@ -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 -- 2.47.2