X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/340196c001690cd784e7e3f2fc54cd449324f914..3f8e5072f7391db2158f44c6b9209bbb3db6eb06:/src/msw/combobox.cpp diff --git a/src/msw/combobox.cpp b/src/msw/combobox.cpp index 93e9b8a731..f00c1297c9 100644 --- a/src/msw/combobox.cpp +++ b/src/msw/combobox.cpp @@ -20,46 +20,46 @@ #pragma hdrstop #endif +#if wxUSE_COMBOBOX + #ifndef WX_PRECOMP -#include "wx/setup.h" +#include "wx/settings.h" #endif -#if wxUSE_COMBOBOX - #include "wx/combobox.h" #include "wx/clipbrd.h" #include "wx/msw/private.h" -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxComboBox, wxControl) -#endif bool wxComboBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) { - if (param == CBN_SELCHANGE) - { - if (GetSelection() > -1) + switch ( param ) { - wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_SELECTED, m_windowId); - event.SetInt(GetSelection()); - event.SetEventObject(this); - event.SetString(GetStringSelection()); - ProcessCommand(event); + case CBN_SELCHANGE: + if (GetSelection() > -1) + { + wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_SELECTED, GetId()); + event.SetInt(GetSelection()); + event.SetEventObject(this); + event.SetString(GetStringSelection()); + ProcessCommand(event); + } + break; + + case CBN_EDITCHANGE: + { + wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId()); + event.SetString(GetValue()); + event.SetEventObject(this); + ProcessCommand(event); + } + break; } - return TRUE; - } - else if (param == CBN_EDITCHANGE) - { - wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId); - event.SetString(GetValue()); - event.SetEventObject(this); - ProcessCommand(event); - - return TRUE; - } - else - return FALSE; + // there is no return value for the CBN_ notifications, so always return + // FALSE from here to pass the message to DefWindowProc() + return FALSE; } bool wxComboBox::Create(wxWindow *parent, wxWindowID id, @@ -72,7 +72,9 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, const wxString& name) { SetName(name); +#if wxUSE_VALIDATORS SetValidator(validator); +#endif // wxUSE_VALIDATORS if (parent) parent->AddChild(this); // SetBackgroundColour(parent->GetBackgroundColour()) ; @@ -94,8 +96,8 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, int width = size.x; int height = size.y; - long msStyle = WS_CHILD | WS_TABSTOP | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | - CBS_NOINTEGRALHEIGHT; + long msStyle = WS_CHILD | WS_TABSTOP | WS_VISIBLE | + WS_VSCROLL | WS_HSCROLL | CBS_AUTOHSCROLL | CBS_NOINTEGRALHEIGHT; if (m_windowStyle & wxCB_READONLY) msStyle |= CBS_DROPDOWNLIST; @@ -325,11 +327,36 @@ void wxComboBox::SetSelection(long from, long to) #endif } -void wxComboBox::DoSetSize(int x, int y, - int width, int height, - int sizeFlags) +void wxComboBox::DoMoveWindow(int x, int y, int width, int height) { - wxControl::DoSetSize(x, y, width, height, sizeFlags); + int cx, cy; + wxGetCharSize(GetHWND(), &cx, &cy, &GetFont()); + + // what should the height of the drop down list be? we choose 10 items by + // default and also 10 items max (if we always use n, the list will never + // have vertical scrollbar) + int n = GetCount(); + if ( !n ) + n = 10; + else if ( n > 10 ) + n = 10; + + height = n * EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy); + + wxControl::DoMoveWindow(x, y, width, height); +} + +wxSize wxComboBox::DoGetBestSize() const +{ + // the choice calculates the horz size correctly, but not the vertical + // component: correct it + wxSize size = wxChoice::DoGetBestSize(); + + int cx, cy; + wxGetCharSize(GetHWND(), &cx, &cy, &GetFont()); + size.y = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy); + + return size; } #endif