X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dc302518e6bf48326d202475bf78874fedcb2d9c..052d2fc5818243dadbc1ec54b1120e295304fc55:/src/msw/choice.cpp diff --git a/src/msw/choice.cpp b/src/msw/choice.cpp index 6abcdaef9a..0848b22251 100644 --- a/src/msw/choice.cpp +++ b/src/msw/choice.cpp @@ -28,7 +28,7 @@ #pragma hdrstop #endif -#if wxUSE_CHOICE +#if wxUSE_CHOICE && !(defined(__SMARTPHONE__) && defined(__WXWINCE__)) #ifndef WX_PRECOMP #include "wx/choice.h" @@ -138,11 +138,11 @@ bool wxChoice::CreateAndInit(wxWindow *parent, { // initialize wxControl if ( !CreateControl(parent, id, pos, size, style, validator, name) ) - return FALSE; + return false; // now create the real HWND if ( !MSWCreateControl(wxT("COMBOBOX"), _T(""), pos, size) ) - return FALSE; + return false; // choice/combobox normally has "white" (depends on colour scheme, of @@ -158,7 +158,7 @@ bool wxChoice::CreateAndInit(wxWindow *parent, // and now we may finally size the control properly (if needed) SetBestSize(size); - return TRUE; + return true; } bool wxChoice::Create(wxWindow *parent, @@ -232,7 +232,8 @@ int wxChoice::DoAppend(const wxString& item) { // we need to refresh our size in order to have enough space for the // newly added items - UpdateVisibleHeight(); + if ( !IsFrozen() ) + UpdateVisibleHeight(); } return n; @@ -250,7 +251,8 @@ int wxChoice::DoInsert(const wxString& item, int pos) } else // ok { - UpdateVisibleHeight(); + if ( !IsFrozen() ) + UpdateVisibleHeight(); } return n; @@ -267,7 +269,8 @@ void wxChoice::Delete(int n) SendMessage(GetHwnd(), CB_DELETESTRING, n, 0); - UpdateVisibleHeight(); + if ( !IsFrozen() ) + UpdateVisibleHeight(); } void wxChoice::Clear() @@ -276,7 +279,8 @@ void wxChoice::Clear() SendMessage(GetHwnd(), CB_RESETCONTENT, 0, 0); - UpdateVisibleHeight(); + if ( !IsFrozen() ) + UpdateVisibleHeight(); } void wxChoice::Free() @@ -323,7 +327,7 @@ int wxChoice::FindString(const wxString& s) const for ( int i = 0; i < count; i++ ) { // as CB_FINDSTRINGEXACT is case insensitive, be case insensitive too - if ( GetString(i).IsSameAs(s, FALSE) ) + if ( GetString(i).IsSameAs(s, false) ) return i; } @@ -431,7 +435,7 @@ wxClientData* wxChoice::DoGetItemClientObject( int n ) const void wxChoice::UpdateVisibleHeight() { // be careful to not change the width here - DoSetSize(-1, -1, -1, GetSize().y, wxSIZE_USE_EXISTING); + DoSetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, GetSize().y, wxSIZE_USE_EXISTING); } void wxChoice::DoMoveWindow(int x, int y, int width, int height) @@ -458,7 +462,7 @@ void wxChoice::DoGetSize(int *w, int *h) const // total height of the control including the drop down list -- but only // sometimes, and normally it isn't... I have no idea about what to do with // this - wxControl::DoGetSize(w, h); + wxControl::DoGetSize(w, h); } void wxChoice::DoSetSize(int x, int y, @@ -470,15 +474,15 @@ void wxChoice::DoSetSize(int x, int y, // the height which we must pass to Windows should be the total height of // the control including the drop down list while the height given to us // is, of course, just the height of the permanently visible part of it - if ( height != -1 ) + if ( height != wxDefaultCoord ) { // don't make the drop down list too tall, arbitrarily limit it to 40 // items max and also don't leave it empty size_t nItems = GetCount(); if ( !nItems ) nItems = 9; - else if ( nItems > 39 ) - nItems = 39; + else if ( nItems > 24 ) + nItems = 24; // add space for the drop down list const int hItem = SendMessage(GetHwnd(), CB_GETITEMHEIGHT, 0, 0); @@ -495,7 +499,7 @@ void wxChoice::DoSetSize(int x, int y, // if the height specified for the visible part of the control is // different from the current one, we need to change it separately // as it is not affected by normal WM_SETSIZE - if ( height != -1 ) + if ( height != wxDefaultCoord ) { const int delta = heightOrig - GetSize().y; if ( delta ) @@ -535,18 +539,37 @@ wxSize wxChoice::DoGetBestSize() const WXLRESULT wxChoice::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) { - if ( nMsg == WM_LBUTTONUP ) + switch ( nMsg ) { - int x = (int)LOWORD(lParam); - int y = (int)HIWORD(lParam); - - // Ok, this is truly weird, but if a panel with a wxChoice loses the - // focus, then you get a *fake* WM_LBUTTONUP message with x = 65535 and - // y = 65535. Filter out this nonsense. - // - // VZ: I'd like to know how to reproduce this please... - if ( x == 65535 && y == 65535 ) - return 0; + case WM_LBUTTONUP: + { + int x = (int)LOWORD(lParam); + int y = (int)HIWORD(lParam); + + // Ok, this is truly weird, but if a panel with a wxChoice + // loses the focus, then you get a *fake* WM_LBUTTONUP message + // with x = 65535 and y = 65535. Filter out this nonsense. + // + // VZ: I'd like to know how to reproduce this please... + if ( x == 65535 && y == 65535 ) + return 0; + } + break; + + // we have to handle both: one for the normal case and the other + // for readonly + case WM_CTLCOLOREDIT: + case WM_CTLCOLORLISTBOX: + case WM_CTLCOLORSTATIC: + { + WXWORD nCtlColor; + WXHDC hdc; + WXHWND hwnd; + UnpackCtlColor(wParam, lParam, &nCtlColor, &hdc, &hwnd); + + return (WXLRESULT)OnCtlColor(hdc, hwnd, nCtlColor, + nMsg, wParam, lParam); + } } return wxWindow::MSWWindowProc(nMsg, wParam, lParam); @@ -557,7 +580,7 @@ bool wxChoice::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) if ( param != CBN_SELCHANGE) { // "selection changed" is the only event we're after - return FALSE; + return false; } int n = GetSelection(); @@ -574,7 +597,7 @@ bool wxChoice::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) ProcessCommand(event); } - return TRUE; + return true; } WXHBRUSH wxChoice::OnCtlColor(WXHDC pDC, WXHWND WXUNUSED(pWnd), WXUINT WXUNUSED(nCtlColor), @@ -597,4 +620,4 @@ WXHBRUSH wxChoice::OnCtlColor(WXHDC pDC, WXHWND WXUNUSED(pWnd), WXUINT WXUNUSED( return (WXHBRUSH)brush->GetResourceHandle(); } -#endif // wxUSE_CHOICE +#endif // wxUSE_CHOICE && !(__SMARTPHONE__ && __WXWINCE__)