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
This commit is contained in:
@@ -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:
|
||||
|
||||
|
@@ -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)
|
||||
};
|
||||
|
@@ -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
|
||||
|
||||
|
Reference in New Issue
Block a user