// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "statbr95.h"
#endif
#include "wx/dcclient.h"
#endif
-#if defined(__WIN95__) && wxUSE_NATIVE_STATUSBAR
+#if wxUSE_STATUSBAR && defined(__WIN95__) && wxUSE_NATIVE_STATUSBAR
#include "wx/intl.h"
#include "wx/log.h"
#include "wx/msw/private.h"
#include <windowsx.h>
-#if defined(__WIN95__) && !((defined(__GNUWIN32_OLD__) || defined(__TWIN32__)) && !defined(__CYGWIN10__))
+#if defined(__WIN95__) && !(defined(__GNUWIN32_OLD__) && !defined(__CYGWIN10__))
#include <commctrl.h>
#endif
long style,
const wxString& name)
{
- wxCHECK_MSG( parent, FALSE, wxT("status bar must have a parent") );
+ wxCHECK_MSG( parent, false, wxT("status bar must have a parent") );
SetName(name);
SetWindowStyleFlag(style);
parent->AddChild(this);
- m_windowId = id == -1 ? NewControlId() : id;
+ m_windowId = id == wxID_ANY ? NewControlId() : id;
DWORD wstyle = WS_CHILD | WS_VISIBLE;
}
else
{
+#ifndef __WXWINCE__
// may be some versions of comctl32.dll do need it - anyhow, it won't
// do any harm
wstyle |= SBARS_SIZEGRIP;
+#endif
}
m_hWnd = (WXHWND)CreateStatusWindow(wstyle,
{
wxLogSysError(_("Failed to create a status bar."));
- return FALSE;
+ return false;
}
SetFieldsCount(1);
SubclassWin(m_hWnd);
+ 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);
+ if ( frame )
+ {
+ frame->SendSizeEvent();
+ }
- return TRUE;
+ return true;
}
wxStatusBar95::~wxStatusBar95()
{
+ // we must refresh the frame size when the statusbar is deleted but the
+ // frame is not - otherwise statusbar leaves a hole in the place it used to
+ // occupy
+ wxFrame *frame = wxDynamicCast(GetParent(), wxFrame);
+ if ( frame && !frame->IsBeingDeleted() )
+ {
+ frame->SendSizeEvent();
+ }
}
void wxStatusBar95::SetFieldsCount(int nFields, const int *widths)
wxCHECK_RET( (nField >= 0) && (nField < m_nFields),
_T("invalid statusbar field index") );
- if ( !StatusBar_SetText(GetHwnd(), nField, strText) )
+ // Get field style, if any
+ int style;
+ if (m_statusStyles)
+ {
+ switch(m_statusStyles[nField])
+ {
+ case wxSB_RAISED:
+ style = SBT_POPOUT;
+ break;
+ case wxSB_FLAT:
+ style = SBT_NOBORDERS;
+ break;
+ case wxSB_NORMAL:
+ default:
+ style = 0;
+ break;
+ }
+ }
+ else
+ style = 0;
+
+ // Pass both field number and style. MSDN library doesn't mention
+ // that nField and style have to be 'ORed'
+ if ( !StatusBar_SetText(GetHwnd(), nField | style, strText) )
{
wxLogLastError(wxT("StatusBar_SetText"));
}
int len = StatusBar_GetTextLen(GetHwnd(), nField);
if ( len > 0 )
{
- StatusBar_GetText(GetHwnd(), nField, str.GetWriteBuf(len));
- str.UngetWriteBuf();
+ StatusBar_GetText(GetHwnd(), nField, wxStringBuffer(str, len));
}
return str;
bool wxStatusBar95::GetFieldRect(int i, wxRect& rect) const
{
- wxCHECK_MSG( (i >= 0) && (i < m_nFields), FALSE,
+ wxCHECK_MSG( (i >= 0) && (i < m_nFields), false,
_T("invalid statusbar field index") );
RECT r;
wxCopyRECTToRect(r, rect);
- return TRUE;
+ return true;
}
void wxStatusBar95::DoMoveWindow(int x, int y, int width, int height)
// 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
- wxWindow::DoMoveWindow(x, y, width, height);
+ wxWindowMSW::DoMoveWindow(x, y, width, height);
// adjust fields widths to the new size
SetFieldsWidth();
- // we have to trigger wxSizeEvent if there are children window in status
+ // we have to trigger wxSizeEvent if there are children window in status
// bar because GetFieldRect returned incorrect (not updated) values up to
// here, which almost certainly resulted in incorrectly redrawn statusbar
if ( m_children.GetCount() > 0 )
}
}
+void wxStatusBar95::SetStatusStyles(int n, const int styles[])
+{
+ wxStatusBarBase::SetStatusStyles(n, styles);
+
+ if (n != m_nFields)
+ return;
+
+ for (int i = 0; i < n; i++)
+ {
+ int style;
+ switch(styles[i])
+ {
+ case wxSB_RAISED:
+ style = SBT_POPOUT;
+ break;
+ case wxSB_FLAT:
+ style = SBT_NOBORDERS;
+ break;
+ case wxSB_NORMAL:
+ default:
+ style = 0;
+ break;
+ }
+ // The SB_SETTEXT message is both used to set the field's text as well as
+ // the fields' styles. MSDN library doesn't mention
+ // that nField and style have to be 'ORed'
+ wxString text = GetStatusText(i);
+ if (!StatusBar_SetText(GetHwnd(), style | i, text))
+ {
+ wxLogLastError(wxT("StatusBar_SetText"));
+ }
+ }
+}
+
#endif // __WIN95__ && wxUSE_NATIVE_STATUSBAR