X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6463b9f5399b8670a0c74f2f8666bc2c9f37a406..2d1715aa46b210e69ddf2dd1cd1c7d2f23c4298a:/src/msw/combobox.cpp diff --git a/src/msw/combobox.cpp b/src/msw/combobox.cpp index f71cb41a3f..4c07746705 100644 --- a/src/msw/combobox.cpp +++ b/src/msw/combobox.cpp @@ -213,11 +213,12 @@ LRESULT APIENTRY _EXPORT wxComboEditWndProc(HWND hWnd, return ::CallWindowProc(CASTWNDPROC gs_wndprocEdit, hWnd, message, wParam, lParam); } -WXHBRUSH wxComboBox::OnCtlColor(WXHDC pDC, WXHWND WXUNUSED(pWnd), WXUINT WXUNUSED(nCtlColor), - WXUINT WXUNUSED(message), - WXWPARAM WXUNUSED(wParam), - WXLPARAM WXUNUSED(lParam) - ) +WXHBRUSH wxComboBox::OnCtlColor(WXHDC pDC, + WXHWND WXUNUSED(pWnd), + WXUINT WXUNUSED(nCtlColor), + WXUINT WXUNUSED(message), + WXWPARAM WXUNUSED(wParam), + WXLPARAM WXUNUSED(lParam)) { HDC hdc = (HDC)pDC; wxColour colBack = GetBackgroundColour(); @@ -234,9 +235,30 @@ WXHBRUSH wxComboBox::OnCtlColor(WXHDC pDC, WXHWND WXUNUSED(pWnd), WXUINT WXUNUSE } // ---------------------------------------------------------------------------- -// wxComboBox +// wxComboBox callbacks // ---------------------------------------------------------------------------- +long wxComboBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) +{ + // handle WM_CTLCOLOR messages from our EDIT control to be able to set its + // colour correctly (to be the same as our own one) + switch ( nMsg ) + { + // we have to handle both: one for the normal case and the other for + // wxCB_READONLY + case WM_CTLCOLOREDIT: + case WM_CTLCOLORSTATIC: + WXWORD nCtlColor; + WXHDC hdc; + WXHWND hwnd; + UnpackCtlColor(wParam, lParam, &nCtlColor, &hdc, &hwnd); + + return OnCtlColor(hdc, hwnd, nCtlColor, nMsg, wParam, lParam); + } + + return wxChoice::MSWWindowProc(nMsg, wParam, lParam); +} + bool wxComboBox::MSWProcessEditMsg(WXUINT msg, WXWPARAM wParam, WXLPARAM lParam) { switch ( msg ) @@ -355,6 +377,10 @@ WXHWND wxComboBox::GetEditHWND() const return (WXHWND)hwndEdit; } +// ---------------------------------------------------------------------------- +// wxComboBox creation +// ---------------------------------------------------------------------------- + bool wxComboBox::Create(wxWindow *parent, wxWindowID id, const wxString& value, const wxPoint& pos, @@ -369,50 +395,11 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, // some noticeable flicker while the control rearranges itself m_isShown = FALSE; - // first create wxWin object - if ( !CreateControl(parent, id, pos, size, style, validator, name) ) - return FALSE; - - // get the right style - long msStyle = WS_TABSTOP | WS_VSCROLL | WS_HSCROLL | - CBS_AUTOHSCROLL | CBS_NOINTEGRALHEIGHT /* | WS_CLIPSIBLINGS */; - if ( style & wxCB_READONLY ) - msStyle |= CBS_DROPDOWNLIST; -#ifndef __WXWINCE__ - else if ( style & wxCB_SIMPLE ) - msStyle |= CBS_SIMPLE; // A list (shown always) and edit control -#endif - else - msStyle |= CBS_DROPDOWN; - - if ( style & wxCB_SORT ) - msStyle |= CBS_SORT; - - if ( style & wxCLIP_SIBLINGS ) - msStyle |= WS_CLIPSIBLINGS; - - - // and now create the MSW control - if ( !MSWCreateControl(_T("COMBOBOX"), msStyle) ) + if ( !CreateAndInit(parent, id, pos, size, n, choices, style, + validator, name) ) return FALSE; - // A choice/combobox normally has a white background (or other, depending - // on global settings) rather than inheriting the parent's background colour. - SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); - - for ( int i = 0; i < n; i++ ) - { - Append(choices[i]); - } - - if ( !value.IsEmpty() ) - { - SetValue(value); - } - - // do this after appending the values to the combobox so that autosizing - // works correctly - SetSize(pos.x, pos.y, size.x, size.y); + SetValue(value); // a (not read only) combobox is, in fact, 2 controls: the combobox itself // and an edit control inside it and if we want to catch events from this @@ -433,6 +420,52 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, return TRUE; } +bool wxComboBox::Create(wxWindow *parent, wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style, + const wxValidator& validator, + const wxString& name) +{ + wxCArrayString chs(choices); + return Create(parent, id, value, pos, size, chs.GetCount(), + chs.GetStrings(), style, validator, name); +} + +WXDWORD wxComboBox::MSWGetStyle(long style, WXDWORD *exstyle) const +{ + // we never have an external border + WXDWORD msStyle = wxChoice::MSWGetStyle + ( + (style & ~wxBORDER_MASK) | wxBORDER_NONE, exstyle + ); + + // remove the style always added by wxChoice + msStyle &= ~CBS_DROPDOWNLIST; + + if ( style & wxCB_READONLY ) + msStyle |= CBS_DROPDOWNLIST; +#ifndef __WXWINCE__ + else if ( style & wxCB_SIMPLE ) + msStyle |= CBS_SIMPLE; // A list (shown always) and edit control +#endif + else + msStyle |= CBS_DROPDOWN; + + // there is no reason to not always use CBS_AUTOHSCROLL, so do use it + msStyle |= CBS_AUTOHSCROLL; + + // NB: we used to also add CBS_NOINTEGRALHEIGHT here but why? + + return msStyle; +} + +// ---------------------------------------------------------------------------- +// wxComboBox text control-like methods +// ---------------------------------------------------------------------------- + void wxComboBox::SetValue(const wxString& value) { if ( HasFlag(wxCB_READONLY) ) @@ -560,6 +593,5 @@ void wxComboBox::SetSelection(long from, long to) } } -#endif - // wxUSE_COMBOBOX +#endif // wxUSE_COMBOBOX