X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b445b6a76eddacd5bab45c71f640dad672d83393..f5766910b6731eb03e82371416e9778203396ce7:/src/msw/combo.cpp?ds=sidebyside diff --git a/src/msw/combo.cpp b/src/msw/combo.cpp index 255869e59f..762b82eadc 100644 --- a/src/msw/combo.cpp +++ b/src/msw/combo.cpp @@ -239,7 +239,7 @@ static void wxMSWDrawFocusRect( wxDC& dc, const wxRect& rect ) } // draw focus background on area in a way typical on platform -void wxComboCtrl::DrawFocusBackground( wxDC& dc, const wxRect& rect, int flags ) const +void wxComboCtrl::PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const { wxUxThemeEngine* theme = (wxUxThemeEngine*) NULL; @@ -376,6 +376,11 @@ void wxComboCtrl::DrawFocusBackground( wxDC& dc, const wxRect& rect, int flags ) if ( drawDottedEdge ) wxMSWDrawFocusRect(dc,selRect); + // Don't clip exactly to the selection rectangle so we can draw + // to the non-selected area in front of it. + wxRect clipRect(rect.x,rect.y, + (selRect.x+selRect.width)-rect.x-1,rect.height); + dc.SetClippingRegion(clipRect); } void wxComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) ) @@ -383,7 +388,7 @@ void wxComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) ) // TODO: Convert drawing in this function to Windows API Code wxSize sz = GetClientSize(); - wxBufferedPaintDC dc(this,GetBufferBitmap(sz)); + wxAutoBufferedPaintDC dc(this); const wxRect& rectb = m_btnArea; wxRect rect = m_tcArea; @@ -484,11 +489,10 @@ void wxComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) ) void wxComboCtrl::OnMouseEvent( wxMouseEvent& event ) { - bool isOnButtonArea = m_btnArea.Inside(event.m_x,event.m_y); + int mx = event.m_x; + bool isOnButtonArea = m_btnArea.Contains(mx,event.m_y); int handlerFlags = isOnButtonArea ? wxCC_MF_ON_BUTTON : 0; - // Preprocessing fabricates double-clicks and prevents - // (it may also do other common things in future) if ( PreprocessMouseEvent(event,isOnButtonArea) ) return; @@ -502,8 +506,11 @@ void wxComboCtrl::OnMouseEvent( wxMouseEvent& event ) } else { - if ( isOnButtonArea || HasCapture() ) + if ( isOnButtonArea || HasCapture() || + (m_widthCustomPaint && mx < (m_tcArea.x+m_widthCustomPaint)) ) { + handlerFlags |= wxCC_MF_ON_CLICK_AREA; + if ( HandleButtonMouseEvent(event,handlerFlags) ) return; } @@ -531,25 +538,34 @@ wxCoord wxComboCtrl::GetNativeTextIndent() const bool wxComboCtrl::IsKeyPopupToggle(const wxKeyEvent& event) const { - int keycode = event.GetKeyCode(); - bool isPopupShown = IsPopupShown(); - - if ( isPopupShown && keycode == WXK_ESCAPE ) - return true; + const bool isPopupShown = IsPopupShown(); - // On XP or with writable combo in Classic, - // Alt is required, in addition to up/down, to - // show the popup. - if ( keycode == WXK_DOWN || keycode == WXK_UP ) + switch ( event.GetKeyCode() ) { - if ( event.AltDown() || - ( !isPopupShown && - HasFlag(wxCB_READONLY) && - !wxUxThemeEngine::GetIfActive() - ) ) - { - return true; - } + case WXK_F4: + // F4 toggles the popup in the native comboboxes, so emulate them + if ( !event.AltDown() ) + return true; + break; + + case WXK_ESCAPE: + if ( isPopupShown ) + return true; + break; + + case WXK_DOWN: + case WXK_UP: + // On XP or with writable combo in Classic, arrows don't open the + // popup but Alt-arrow does + if ( event.AltDown() || + ( !isPopupShown && + HasFlag(wxCB_READONLY) && + !wxUxThemeEngine::GetIfActive() + ) ) + { + return true; + } + break; } return false;