Fix DrawChoice() behaviour in wxRendererXP.

The implementation of wxRendererXP::DrawChoice() inadvertently used
wxRendererMSW::DrawComboBoxDropButton() and so drew the button in the classic
and not themed style.

Fix this by defining DrawChoice() in the base wxRendererMSWBase class and
reusing it in wxRendererXP via inheritance and not composition.

Closes #14337.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71569 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2012-05-26 12:29:46 +00:00
parent ffa7b75018
commit 252255e852

View File

@ -134,6 +134,26 @@ public:
wxDC& dc,
const wxRect& rect,
int flags = 0);
void DrawChoice(wxWindow* win,
wxDC& dc,
const wxRect& rect,
int flags = 0);
void DrawComboBox(wxWindow* win,
wxDC& dc,
const wxRect& rect,
int flags = 0);
virtual void DrawComboBoxDropButton(wxWindow *win,
wxDC& dc,
const wxRect& rect,
int flags = 0) = 0;
virtual void DrawTextCtrl(wxWindow* win,
wxDC& dc,
const wxRect& rect,
int flags = 0) = 0;
};
// ----------------------------------------------------------------------------
@ -165,16 +185,6 @@ public:
const wxRect& rect,
int flags = 0);
virtual void DrawChoice(wxWindow* win,
wxDC& dc,
const wxRect& rect,
int flags = 0);
virtual void DrawComboBox(wxWindow* win,
wxDC& dc,
const wxRect& rect,
int flags = 0);
virtual void DrawTextCtrl(wxWindow* win,
wxDC& dc,
const wxRect& rect,
@ -279,6 +289,11 @@ public:
m_rendererNative.DrawPushButton(win, dc, rect, flags);
}
virtual void DrawTextCtrl(wxWindow* win,
wxDC& dc,
const wxRect& rect,
int flags = 0);
virtual void DrawRadioBitmap(wxWindow *win,
wxDC& dc,
const wxRect& rect,
@ -364,6 +379,31 @@ void wxRendererMSWBase::DrawItemSelectionRect(wxWindow *win,
DrawFocusRect( win, dc, rect, flags );
}
void wxRendererMSWBase::DrawChoice(wxWindow* win,
wxDC& dc,
const wxRect& rect,
int flags)
{
DrawComboBox(win, dc, rect, flags);
}
void wxRendererMSWBase::DrawComboBox(wxWindow* win,
wxDC& dc,
const wxRect& rect,
int flags)
{
// Draw the main part of the control same as TextCtrl
DrawTextCtrl(win, dc, rect, flags);
// Draw the button inside the border, on the right side
wxRect br(rect);
br.height -= 2;
br.x += br.width - br.height - 1;
br.width = br.height;
br.y += 1;
DrawComboBoxDropButton(win, dc, br, flags);
}
// ============================================================================
// wxRendererNative and wxRendererMSW implementation
@ -539,66 +579,24 @@ int wxRendererMSW::GetHeaderButtonMargin(wxWindow *WXUNUSED(win))
}
// Uses the theme to draw the border and fill for something like a wxTextCtrl
void wxRendererMSW::DrawTextCtrl(wxWindow* win, wxDC& dc, const wxRect& rect, int flags)
void wxRendererMSW::DrawTextCtrl(wxWindow* WXUNUSED(win),
wxDC& dc,
const wxRect& rect,
int WXUNUSED(flags))
{
wxColour fill;
wxColour bdr;
COLORREF cref;
#if wxUSE_UXTHEME
wxUxThemeHandle hTheme(win, L"EDIT");
if (hTheme)
{
wxUxThemeEngine::Get()->GetThemeColor(hTheme, EP_EDITTEXT,
ETS_NORMAL, TMT_FILLCOLOR, &cref);
fill = wxRGBToColour(cref);
int etsState;
if ( flags & wxCONTROL_DISABLED )
etsState = ETS_DISABLED;
else
etsState = ETS_NORMAL;
wxUxThemeEngine::Get()->GetThemeColor(hTheme, EP_EDITTEXT,
etsState, TMT_BORDERCOLOR, &cref);
bdr = wxRGBToColour(cref);
}
else
#endif
{
fill = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
bdr = *wxBLACK;
}
dc.SetPen( bdr );
dc.SetBrush( fill );
dc.SetPen(bdr);
dc.SetBrush(fill);
dc.DrawRectangle(rect);
}
// Draw the equivalent of a wxComboBox
void wxRendererMSW::DrawComboBox(wxWindow* win, wxDC& dc, const wxRect& rect, int flags)
{
// Draw the main part of the control same as TextCtrl
DrawTextCtrl(win, dc, rect, flags);
// Draw the button inside the border, on the right side
wxRect br(rect);
br.height -= 2;
br.x += br.width - br.height - 1;
br.width = br.height;
br.y += 1;
DrawComboBoxDropButton(win, dc, br, flags);
}
void wxRendererMSW::DrawChoice(wxWindow* win, wxDC& dc,
const wxRect& rect, int flags)
{
DrawComboBox(win, dc, rect, flags);
}
// ============================================================================
// wxRendererXP implementation
// ============================================================================
@ -855,6 +853,42 @@ wxRendererXP::DrawTitleBarBitmap(wxWindow *win,
DoDrawButtonLike(hTheme, part, dc, rect, flags);
}
// Uses the theme to draw the border and fill for something like a wxTextCtrl
void wxRendererXP::DrawTextCtrl(wxWindow* win,
wxDC& dc,
const wxRect& rect,
int flags)
{
wxUxThemeHandle hTheme(win, L"EDIT");
if ( !hTheme )
{
m_rendererNative.DrawTextCtrl(win,dc,rect,flags);
return;
}
wxColour fill;
wxColour bdr;
COLORREF cref;
wxUxThemeEngine::Get()->GetThemeColor(hTheme, EP_EDITTEXT,
ETS_NORMAL, TMT_FILLCOLOR, &cref);
fill = wxRGBToColour(cref);
int etsState;
if ( flags & wxCONTROL_DISABLED )
etsState = ETS_DISABLED;
else
etsState = ETS_NORMAL;
wxUxThemeEngine::Get()->GetThemeColor(hTheme, EP_EDITTEXT,
etsState, TMT_BORDERCOLOR, &cref);
bdr = wxRGBToColour(cref);
dc.SetPen( bdr );
dc.SetBrush( fill );
dc.DrawRectangle(rect);
}
// ----------------------------------------------------------------------------
// splitter drawing
// ----------------------------------------------------------------------------