subclass status bar as any normal window to ensure that the events from the controls inside it are processed normally

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10591 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2001-06-15 23:08:23 +00:00
parent 33a8563e66
commit b3d008dbd5

View File

@@ -57,41 +57,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxStatusBar, wxStatusBar95)
#define StatusBar_GetTextLen(h, n) LOWORD(SendMessage(h, SB_GETTEXTLENGTH, (WPARAM)n, 0)) #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)) #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 // implementation
// ============================================================================ // ============================================================================
@@ -102,9 +67,9 @@ LRESULT APIENTRY wxStatusBarProc(HWND hwnd,
wxStatusBar95::wxStatusBar95() wxStatusBar95::wxStatusBar95()
{ {
SetParent(NULL); SetParent(NULL);
m_hWnd = 0; m_hWnd = 0;
m_windowId = 0; m_windowId = 0;
} }
bool wxStatusBar95::Create(wxWindow *parent, bool wxStatusBar95::Create(wxWindow *parent,
@@ -127,7 +92,6 @@ bool wxStatusBar95::Create(wxWindow *parent,
if ( style & wxCLIP_SIBLINGS ) if ( style & wxCLIP_SIBLINGS )
wstyle |= WS_CLIPSIBLINGS; wstyle |= WS_CLIPSIBLINGS;
// setting SBARS_SIZEGRIP is perfectly useless: it's always on by default // 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 // (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 // 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); SetFieldsCount(1);
SubclassWin(m_hWnd);
// 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);
return TRUE; return TRUE;
} }
@@ -177,17 +132,19 @@ wxStatusBar95::~wxStatusBar95()
void wxStatusBar95::CopyFieldsWidth(const int widths[]) void wxStatusBar95::CopyFieldsWidth(const int widths[])
{ {
if (widths && !m_statusWidths) if (widths && !m_statusWidths)
m_statusWidths = new int[m_nFields]; m_statusWidths = new int[m_nFields];
if ( widths != NULL ) { if ( widths != NULL )
for ( int i = 0; i < m_nFields; i++ ) {
m_statusWidths[i] = widths[i]; for ( int i = 0; i < m_nFields; i++ )
} m_statusWidths[i] = widths[i];
else { }
delete [] m_statusWidths; else // no widths
m_statusWidths = NULL; {
} delete [] m_statusWidths;
m_statusWidths = NULL;
}
} }
void wxStatusBar95::SetFieldsCount(int nFields, const int *widths) 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), wxCHECK_RET( (nField >= 0) && (nField < m_nFields),
_T("invalid statusbar field index") ); _T("invalid statusbar field index") );
if ( !StatusBar_SetText(GetHwnd(), nField, strText) ) { if ( !StatusBar_SetText(GetHwnd(), nField, strText) )
wxLogLastError(wxT("StatusBar_SetText")); {
} wxLogLastError(wxT("StatusBar_SetText"));
}
} }
wxString wxStatusBar95::GetStatusText(int nField) const wxString wxStatusBar95::GetStatusText(int nField) const
@@ -283,14 +241,15 @@ wxString wxStatusBar95::GetStatusText(int nField) const
wxCHECK_MSG( (nField >= 0) && (nField < m_nFields), wxEmptyString, wxCHECK_MSG( (nField >= 0) && (nField < m_nFields), wxEmptyString,
_T("invalid statusbar field index") ); _T("invalid statusbar field index") );
wxString str; wxString str;
int len = StatusBar_GetTextLen(GetHwnd(), nField); int len = StatusBar_GetTextLen(GetHwnd(), nField);
if (len > 0) if ( len > 0 )
{ {
StatusBar_GetText(GetHwnd(), nField, str.GetWriteBuf(len)); StatusBar_GetText(GetHwnd(), nField, str.GetWriteBuf(len));
str.UngetWriteBuf(); str.UngetWriteBuf();
} }
return str;
return str;
} }
int wxStatusBar95::GetBorderX() const int wxStatusBar95::GetBorderX() const