X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b07664068bc48173d08e3146ca05dceac275aa6a..4fcd60c72f6b90f5063f7000ff5a80a9004055a3:/src/msw/statbr95.cpp diff --git a/src/msw/statbr95.cpp b/src/msw/statbr95.cpp index c1c3c4706f..6fc87c0d1c 100644 --- a/src/msw/statbr95.cpp +++ b/src/msw/statbr95.cpp @@ -36,7 +36,7 @@ #include "wx/msw/private.h" #include -#if !(defined(__GNUWIN32_OLD__) || defined(__TWIN32__)) +#if defined(__WIN95__) && !((defined(__GNUWIN32_OLD__) || defined(__TWIN32__)) && !defined(__CYGWIN10__)) #include #endif @@ -57,41 +57,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxStatusBar, wxStatusBar95) #define StatusBar_GetTextLen(h, n) LOWORD(SendMessage(h, SB_GETTEXTLENGTH, (WPARAM)n, 0)) #define StatusBar_GetText(h, n, s) LOWORD(SendMessage(h, SB_GETTEXT, (WPARAM)n, (LPARAM)(LPTSTR)s)) -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- - -// static WNDPROC gs_wndprocStatBar = NULL; -static WXFARPROC gs_wndprocStatBar = (WXFARPROC) NULL; - -LRESULT APIENTRY wxStatusBarProc(HWND hwnd, - UINT message, - WPARAM wParam, - LPARAM lParam) -{ - switch (message) { - case WM_COMMAND: - case WM_DRAWITEM: - case WM_MEASUREITEM: - case WM_SIZE: - case WM_MOVE: - case WM_MOUSEMOVE: - case WM_LBUTTONUP: - case WM_LBUTTONDBLCLK: - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - case WM_RBUTTONDBLCLK: - case WM_MBUTTONDOWN: - case WM_MBUTTONUP: - case WM_MBUTTONDBLCLK: - wxStatusBar95 *sb = (wxStatusBar95 *)GetWindowLong(hwnd, GWL_USERDATA); - sb->MSWWindowProc(message, wParam, lParam); - break; - } - - return ::CallWindowProc(CASTWNDPROC gs_wndprocStatBar, hwnd, message, wParam, lParam); -} - // ============================================================================ // implementation // ============================================================================ @@ -102,9 +67,9 @@ LRESULT APIENTRY wxStatusBarProc(HWND hwnd, wxStatusBar95::wxStatusBar95() { - SetParent(NULL); - m_hWnd = 0; - m_windowId = 0; + SetParent(NULL); + m_hWnd = 0; + m_windowId = 0; } bool wxStatusBar95::Create(wxWindow *parent, @@ -127,7 +92,6 @@ bool wxStatusBar95::Create(wxWindow *parent, if ( style & wxCLIP_SIBLINGS ) wstyle |= WS_CLIPSIBLINGS; - // setting SBARS_SIZEGRIP is perfectly useless: it's always on by default // (at least in the version of comctl32.dll I'm using), and the only way to // turn it off is to use CCS_TOP style - as we position the status bar @@ -156,16 +120,7 @@ bool wxStatusBar95::Create(wxWindow *parent, } SetFieldsCount(1); - - // we can't subclass this window as usual because the status bar window - // proc processes WM_SIZE and WM_PAINT specially - // SubclassWin(m_hWnd); - - // but we want to process the messages from it still, so do custom - // subclassing here - gs_wndprocStatBar = (WXFARPROC)GetWindowLong(GetHwnd(), GWL_WNDPROC); - SetWindowLong(GetHwnd(), GWL_WNDPROC, (LONG)wxStatusBarProc); - SetWindowLong(GetHwnd(), GWL_USERDATA, (LONG)this); + SubclassWin(m_hWnd); return TRUE; } @@ -177,17 +132,19 @@ wxStatusBar95::~wxStatusBar95() void wxStatusBar95::CopyFieldsWidth(const int widths[]) { - if (widths && !m_statusWidths) - m_statusWidths = new int[m_nFields]; - - if ( widths != NULL ) { - for ( int i = 0; i < m_nFields; i++ ) - m_statusWidths[i] = widths[i]; - } - else { - delete [] m_statusWidths; - m_statusWidths = NULL; - } + if (widths && !m_statusWidths) + m_statusWidths = new int[m_nFields]; + + if ( widths != NULL ) + { + for ( int i = 0; i < m_nFields; i++ ) + m_statusWidths[i] = widths[i]; + } + else // no widths + { + delete [] m_statusWidths; + m_statusWidths = NULL; + } } void wxStatusBar95::SetFieldsCount(int nFields, const int *widths) @@ -273,9 +230,10 @@ void wxStatusBar95::SetStatusText(const wxString& strText, int nField) wxCHECK_RET( (nField >= 0) && (nField < m_nFields), _T("invalid statusbar field index") ); - if ( !StatusBar_SetText(GetHwnd(), nField, strText) ) { - wxLogLastError(wxT("StatusBar_SetText")); - } + if ( !StatusBar_SetText(GetHwnd(), nField, strText) ) + { + wxLogLastError(wxT("StatusBar_SetText")); + } } wxString wxStatusBar95::GetStatusText(int nField) const @@ -283,14 +241,15 @@ wxString wxStatusBar95::GetStatusText(int nField) const wxCHECK_MSG( (nField >= 0) && (nField < m_nFields), wxEmptyString, _T("invalid statusbar field index") ); - wxString str; - int len = StatusBar_GetTextLen(GetHwnd(), nField); - if (len > 0) - { - StatusBar_GetText(GetHwnd(), nField, str.GetWriteBuf(len)); - str.UngetWriteBuf(); - } - return str; + wxString str; + int len = StatusBar_GetTextLen(GetHwnd(), nField); + if ( len > 0 ) + { + StatusBar_GetText(GetHwnd(), nField, str.GetWriteBuf(len)); + str.UngetWriteBuf(); + } + + return str; } int wxStatusBar95::GetBorderX() const @@ -350,6 +309,16 @@ void wxStatusBar95::DoMoveWindow(int x, int y, int width, int height) // adjust fields widths to the new size SetFieldsWidth(); + + // 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 ) + { + wxSizeEvent event(GetClientSize(), m_windowId); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); + } } #endif // __WIN95__ && wxUSE_NATIVE_STATUSBAR