#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.
// 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
m_widthCustomBorder = 1;
}
else
+#endif
border = wxBORDER_SUNKEN;
style = (style & ~(wxBORDER_MASK)) | border;
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;
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 )
{
+ // NB: use EDIT, not COMBOBOX (the latter works in XP but not Vista)
wxUxThemeHandle hTheme(this, L"EDIT");
-
COLORREF col;
- HRESULT hr = theme->GetThemeColor(hTheme,EP_EDITTEXT,ETS_NORMAL,TMT_FILLCOLOR,&col);
- if ( FAILED(hr) )
- wxLogApiError(_T("GetThemeColor(EDIT, EP_EDITTEXT, ETS_NORMAL, TMT_FILLCOLOR)"), hr);
- else
+ HRESULT hr = theme->GetThemeColor
+ (
+ hTheme,
+ EP_EDITTEXT,
+ ETS_NORMAL,
+ TMT_FILLCOLOR,
+ &col
+ );
+ if ( SUCCEEDED(hr) )
+ {
SetBackgroundColour(wxRGBToColour(col));
- hr = theme->GetThemeColor(hTheme,EP_EDITTEXT,ETS_NORMAL,TMT_TEXTCOLOR,&col);
- if ( FAILED(hr) )
- wxLogApiError(_T("GetThemeColor(EDIT, EP_EDITTEXT, ETS_NORMAL, TMT_TEXTCOLOR)"), hr);
- else
- SetForegroundColour(wxRGBToColour(col));
- }
- else
- {
- SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
- SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));
+ // skip the call below
+ return;
+ }
+
+ wxLogApiError(_T("GetThemeColor(EDIT, ETS_NORMAL, TMT_FILLCOLOR)"), hr);
}
+#endif
+
+ SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
}
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;
// it employs wxCAP_BUTT hack to have line of width 1.
dc.SetLogicalFunction(wxINVERT);
- wxPen pen(*wxBLACK,1,wxDOT);
+ wxPen pen(*wxBLACK, 1, wxPENSTYLE_DOT);
pen.SetCap(wxCAP_BUTT);
dc.SetPen(pen);
dc.SetBrush(*wxTRANSPARENT_BRUSH);
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;
isEnabled = IsEnabled();
doDrawFocusRect = ShouldDrawFocus();
+#if wxUSE_UXTHEME
// Windows-style: for smaller size control (and for disabled background) use less spacing
if ( hTheme )
{
focusSpacingY = sz.y > (GetCharHeight()+2) && isEnabled ? 2 : 1;
}
else
+#endif
{
// Classic Theme
if ( isEnabled )
selRect.x += wcp + focusSpacingX;
selRect.width -= wcp + (focusSpacingX*2);
- //wxUxThemeEngine* theme = (wxUxThemeEngine*) NULL;
+ //wxUxThemeEngine* theme = NULL;
//if ( hTheme )
// theme = wxUxThemeEngine::GetIfActive();
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;
if ( hTheme )
theme = wxUxThemeEngine::GetIfActive();
+#endif // wxUSE_UXTHEME
wxRect borderRect(0,0,sz.x,sz.y);
int drawButFlags = 0;
+#if wxUSE_UXTHEME
if ( hTheme )
{
const bool useVistaComboBox = ::wxGetWinVersion() >= wxWinVersion_Vista;
}
}
else
+#endif
{
// Windows 2000 and earlier
drawButFlags = Button_PaintBackground;
#endif
#if wxUSE_COMBOCTRL_POPUP_ANIMATION
-void wxComboCtrl::OnTimerEvent( wxTimerEvent& WXUNUSED(event) )
+void wxComboCtrl::DoTimerEvent()
{
bool stopTimer = false;
m_animTimer.SetOwner( this, wxID_ANY );
m_animTimer.Start( COMBOBOX_ANIMATION_RESOLUTION, wxTIMER_CONTINUOUS );
- OnTimerEvent(*((wxTimerEvent*)NULL)); // Event is never used, so we can give NULL
+ DoTimerEvent();
return false;
}
wxCoord wxComboCtrl::GetNativeTextIndent() const
{
+#if wxUSE_UXTHEME
if ( wxUxThemeEngine::GetIfActive() )
return NATIVE_TEXT_INDENT_XP;
+#endif
return NATIVE_TEXT_INDENT_CLASSIC;
}
// 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;