X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c905c0d60f4bd407cc4cbfd809d5cf8a51a61523..ba8c878f957da36c14879b747a2d54d7fe01baa8:/src/msw/combo.cpp diff --git a/src/msw/combo.cpp b/src/msw/combo.cpp index c02a3ee345..72b053da45 100644 --- a/src/msw/combo.cpp +++ b/src/msw/combo.cpp @@ -38,7 +38,10 @@ #include "wx/combo.h" #include "wx/msw/registry.h" +#if wxUSE_UXTHEME #include "wx/msw/uxtheme.h" +#endif +#include "wx/msw/dc.h" // Change to #if 1 to include tmschema.h for easier testing of theme // parameters. @@ -159,10 +162,13 @@ bool wxComboCtrl::Create(wxWindow *parent, // Set border long border = style & wxBORDER_MASK; +#if wxUSE_UXTHEME wxUxThemeEngine* theme = wxUxThemeEngine::GetIfActive(); +#endif if ( !border ) { +#if wxUSE_UXTHEME if ( theme ) { // For XP, have 1-width custom border, for older version use sunken @@ -170,6 +176,7 @@ bool wxComboCtrl::Create(wxWindow *parent, m_widthCustomBorder = 1; } else +#endif border = wxBORDER_SUNKEN; style = (style & ~(wxBORDER_MASK)) | border; @@ -186,11 +193,13 @@ bool wxComboCtrl::Create(wxWindow *parent, name) ) return false; +#if wxUSE_UXTHEME if ( theme ) { if ( ::wxGetWinVersion() >= wxWinVersion_Vista ) m_iFlags |= wxCC_BUTTON_STAYS_DOWN |wxCC_BUTTON_COVERS_BORDER; } +#endif if ( style & wxCC_STD_BUTTON ) m_iFlags |= wxCC_POPUP_ON_MOUSE_UP; @@ -216,22 +225,38 @@ wxComboCtrl::~wxComboCtrl() void wxComboCtrl::OnThemeChange() { - wxUxThemeEngine* theme = wxUxThemeEngine::GetIfActive(); + // there doesn't seem to be any way to get the text colour using themes + // API: TMT_TEXTCOLOR doesn't work neither for EDIT nor COMBOBOX + SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); + +#if wxUSE_UXTHEME + wxUxThemeEngine * const theme = wxUxThemeEngine::GetIfActive(); if ( theme ) { - wxUxThemeHandle hTheme(this, L"COMBOBOX"); - + // NB: use EDIT, not COMBOBOX (the latter works in XP but not Vista) + wxUxThemeHandle hTheme(this, L"EDIT"); COLORREF col; - theme->GetThemeColor(hTheme,EP_EDITTEXT,ETS_NORMAL,TMT_FILLCOLOR,&col); - SetBackgroundColour(wxRGBToColour(col)); - theme->GetThemeColor(hTheme,EP_EDITTEXT,ETS_NORMAL,TMT_TEXTCOLOR,&col); - SetForegroundColour(wxRGBToColour(col)); - } - else - { - SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); - SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); + HRESULT hr = theme->GetThemeColor + ( + hTheme, + EP_EDITTEXT, + ETS_NORMAL, + TMT_FILLCOLOR, + &col + ); + if ( SUCCEEDED(hr) ) + { + SetBackgroundColour(wxRGBToColour(col)); + + // skip the call below + return; + } + + wxLogApiError(_T("GetThemeColor(EDIT, ETS_NORMAL, TMT_FILLCOLOR)"), hr); } +#endif + + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); } void wxComboCtrl::OnResize() @@ -242,12 +267,14 @@ void wxComboCtrl::OnResize() int textCtrlXAdjust; int textCtrlYAdjust; +#if wxUSE_UXTHEME if ( wxUxThemeEngine::GetIfActive() ) { textCtrlXAdjust = TEXTCTRLXADJUST_XP; textCtrlYAdjust = TEXTCTRLYADJUST_XP; } else +#endif { textCtrlXAdjust = TEXTCTRLXADJUST_CLASSIC; textCtrlYAdjust = TEXTCTRLYADJUST_CLASSIC; @@ -306,7 +333,9 @@ static void wxMSWDrawFocusRect( wxDC& dc, const wxRect& rect ) void wxComboCtrl::PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const { +#if wxUSE_UXTHEME wxUxThemeHandle hTheme(this, L"COMBOBOX"); +#endif wxSize sz = GetClientSize(); bool isEnabled; @@ -322,6 +351,7 @@ wxComboCtrl::PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const isEnabled = IsEnabled(); doDrawFocusRect = ShouldDrawFocus(); +#if wxUSE_UXTHEME // Windows-style: for smaller size control (and for disabled background) use less spacing if ( hTheme ) { @@ -330,6 +360,7 @@ wxComboCtrl::PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const focusSpacingY = sz.y > (GetCharHeight()+2) && isEnabled ? 2 : 1; } else +#endif { // Classic Theme if ( isEnabled ) @@ -444,10 +475,13 @@ void wxComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) ) const wxRect& rectButton = m_btnArea; wxRect rectTextField = m_tcArea; - const bool isEnabled = IsEnabled(); wxColour bgCol = GetBackgroundColour(); - HDC hDc = GetHdcOf(dc); +#if wxUSE_UXTHEME + const bool isEnabled = IsEnabled(); + + wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl(); + HDC hDc = GetHdcOf(*impl); HWND hWnd = GetHwndOf(this); wxUxThemeEngine* theme = NULL; @@ -455,6 +489,7 @@ void wxComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) ) if ( hTheme ) theme = wxUxThemeEngine::GetIfActive(); +#endif // wxUSE_UXTHEME wxRect borderRect(0,0,sz.x,sz.y); @@ -466,6 +501,7 @@ void wxComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) ) int drawButFlags = 0; +#if wxUSE_UXTHEME if ( hTheme ) { const bool useVistaComboBox = ::wxGetWinVersion() >= wxWinVersion_Vista; @@ -610,6 +646,7 @@ void wxComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) ) } } else +#endif { // Windows 2000 and earlier drawButFlags = Button_PaintBackground; @@ -805,8 +842,10 @@ bool wxComboCtrl::AnimateShow( const wxRect& rect, int flags ) wxCoord wxComboCtrl::GetNativeTextIndent() const { +#if wxUSE_UXTHEME if ( wxUxThemeEngine::GetIfActive() ) return NATIVE_TEXT_INDENT_XP; +#endif return NATIVE_TEXT_INDENT_CLASSIC; } @@ -833,8 +872,10 @@ bool wxComboCtrl::IsKeyPopupToggle(const wxKeyEvent& event) const // popup but Alt-arrow does if ( event.AltDown() || ( !isPopupShown && - HasFlag(wxCB_READONLY) && - !wxUxThemeEngine::GetIfActive() + HasFlag(wxCB_READONLY) +#if wxUSE_UXTHEME + && !wxUxThemeEngine::GetIfActive() +#endif ) ) { return true;