From baccb514311d801fc4268e10bbccdb7f0b566522 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 28 Oct 1999 00:38:59 +0000 Subject: [PATCH] 1. more code commented out by DW (@#%#%!#%!@) uncommented 2. wxSpinCtrl calculates its default size better and sends notifications as wxSpinButton does git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4233 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/spinctrl.h | 6 ++- samples/controls/controls.cpp | 23 ++++++++- src/msw/listbox.cpp | 7 ++- src/msw/spinctrl.cpp | 97 ++++++++++++++++++++++++++--------- 4 files changed, 101 insertions(+), 32 deletions(-) diff --git a/include/wx/msw/spinctrl.h b/include/wx/msw/spinctrl.h index 141823067a..4471ccd5dc 100644 --- a/include/wx/msw/spinctrl.h +++ b/include/wx/msw/spinctrl.h @@ -48,8 +48,12 @@ public: int min = 0, int max = 100, int initial = 0, const wxString& name = _T("wxSpinCtrl")); + // override some of the base class virtuals + virtual bool SetFont(const wxFont &font); + protected: - void DoMoveWindow(int x, int y, int width, int height); + virtual void DoMoveWindow(int x, int y, int width, int height); + virtual wxSize DoGetBestSize(); WXHWND m_hwndBuddy; diff --git a/samples/controls/controls.cpp b/samples/controls/controls.cpp index 033f8af167..f4719a7b86 100644 --- a/samples/controls/controls.cpp +++ b/samples/controls/controls.cpp @@ -105,6 +105,10 @@ public: void OnShowProgress( wxCommandEvent &event ); #endif // wxUSE_SPINBUTTON +#if wxUSE_SPINCTRL + void OnSpinCtrl(wxSpinEvent& event); +#endif // wxUSE_SPINCTRL + wxListBox *m_listbox, *m_listboxSorted; wxChoice *m_choice, @@ -271,6 +275,7 @@ const int ID_SLIDER = 181; const int ID_SPIN = 182; const int ID_BTNPROGRESS = 183; const int ID_BUTTON_LABEL = 184; +const int ID_SPINCTRL = 185; BEGIN_EVENT_TABLE(MyPanel, wxPanel) EVT_SIZE ( MyPanel::OnSize) @@ -316,7 +321,10 @@ EVT_SPIN_UP (ID_SPIN, MyPanel::OnSpinUp) EVT_SPIN_DOWN (ID_SPIN, MyPanel::OnSpinDown) EVT_UPDATE_UI (ID_BTNPROGRESS, MyPanel::OnUpdateShowProgress) EVT_BUTTON (ID_BTNPROGRESS, MyPanel::OnShowProgress) -#endif +#endif // wxUSE_SPINBUTTON +#if wxUSE_SPINCTRL +EVT_SPIN (ID_SPINCTRL, MyPanel::OnSpinCtrl) +#endif // wxUSE_SPINCTRL EVT_BUTTON (ID_BUTTON_LABEL, MyPanel::OnUpdateLabel) END_EVENT_TABLE() @@ -519,7 +527,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) #endif // wxUSE_SPINBUTTON #if wxUSE_SPINCTRL - m_spinctrl = new wxSpinCtrl( panel, -1, wxPoint(200, 160), wxSize(80, -1) ); + m_spinctrl = new wxSpinCtrl( panel, ID_SPINCTRL, wxPoint(200, 160), wxSize(80, -1) ); m_spinctrl->SetRange(10,30); m_spinctrl->SetValue(15); #endif // wxUSE_SPINCTRL @@ -905,6 +913,17 @@ void MyPanel::OnSliderUpdate( wxCommandEvent &WXUNUSED(event) ) m_gauge->SetValue( m_slider->GetValue() ); } +#if wxUSE_SPINCTRL + +void MyPanel::OnSpinCtrl(wxSpinEvent& event) +{ + wxString s; + s.Printf(_T("Current value of spin ctrl is %d\n"), m_spinctrl->GetValue()); + m_text->AppendText(s); +} + +#endif // wxUSE_SPINCTRL + #if wxUSE_SPINBUTTON void MyPanel::OnSpinUp( wxSpinEvent &event ) { diff --git a/src/msw/listbox.cpp b/src/msw/listbox.cpp index 7220cf5ef1..5b2e30ab63 100644 --- a/src/msw/listbox.cpp +++ b/src/msw/listbox.cpp @@ -230,7 +230,7 @@ bool wxListBox::Create(wxWindow *parent, wxListBox::~wxListBox() { -// Free(); + Free(); } void wxListBox::SetupColours() @@ -348,7 +348,7 @@ int wxListBox::FindString(const wxString& s) const void wxListBox::Clear() { -// Free(); + Free(); ListBox_ResetContent(GetHwnd()); @@ -356,7 +356,6 @@ void wxListBox::Clear() SetHorizontalExtent(); } -/* void wxListBox::Free() { #if wxUSE_OWNER_DRAWN @@ -379,7 +378,7 @@ void wxListBox::Free() } } } -*/ + void wxListBox::SetSelection(int N, bool select) { wxCHECK_RET( N >= 0 && N < m_noItems, diff --git a/src/msw/spinctrl.cpp b/src/msw/spinctrl.cpp index 2ee0255f6c..983181c466 100644 --- a/src/msw/spinctrl.cpp +++ b/src/msw/spinctrl.cpp @@ -54,8 +54,10 @@ // constants // ---------------------------------------------------------------------------- -// the margin between the up-down control and its buddy -static const int MARGIN_BETWEEN = 5; +// the margin between the up-down control and its buddy (can be arbitrary, +// choose what you like - or may be decide during run-time depending on the +// font size?) +static const int MARGIN_BETWEEN = 1; // ============================================================================ // implementation @@ -82,6 +84,12 @@ bool wxSpinCtrl::Create(wxWindow *parent, // and we need to fit them both in the given width (height is the same) wxSize sizeText(size), sizeBtn(size); sizeBtn.x = wxSpinButton::DoGetBestSize().x; + if ( sizeText.x <= 0 ) + { + // DEFAULT_ITEM_WIDTH is the default width for the text control + sizeText.x = DEFAULT_ITEM_WIDTH + MARGIN_BETWEEN + sizeBtn.x; + } + sizeText.x -= sizeBtn.x + MARGIN_BETWEEN; if ( sizeText.x <= 0 ) { @@ -101,27 +109,18 @@ bool wxSpinCtrl::Create(wxWindow *parent, SetValue(initial); // create the text window - if ( sizeText.y <= 0 ) - { - // make it the same height as the button then - int x, y; - wxSpinButton::DoGetSize(&x, &y); - - sizeText.y = y; - } - m_hwndBuddy = (WXHWND)::CreateWindowEx ( - WS_EX_CLIENTEDGE, // sunken border - _T("EDIT"), // window class - NULL, // no window title - WS_CHILD | WS_VISIBLE | WS_BORDER, // style - pos.x, pos.y, // position - sizeText.x, sizeText.y, // size - GetHwndOf(parent), // parent - (HMENU)-1, // control id - wxGetInstance(), // app instance - NULL // unused client data + WS_EX_CLIENTEDGE, // sunken border + _T("EDIT"), // window class + NULL, // no window title + WS_CHILD | WS_BORDER, // style (will be shown later) + pos.x, pos.y, // position + 0, 0, // size (will be set later) + GetHwndOf(parent), // parent + (HMENU)-1, // control id + wxGetInstance(), // app instance + NULL // unused client data ); if ( !m_hwndBuddy ) @@ -132,11 +131,41 @@ bool wxSpinCtrl::Create(wxWindow *parent, } // should have the same font as the other controls - WXHANDLE hFont = GetParent()->GetFont().GetResourceHandle(); - ::SendMessage((HWND)m_hwndBuddy, WM_SETFONT, (WPARAM)hFont, TRUE); + SetFont(GetParent()->GetFont()); + + // set the size of the text window - can do it only now, because we + // couldn't call DoGetBestSize() before as font wasn't set + if ( sizeText.y <= 0 ) + { + // make it the same height as the button then + sizeText.y = DoGetBestSize().y; + } + + DoMoveWindow(pos.x, pos.y, + sizeText.x + sizeBtn.x + MARGIN_BETWEEN, sizeText.y); + + (void)::ShowWindow((HWND)m_hwndBuddy, SW_SHOW); // associate the text window with the spin button - (void)SendMessage(GetHwnd(), UDM_SETBUDDY, (WPARAM)m_hwndBuddy, 0); + (void)::SendMessage(GetHwnd(), UDM_SETBUDDY, (WPARAM)m_hwndBuddy, 0); + + return TRUE; +} + +// ---------------------------------------------------------------------------- +// when setting font, we need to do it for both controls +// ---------------------------------------------------------------------------- + +bool wxSpinCtrl::SetFont(const wxFont& font) +{ + if ( !wxWindowBase::SetFont(font) ) + { + // nothing to do + return FALSE; + } + + WXHANDLE hFont = GetFont().GetResourceHandle(); + (void)::SendMessage((HWND)m_hwndBuddy, WM_SETFONT, (WPARAM)hFont, TRUE); return TRUE; } @@ -145,9 +174,27 @@ bool wxSpinCtrl::Create(wxWindow *parent, // size calculations // ---------------------------------------------------------------------------- +wxSize wxSpinCtrl::DoGetBestSize() +{ + wxSize sizeBtn = wxSpinButton::DoGetBestSize(); + sizeBtn.x += DEFAULT_ITEM_WIDTH + MARGIN_BETWEEN; + + int y; + wxGetCharSize(GetHWND(), NULL, &y, &GetFont()); + y = EDIT_HEIGHT_FROM_CHAR_HEIGHT(y); + + if ( sizeBtn.y < y ) + { + // make the text tall enough + sizeBtn.y = y; + } + + return sizeBtn; +} + void wxSpinCtrl::DoMoveWindow(int x, int y, int width, int height) { - int widthBtn = DoGetBestSize().x; + int widthBtn = wxSpinButton::DoGetBestSize().x; int widthText = width - widthBtn - MARGIN_BETWEEN; if ( widthText <= 0 ) {