miscellaneous LnF improvements, including support for Vista-style (patch 1588794)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44735 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -75,6 +75,12 @@ enum
|
|||||||
wxCC_POPUP_ON_MOUSE_UP = 0x0002,
|
wxCC_POPUP_ON_MOUSE_UP = 0x0002,
|
||||||
// All text is not automatically selected on click
|
// All text is not automatically selected on click
|
||||||
wxCC_NO_TEXT_AUTO_SELECT = 0x0004,
|
wxCC_NO_TEXT_AUTO_SELECT = 0x0004,
|
||||||
|
// Drop-button stays down as long as popup is displayed.
|
||||||
|
wxCC_BUTTON_STAYS_DOWN = 0x0008,
|
||||||
|
// Drop-button covers the entire control.
|
||||||
|
wxCC_FULL_BUTTON = 0x0010,
|
||||||
|
// Drop-button goes over the custom-border (used under WinVista).
|
||||||
|
wxCC_BUTTON_COVERS_BORDER = 0x0020,
|
||||||
|
|
||||||
// Internal use: signals creation is complete
|
// Internal use: signals creation is complete
|
||||||
wxCC_IFLAG_CREATED = 0x0100,
|
wxCC_IFLAG_CREATED = 0x0100,
|
||||||
@@ -87,7 +93,10 @@ enum
|
|||||||
// Internal use: Secondary popup window type should be used (if available).
|
// Internal use: Secondary popup window type should be used (if available).
|
||||||
wxCC_IFLAG_USE_ALT_POPUP = 0x1000,
|
wxCC_IFLAG_USE_ALT_POPUP = 0x1000,
|
||||||
// Internal use: Skip popup animation.
|
// Internal use: Skip popup animation.
|
||||||
wxCC_IFLAG_DISABLE_POPUP_ANIM = 0x2000
|
wxCC_IFLAG_DISABLE_POPUP_ANIM = 0x2000,
|
||||||
|
// Internal use: Drop-button is a bitmap button or has non-default size
|
||||||
|
// (but can still be on either side of the control).
|
||||||
|
wxCC_IFLAG_HAS_NONSTANDARD_BUTTON = 0x4000
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -365,8 +374,8 @@ public:
|
|||||||
bool ShouldDrawFocus() const
|
bool ShouldDrawFocus() const
|
||||||
{
|
{
|
||||||
const wxWindow* curFocus = FindFocus();
|
const wxWindow* curFocus = FindFocus();
|
||||||
return ( !IsPopupShown() &&
|
return ( IsPopupWindowState(Hidden) &&
|
||||||
(curFocus == this || (m_btn && curFocus == m_btn)) &&
|
(curFocus == m_mainCtrlWnd || (m_btn && curFocus == m_btn)) &&
|
||||||
(m_windowStyle & wxCB_READONLY) );
|
(m_windowStyle & wxCB_READONLY) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -401,6 +410,10 @@ public:
|
|||||||
// Set value returned by GetMainWindowOfCompositeControl
|
// Set value returned by GetMainWindowOfCompositeControl
|
||||||
void SetCtrlMainWnd( wxWindow* wnd ) { m_mainCtrlWnd = wnd; }
|
void SetCtrlMainWnd( wxWindow* wnd ) { m_mainCtrlWnd = wnd; }
|
||||||
|
|
||||||
|
// This is public so we can access it from wxComboCtrlTextCtrl
|
||||||
|
virtual wxWindow *GetMainWindowOfCompositeControl()
|
||||||
|
{ return m_mainCtrlWnd; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -423,14 +436,16 @@ protected:
|
|||||||
// Installs standard input handler to combo (and optionally to the textctrl)
|
// Installs standard input handler to combo (and optionally to the textctrl)
|
||||||
void InstallInputHandlers();
|
void InstallInputHandlers();
|
||||||
|
|
||||||
// flags for DrawButton()
|
// Flags for DrawButton
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
Draw_PaintBg = 1
|
Button_PaintBackground = 0x0001, // Paints control background below the button
|
||||||
|
Button_BitmapOnly = 0x0002 // Only paints the bitmap
|
||||||
};
|
};
|
||||||
|
|
||||||
// Draws dropbutton. Using wxRenderer or bitmaps, as appropriate.
|
// Draws dropbutton. Using wxRenderer or bitmaps, as appropriate.
|
||||||
void DrawButton( wxDC& dc, const wxRect& rect, int flags = Draw_PaintBg );
|
// Flags are defined above.
|
||||||
|
void DrawButton( wxDC& dc, const wxRect& rect, int flags = Button_PaintBackground );
|
||||||
|
|
||||||
// Call if cursor is on button area or mouse is captured for the button.
|
// Call if cursor is on button area or mouse is captured for the button.
|
||||||
//bool HandleButtonMouseEvent( wxMouseEvent& event, bool isInside );
|
//bool HandleButtonMouseEvent( wxMouseEvent& event, bool isInside );
|
||||||
@@ -506,9 +521,6 @@ protected:
|
|||||||
virtual void DoSetToolTip( wxToolTip *tip );
|
virtual void DoSetToolTip( wxToolTip *tip );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
virtual wxWindow *GetMainWindowOfCompositeControl()
|
|
||||||
{ return m_mainCtrlWnd; }
|
|
||||||
|
|
||||||
// This is used when m_text is hidden (readonly).
|
// This is used when m_text is hidden (readonly).
|
||||||
wxString m_valueString;
|
wxString m_valueString;
|
||||||
|
|
||||||
|
@@ -377,12 +377,14 @@ bool wxComboPopupWindow::Show( bool show )
|
|||||||
wxASSERT( IsKindOf(CLASSINFO(wxPopupTransientWindow)) );
|
wxASSERT( IsKindOf(CLASSINFO(wxPopupTransientWindow)) );
|
||||||
|
|
||||||
wxPopupTransientWindow* ptw = (wxPopupTransientWindow*) this;
|
wxPopupTransientWindow* ptw = (wxPopupTransientWindow*) this;
|
||||||
wxComboCtrlBase* combo = (wxComboCtrlBase*) GetParent();
|
|
||||||
|
|
||||||
if ( show != ptw->IsShown() )
|
if ( show != ptw->IsShown() )
|
||||||
{
|
{
|
||||||
if ( show )
|
if ( show )
|
||||||
ptw->Popup(combo->GetPopupControl()->GetControl());
|
// We used to do wxPopupTransientWindow::Popup here,
|
||||||
|
// but this would hide normal Show, which we are
|
||||||
|
// also going to need.
|
||||||
|
ptw->Show();
|
||||||
else
|
else
|
||||||
ptw->Dismiss();
|
ptw->Dismiss();
|
||||||
}
|
}
|
||||||
@@ -571,6 +573,7 @@ private:
|
|||||||
BEGIN_EVENT_TABLE(wxComboBoxExtraInputHandler, wxEvtHandler)
|
BEGIN_EVENT_TABLE(wxComboBoxExtraInputHandler, wxEvtHandler)
|
||||||
EVT_KEY_DOWN(wxComboBoxExtraInputHandler::OnKey)
|
EVT_KEY_DOWN(wxComboBoxExtraInputHandler::OnKey)
|
||||||
EVT_SET_FOCUS(wxComboBoxExtraInputHandler::OnFocus)
|
EVT_SET_FOCUS(wxComboBoxExtraInputHandler::OnFocus)
|
||||||
|
EVT_KILL_FOCUS(wxComboBoxExtraInputHandler::OnFocus)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
|
||||||
@@ -592,7 +595,8 @@ void wxComboBoxExtraInputHandler::OnFocus(wxFocusEvent& event)
|
|||||||
{
|
{
|
||||||
// FIXME: This code does run when control is clicked,
|
// FIXME: This code does run when control is clicked,
|
||||||
// yet on Windows it doesn't select all the text.
|
// yet on Windows it doesn't select all the text.
|
||||||
if ( !(m_combo->GetInternalFlags() & wxCC_NO_TEXT_AUTO_SELECT) )
|
if ( event.GetEventType() == wxEVT_SET_FOCUS &&
|
||||||
|
!(m_combo->GetInternalFlags() & wxCC_NO_TEXT_AUTO_SELECT) )
|
||||||
{
|
{
|
||||||
if ( m_combo->GetTextCtrl() )
|
if ( m_combo->GetTextCtrl() )
|
||||||
m_combo->GetTextCtrl()->SelectAll();
|
m_combo->GetTextCtrl()->SelectAll();
|
||||||
@@ -606,7 +610,7 @@ void wxComboBoxExtraInputHandler::OnFocus(wxFocusEvent& event)
|
|||||||
// wxEVT_SET_FOCUSes (since m_text->SetFocus is called
|
// wxEVT_SET_FOCUSes (since m_text->SetFocus is called
|
||||||
// from combo's focus event handler), they should be quite
|
// from combo's focus event handler), they should be quite
|
||||||
// harmless.
|
// harmless.
|
||||||
wxFocusEvent evt2(wxEVT_SET_FOCUS,m_combo->GetId());
|
wxFocusEvent evt2(event.GetEventType(),m_combo->GetId());
|
||||||
evt2.SetEventObject(m_combo);
|
evt2.SetEventObject(m_combo);
|
||||||
m_combo->GetEventHandler()->ProcessEvent(evt2);
|
m_combo->GetEventHandler()->ProcessEvent(evt2);
|
||||||
|
|
||||||
@@ -659,6 +663,9 @@ void wxComboPopupExtraEventHandler::OnMouseEvent( wxMouseEvent& event )
|
|||||||
wxSize sz = m_combo->GetPopupControl()->GetControl()->GetClientSize();
|
wxSize sz = m_combo->GetPopupControl()->GetControl()->GetClientSize();
|
||||||
int evtType = event.GetEventType();
|
int evtType = event.GetEventType();
|
||||||
bool isInside = pt.x >= 0 && pt.y >= 0 && pt.x < sz.x && pt.y < sz.y;
|
bool isInside = pt.x >= 0 && pt.y >= 0 && pt.x < sz.x && pt.y < sz.y;
|
||||||
|
bool relayToButton = false;
|
||||||
|
|
||||||
|
event.Skip();
|
||||||
|
|
||||||
if ( evtType == wxEVT_MOTION ||
|
if ( evtType == wxEVT_MOTION ||
|
||||||
evtType == wxEVT_LEFT_DOWN ||
|
evtType == wxEVT_LEFT_DOWN ||
|
||||||
@@ -668,7 +675,6 @@ void wxComboPopupExtraEventHandler::OnMouseEvent( wxMouseEvent& event )
|
|||||||
if ( !isInside || !m_combo->IsPopupShown() )
|
if ( !isInside || !m_combo->IsPopupShown() )
|
||||||
{
|
{
|
||||||
event.Skip(false);
|
event.Skip(false);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( evtType == wxEVT_LEFT_UP )
|
else if ( evtType == wxEVT_LEFT_UP )
|
||||||
@@ -676,10 +682,9 @@ void wxComboPopupExtraEventHandler::OnMouseEvent( wxMouseEvent& event )
|
|||||||
if ( !m_combo->IsPopupShown() )
|
if ( !m_combo->IsPopupShown() )
|
||||||
{
|
{
|
||||||
event.Skip(false);
|
event.Skip(false);
|
||||||
return;
|
relayToButton = true;
|
||||||
}
|
}
|
||||||
|
else if ( !m_beenInside )
|
||||||
if ( !m_beenInside )
|
|
||||||
{
|
{
|
||||||
if ( isInside )
|
if ( isInside )
|
||||||
{
|
{
|
||||||
@@ -687,27 +692,48 @@ void wxComboPopupExtraEventHandler::OnMouseEvent( wxMouseEvent& event )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//
|
relayToButton = true;
|
||||||
// Some mouse events to popup that happen outside it, before cursor
|
|
||||||
// has been inside the popu, need to be ignored by it but relayed to
|
|
||||||
// the dropbutton.
|
|
||||||
//
|
|
||||||
wxWindow* btn = m_combo->GetButton();
|
|
||||||
if ( btn )
|
|
||||||
btn->GetEventHandler()->AddPendingEvent(event);
|
|
||||||
else
|
|
||||||
m_combo->GetEventHandler()->AddPendingEvent(event);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
event.Skip();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
event.Skip();
|
if ( relayToButton )
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Some mouse events to popup that happen outside it, before cursor
|
||||||
|
// has been inside the popup, need to be ignored by it but relayed to
|
||||||
|
// the dropbutton.
|
||||||
|
//
|
||||||
|
wxWindow* eventSink = m_combo;
|
||||||
|
wxWindow* btn = m_combo->GetButton();
|
||||||
|
if ( btn )
|
||||||
|
eventSink = btn;
|
||||||
|
|
||||||
|
eventSink->GetEventHandler()->ProcessEvent(event);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxComboCtrlTextCtrl
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class wxComboCtrlTextCtrl : public wxTextCtrl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxComboCtrlTextCtrl() : wxTextCtrl() { }
|
||||||
|
virtual ~wxComboCtrlTextCtrl() { }
|
||||||
|
|
||||||
|
virtual wxWindow *GetMainWindowOfCompositeControl()
|
||||||
|
{
|
||||||
|
wxComboCtrl* combo = (wxComboCtrl*) GetParent();
|
||||||
|
|
||||||
|
// Returning this instead of just 'parent' lets FindFocus work
|
||||||
|
// correctly even when parent control is a child of a composite
|
||||||
|
// generic control (as is case with wxGenericDatePickerCtrl).
|
||||||
|
return combo->GetMainWindowOfCompositeControl();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxComboCtrlBase
|
// wxComboCtrlBase
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -841,9 +867,10 @@ wxComboCtrlBase::CreateTextCtrl(int style, const wxValidator& validator)
|
|||||||
else
|
else
|
||||||
m_ignoreEvtText = 0;
|
m_ignoreEvtText = 0;
|
||||||
|
|
||||||
m_text = new wxTextCtrl(this, wxID_ANY, m_valueString,
|
m_text = new wxComboCtrlTextCtrl();
|
||||||
wxDefaultPosition, wxSize(10,-1),
|
m_text->Create(this, wxID_ANY, m_valueString,
|
||||||
style, validator);
|
wxDefaultPosition, wxSize(10,-1),
|
||||||
|
style, validator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -898,6 +925,12 @@ void wxComboCtrlBase::CalculateAreas( int btnWidth )
|
|||||||
m_iFlags |= wxCC_IFLAG_BUTTON_OUTSIDE;
|
m_iFlags |= wxCC_IFLAG_BUTTON_OUTSIDE;
|
||||||
btnBorder = 0;
|
btnBorder = 0;
|
||||||
}
|
}
|
||||||
|
else if ( (m_iFlags & wxCC_BUTTON_COVERS_BORDER) &&
|
||||||
|
m_btnSpacingX == 0 && !m_bmpNormal.Ok() )
|
||||||
|
{
|
||||||
|
m_iFlags &= ~(wxCC_IFLAG_BUTTON_OUTSIDE);
|
||||||
|
btnBorder = 0;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_iFlags &= ~(wxCC_IFLAG_BUTTON_OUTSIDE);
|
m_iFlags &= ~(wxCC_IFLAG_BUTTON_OUTSIDE);
|
||||||
@@ -972,6 +1005,11 @@ void wxComboCtrlBase::CalculateAreas( int btnWidth )
|
|||||||
{
|
{
|
||||||
int newY = butHeight+(customBorder*2);
|
int newY = butHeight+(customBorder*2);
|
||||||
SetClientSize(wxDefaultCoord,newY);
|
SetClientSize(wxDefaultCoord,newY);
|
||||||
|
if ( m_bmpNormal.Ok() || m_btnArea.width != butWidth || m_btnArea.height != butHeight )
|
||||||
|
m_iFlags |= wxCC_IFLAG_HAS_NONSTANDARD_BUTTON;
|
||||||
|
else
|
||||||
|
m_iFlags &= ~wxCC_IFLAG_HAS_NONSTANDARD_BUTTON;
|
||||||
|
|
||||||
sz.y = newY;
|
sz.y = newY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1217,7 +1255,7 @@ void wxComboCtrlBase::PrepareBackground( wxDC& dc, const wxRect& rect, int flags
|
|||||||
{
|
{
|
||||||
wxSize sz = GetClientSize();
|
wxSize sz = GetClientSize();
|
||||||
bool isEnabled;
|
bool isEnabled;
|
||||||
bool isFocused; // also selected
|
bool doDrawFocusRect; // also selected
|
||||||
|
|
||||||
// For smaller size control (and for disabled background) use less spacing
|
// For smaller size control (and for disabled background) use less spacing
|
||||||
int focusSpacingX;
|
int focusSpacingX;
|
||||||
@@ -1227,7 +1265,7 @@ void wxComboCtrlBase::PrepareBackground( wxDC& dc, const wxRect& rect, int flags
|
|||||||
{
|
{
|
||||||
// Drawing control
|
// Drawing control
|
||||||
isEnabled = IsEnabled();
|
isEnabled = IsEnabled();
|
||||||
isFocused = ShouldDrawFocus();
|
doDrawFocusRect = ShouldDrawFocus() & !(m_iFlags & wxCC_FULL_BUTTON);
|
||||||
|
|
||||||
// Windows-style: for smaller size control (and for disabled background) use less spacing
|
// Windows-style: for smaller size control (and for disabled background) use less spacing
|
||||||
focusSpacingX = isEnabled ? 2 : 1;
|
focusSpacingX = isEnabled ? 2 : 1;
|
||||||
@@ -1237,7 +1275,7 @@ void wxComboCtrlBase::PrepareBackground( wxDC& dc, const wxRect& rect, int flags
|
|||||||
{
|
{
|
||||||
// Drawing a list item
|
// Drawing a list item
|
||||||
isEnabled = true; // they are never disabled
|
isEnabled = true; // they are never disabled
|
||||||
isFocused = flags & wxCONTROL_SELECTED ? true : false;
|
doDrawFocusRect = flags & wxCONTROL_SELECTED ? true : false;
|
||||||
|
|
||||||
focusSpacingX = 0;
|
focusSpacingX = 0;
|
||||||
focusSpacingY = 0;
|
focusSpacingY = 0;
|
||||||
@@ -1257,12 +1295,13 @@ void wxComboCtrlBase::PrepareBackground( wxDC& dc, const wxRect& rect, int flags
|
|||||||
selRect.width -= wcp + (focusSpacingX*2);
|
selRect.width -= wcp + (focusSpacingX*2);
|
||||||
|
|
||||||
wxColour bgCol;
|
wxColour bgCol;
|
||||||
|
bool doDrawSelRect = true;
|
||||||
|
|
||||||
if ( isEnabled )
|
if ( isEnabled )
|
||||||
{
|
{
|
||||||
// If popup is hidden and this control is focused,
|
// If popup is hidden and this control is focused,
|
||||||
// then draw the focus-indicator (selbgcolor background etc.).
|
// then draw the focus-indicator (selbgcolor background etc.).
|
||||||
if ( isFocused )
|
if ( doDrawFocusRect )
|
||||||
{
|
{
|
||||||
dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) );
|
dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) );
|
||||||
bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT);
|
bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT);
|
||||||
@@ -1271,6 +1310,7 @@ void wxComboCtrlBase::PrepareBackground( wxDC& dc, const wxRect& rect, int flags
|
|||||||
{
|
{
|
||||||
dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT) );
|
dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT) );
|
||||||
#ifndef __WXMAC__ // see note in OnThemeChange
|
#ifndef __WXMAC__ // see note in OnThemeChange
|
||||||
|
doDrawSelRect = false;
|
||||||
bgCol = GetBackgroundColour();
|
bgCol = GetBackgroundColour();
|
||||||
#else
|
#else
|
||||||
bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
|
bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
|
||||||
@@ -1288,8 +1328,11 @@ void wxComboCtrlBase::PrepareBackground( wxDC& dc, const wxRect& rect, int flags
|
|||||||
}
|
}
|
||||||
|
|
||||||
dc.SetBrush( bgCol );
|
dc.SetBrush( bgCol );
|
||||||
dc.SetPen( bgCol );
|
if ( doDrawSelRect )
|
||||||
dc.DrawRectangle( selRect );
|
{
|
||||||
|
dc.SetPen( bgCol );
|
||||||
|
dc.DrawRectangle( selRect );
|
||||||
|
}
|
||||||
|
|
||||||
// Don't clip exactly to the selection rectangle so we can draw
|
// Don't clip exactly to the selection rectangle so we can draw
|
||||||
// to the non-selected area in front of it.
|
// to the non-selected area in front of it.
|
||||||
@@ -1304,14 +1347,13 @@ void wxComboCtrlBase::PrepareBackground( wxDC&, const wxRect&, int ) const
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void wxComboCtrlBase::DrawButton( wxDC& dc, const wxRect& rect, int paintBg )
|
void wxComboCtrlBase::DrawButton( wxDC& dc, const wxRect& rect, int flags )
|
||||||
{
|
{
|
||||||
int drawState = m_btnState;
|
int drawState = m_btnState;
|
||||||
|
|
||||||
#ifdef __WXGTK__
|
if ( (m_iFlags & wxCC_BUTTON_STAYS_DOWN) &&
|
||||||
if ( GetPopupWindowState() >= Animating )
|
GetPopupWindowState() >= Animating )
|
||||||
drawState |= wxCONTROL_PRESSED;
|
drawState |= wxCONTROL_PRESSED;
|
||||||
#endif
|
|
||||||
|
|
||||||
wxRect drawRect(rect.x+m_btnSpacingX,
|
wxRect drawRect(rect.x+m_btnSpacingX,
|
||||||
rect.y+((rect.height-m_btnSize.y)/2),
|
rect.y+((rect.height-m_btnSize.y)/2),
|
||||||
@@ -1331,8 +1373,11 @@ void wxComboCtrlBase::DrawButton( wxDC& dc, const wxRect& rect, int paintBg )
|
|||||||
|
|
||||||
if ( !m_bmpNormal.Ok() )
|
if ( !m_bmpNormal.Ok() )
|
||||||
{
|
{
|
||||||
|
if ( flags & Button_BitmapOnly )
|
||||||
|
return;
|
||||||
|
|
||||||
// Need to clear button background even if m_btn is present
|
// Need to clear button background even if m_btn is present
|
||||||
if ( paintBg )
|
if ( flags & Button_PaintBackground )
|
||||||
{
|
{
|
||||||
wxColour bgCol;
|
wxColour bgCol;
|
||||||
|
|
||||||
@@ -1371,7 +1416,7 @@ void wxComboCtrlBase::DrawButton( wxDC& dc, const wxRect& rect, int paintBg )
|
|||||||
{
|
{
|
||||||
// If using blank button background, we need to clear its background
|
// If using blank button background, we need to clear its background
|
||||||
// with button face colour instead of colour for rest of the control.
|
// with button face colour instead of colour for rest of the control.
|
||||||
if ( paintBg )
|
if ( flags & Button_PaintBackground )
|
||||||
{
|
{
|
||||||
wxColour bgCol = GetParent()->GetBackgroundColour(); //wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE);
|
wxColour bgCol = GetParent()->GetBackgroundColour(); //wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE);
|
||||||
//wxColour bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
|
//wxColour bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
|
||||||
@@ -1380,18 +1425,20 @@ void wxComboCtrlBase::DrawButton( wxDC& dc, const wxRect& rect, int paintBg )
|
|||||||
dc.DrawRectangle(rect);
|
dc.DrawRectangle(rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
wxRendererNative::Get().DrawPushButton(this,
|
if ( !(flags & Button_BitmapOnly) )
|
||||||
dc,
|
{
|
||||||
drawRect,
|
wxRendererNative::Get().DrawPushButton(this,
|
||||||
drawState);
|
dc,
|
||||||
|
drawRect,
|
||||||
|
drawState);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
||||||
{
|
{
|
||||||
// Need to clear button background even if m_btn is present
|
// Need to clear button background even if m_btn is present
|
||||||
// (assume non-button background was cleared just before this call so brushes are good)
|
// (assume non-button background was cleared just before this call so brushes are good)
|
||||||
if ( paintBg )
|
if ( flags & Button_PaintBackground )
|
||||||
dc.DrawRectangle(rect);
|
dc.DrawRectangle(rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1438,13 +1485,14 @@ void wxComboCtrlBase::OnTextCtrlEvent(wxCommandEvent& event)
|
|||||||
|
|
||||||
// call if cursor is on button area or mouse is captured for the button
|
// call if cursor is on button area or mouse is captured for the button
|
||||||
bool wxComboCtrlBase::HandleButtonMouseEvent( wxMouseEvent& event,
|
bool wxComboCtrlBase::HandleButtonMouseEvent( wxMouseEvent& event,
|
||||||
int flags )
|
int flags )
|
||||||
{
|
{
|
||||||
int type = event.GetEventType();
|
int type = event.GetEventType();
|
||||||
|
|
||||||
if ( type == wxEVT_MOTION )
|
if ( type == wxEVT_MOTION )
|
||||||
{
|
{
|
||||||
if ( flags & wxCC_MF_ON_BUTTON )
|
if ( (flags & wxCC_MF_ON_BUTTON) &&
|
||||||
|
IsPopupWindowState(Hidden) )
|
||||||
{
|
{
|
||||||
if ( !(m_btnState & wxCONTROL_CURRENT) )
|
if ( !(m_btnState & wxCONTROL_CURRENT) )
|
||||||
{
|
{
|
||||||
@@ -1513,6 +1561,11 @@ bool wxComboCtrlBase::HandleButtonMouseEvent( wxMouseEvent& event,
|
|||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// Never have 'hot' state when popup is being shown
|
||||||
|
// (this is mostly needed because of the animation).
|
||||||
|
if ( !IsPopupWindowState(Hidden) )
|
||||||
|
m_btnState &= ~wxCONTROL_CURRENT;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1535,7 +1588,7 @@ bool wxComboCtrlBase::PreprocessMouseEvent( wxMouseEvent& event,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Filter out clicks on button immediately after popup dismiss (Windows like behaviour)
|
// Filter out clicks on button immediately after popup dismiss
|
||||||
if ( evtType == wxEVT_LEFT_DOWN && t < m_timeCanAcceptClick )
|
if ( evtType == wxEVT_LEFT_DOWN && t < m_timeCanAcceptClick )
|
||||||
{
|
{
|
||||||
event.SetEventType(0);
|
event.SetEventType(0);
|
||||||
@@ -1648,7 +1701,9 @@ void wxComboCtrlBase::OnFocusEvent( wxFocusEvent& event )
|
|||||||
#ifdef __WXMAC__
|
#ifdef __WXMAC__
|
||||||
m_resetFocus = true;
|
m_resetFocus = true;
|
||||||
#else
|
#else
|
||||||
|
{
|
||||||
tc->SetFocus();
|
tc->SetFocus();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1700,7 +1755,7 @@ void wxComboCtrlBase::CreatePopup()
|
|||||||
m_popupWinType = SECONDARY_POPUP_TYPE;
|
m_popupWinType = SECONDARY_POPUP_TYPE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif // wxComboPopupWindowBase2
|
||||||
{
|
{
|
||||||
m_winPopup = new wxComboPopupWindow( this, wxNO_BORDER );
|
m_winPopup = new wxComboPopupWindow( this, wxNO_BORDER );
|
||||||
m_popupWinType = PRIMARY_POPUP_TYPE;
|
m_popupWinType = PRIMARY_POPUP_TYPE;
|
||||||
@@ -1986,7 +2041,12 @@ void wxComboCtrlBase::DoShowPopup( const wxRect& rect, int WXUNUSED(flags) )
|
|||||||
// (though the bug was probably fixed).
|
// (though the bug was probably fixed).
|
||||||
winPopup->SetSize( rect );
|
winPopup->SetSize( rect );
|
||||||
|
|
||||||
winPopup->Show();
|
#if USES_WXPOPUPTRANSIENTWINDOW
|
||||||
|
if ( m_popupWinType == POPUPWIN_WXPOPUPTRANSIENTWINDOW )
|
||||||
|
((wxPopupTransientWindow*)winPopup)->Popup(m_popup);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
winPopup->Show();
|
||||||
|
|
||||||
m_popupWinState = Visible;
|
m_popupWinState = Visible;
|
||||||
}
|
}
|
||||||
@@ -1998,6 +2058,8 @@ void wxComboCtrlBase::DoShowPopup( const wxRect& rect, int WXUNUSED(flags) )
|
|||||||
|
|
||||||
m_popupWinState = Hidden;
|
m_popupWinState = Hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxComboCtrlBase::OnPopupDismiss()
|
void wxComboCtrlBase::OnPopupDismiss()
|
||||||
|
@@ -380,7 +380,8 @@ void wxBitmapComboBox::OnDrawBackground(wxDC& dc,
|
|||||||
{
|
{
|
||||||
if ( GetCustomPaintWidth() == 0 ||
|
if ( GetCustomPaintWidth() == 0 ||
|
||||||
!(flags & wxODCB_PAINTING_SELECTED) ||
|
!(flags & wxODCB_PAINTING_SELECTED) ||
|
||||||
item < 0 )
|
item < 0 ||
|
||||||
|
( (flags & wxODCB_PAINTING_CONTROL) && (GetInternalFlags() & wxCC_FULL_BUTTON)) )
|
||||||
{
|
{
|
||||||
wxOwnerDrawnComboBox::OnDrawBackground(dc, rect, item, flags);
|
wxOwnerDrawnComboBox::OnDrawBackground(dc, rect, item, flags);
|
||||||
return;
|
return;
|
||||||
|
@@ -159,7 +159,8 @@ bool wxGenericComboCtrl::Create(wxWindow *parent,
|
|||||||
border = wxBORDER_NONE;
|
border = wxBORDER_NONE;
|
||||||
|
|
||||||
Customize( wxCC_BUTTON_OUTSIDE_BORDER |
|
Customize( wxCC_BUTTON_OUTSIDE_BORDER |
|
||||||
wxCC_NO_TEXT_AUTO_SELECT );
|
wxCC_NO_TEXT_AUTO_SELECT |
|
||||||
|
wxCC_BUTTON_STAYS_DOWN );
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -44,6 +44,7 @@
|
|||||||
// parameters.
|
// parameters.
|
||||||
#if 0
|
#if 0
|
||||||
#include <tmschema.h>
|
#include <tmschema.h>
|
||||||
|
#include <VSStyle.h>
|
||||||
#else
|
#else
|
||||||
//----------------------------------
|
//----------------------------------
|
||||||
#define EP_EDITTEXT 1
|
#define EP_EDITTEXT 1
|
||||||
@@ -58,7 +59,55 @@
|
|||||||
#define TMT_TEXTCOLOR 3803
|
#define TMT_TEXTCOLOR 3803
|
||||||
#define TMT_BORDERCOLOR 3801
|
#define TMT_BORDERCOLOR 3801
|
||||||
#define TMT_EDGEFILLCOLOR 3808
|
#define TMT_EDGEFILLCOLOR 3808
|
||||||
//----------------------------------
|
#define TMT_BGTYPE 4001
|
||||||
|
|
||||||
|
#define BT_IMAGEFILE 0
|
||||||
|
#define BT_BORDERFILL 1
|
||||||
|
|
||||||
|
#define CP_DROPDOWNBUTTON 1
|
||||||
|
#define CP_BACKGROUND 2 // This and above are Vista and later only
|
||||||
|
#define CP_TRANSPARENTBACKGROUND 3
|
||||||
|
#define CP_BORDER 4
|
||||||
|
#define CP_READONLY 5
|
||||||
|
#define CP_DROPDOWNBUTTONRIGHT 6
|
||||||
|
#define CP_DROPDOWNBUTTONLEFT 7
|
||||||
|
#define CP_CUEBANNER 8
|
||||||
|
|
||||||
|
#define CBXS_NORMAL 1
|
||||||
|
#define CBXS_HOT 2
|
||||||
|
#define CBXS_PRESSED 3
|
||||||
|
#define CBXS_DISABLED 4
|
||||||
|
|
||||||
|
#define CBXSR_NORMAL 1
|
||||||
|
#define CBXSR_HOT 2
|
||||||
|
#define CBXSR_PRESSED 3
|
||||||
|
#define CBXSR_DISABLED 4
|
||||||
|
|
||||||
|
#define CBXSL_NORMAL 1
|
||||||
|
#define CBXSL_HOT 2
|
||||||
|
#define CBXSL_PRESSED 3
|
||||||
|
#define CBXSL_DISABLED 4
|
||||||
|
|
||||||
|
#define CBTBS_NORMAL 1
|
||||||
|
#define CBTBS_HOT 2
|
||||||
|
#define CBTBS_DISABLED 3
|
||||||
|
#define CBTBS_FOCUSED 4
|
||||||
|
|
||||||
|
#define CBB_NORMAL 1
|
||||||
|
#define CBB_HOT 2
|
||||||
|
#define CBB_FOCUSED 3
|
||||||
|
#define CBB_DISABLED 4
|
||||||
|
|
||||||
|
#define CBRO_NORMAL 1
|
||||||
|
#define CBRO_HOT 2
|
||||||
|
#define CBRO_PRESSED 3
|
||||||
|
#define CBRO_DISABLED 4
|
||||||
|
|
||||||
|
#define CBCB_NORMAL 1
|
||||||
|
#define CBCB_HOT 2
|
||||||
|
#define CBCB_PRESSED 3
|
||||||
|
#define CBCB_DISABLED 4
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -68,7 +117,7 @@
|
|||||||
#define TEXTCTRLXADJUST_XP 1
|
#define TEXTCTRLXADJUST_XP 1
|
||||||
#define TEXTCTRLYADJUST_XP 3
|
#define TEXTCTRLYADJUST_XP 3
|
||||||
#define TEXTCTRLXADJUST_CLASSIC 1
|
#define TEXTCTRLXADJUST_CLASSIC 1
|
||||||
#define TEXTCTRLYADJUST_CLASSIC 2
|
#define TEXTCTRLYADJUST_CLASSIC 3
|
||||||
|
|
||||||
#define COMBOBOX_ANIMATION_RESOLUTION 10
|
#define COMBOBOX_ANIMATION_RESOLUTION 10
|
||||||
|
|
||||||
@@ -114,9 +163,9 @@ bool wxComboCtrl::Create(wxWindow *parent,
|
|||||||
|
|
||||||
if ( !border )
|
if ( !border )
|
||||||
{
|
{
|
||||||
// For XP, have 1-width custom border, for older version use sunken
|
|
||||||
if ( theme )
|
if ( theme )
|
||||||
{
|
{
|
||||||
|
// For XP, have 1-width custom border, for older version use sunken
|
||||||
border = wxBORDER_NONE;
|
border = wxBORDER_NONE;
|
||||||
m_widthCustomBorder = 1;
|
m_widthCustomBorder = 1;
|
||||||
}
|
}
|
||||||
@@ -137,6 +186,12 @@ bool wxComboCtrl::Create(wxWindow *parent,
|
|||||||
name) )
|
name) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if ( theme )
|
||||||
|
{
|
||||||
|
if ( ::wxGetWinVersion() >= wxWinVersion_Vista )
|
||||||
|
m_iFlags |= wxCC_BUTTON_STAYS_DOWN |wxCC_BUTTON_COVERS_BORDER;
|
||||||
|
}
|
||||||
|
|
||||||
if ( style & wxCC_STD_BUTTON )
|
if ( style & wxCC_STD_BUTTON )
|
||||||
m_iFlags |= wxCC_POPUP_ON_MOUSE_UP;
|
m_iFlags |= wxCC_POPUP_ON_MOUSE_UP;
|
||||||
|
|
||||||
@@ -252,11 +307,10 @@ void
|
|||||||
wxComboCtrl::PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const
|
wxComboCtrl::PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const
|
||||||
{
|
{
|
||||||
wxUxThemeHandle hTheme(this, L"COMBOBOX");
|
wxUxThemeHandle hTheme(this, L"COMBOBOX");
|
||||||
//COLORREF cref;
|
|
||||||
|
|
||||||
wxSize sz = GetClientSize();
|
wxSize sz = GetClientSize();
|
||||||
bool isEnabled;
|
bool isEnabled;
|
||||||
bool isFocused; // also selected
|
bool doDrawFocusRect; // also selected
|
||||||
|
|
||||||
// For smaller size control (and for disabled background) use less spacing
|
// For smaller size control (and for disabled background) use less spacing
|
||||||
int focusSpacingX;
|
int focusSpacingX;
|
||||||
@@ -266,7 +320,7 @@ wxComboCtrl::PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const
|
|||||||
{
|
{
|
||||||
// Drawing control
|
// Drawing control
|
||||||
isEnabled = IsEnabled();
|
isEnabled = IsEnabled();
|
||||||
isFocused = ShouldDrawFocus();
|
doDrawFocusRect = ShouldDrawFocus();
|
||||||
|
|
||||||
// Windows-style: for smaller size control (and for disabled background) use less spacing
|
// Windows-style: for smaller size control (and for disabled background) use less spacing
|
||||||
if ( hTheme )
|
if ( hTheme )
|
||||||
@@ -294,7 +348,7 @@ wxComboCtrl::PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const
|
|||||||
{
|
{
|
||||||
// Drawing a list item
|
// Drawing a list item
|
||||||
isEnabled = true; // they are never disabled
|
isEnabled = true; // they are never disabled
|
||||||
isFocused = flags & wxCONTROL_SELECTED ? true : false;
|
doDrawFocusRect = flags & wxCONTROL_SELECTED ? true : false;
|
||||||
|
|
||||||
focusSpacingX = 0;
|
focusSpacingX = 0;
|
||||||
focusSpacingY = 0;
|
focusSpacingY = 0;
|
||||||
@@ -318,70 +372,61 @@ wxComboCtrl::PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const
|
|||||||
// theme = wxUxThemeEngine::GetIfActive();
|
// theme = wxUxThemeEngine::GetIfActive();
|
||||||
|
|
||||||
wxColour bgCol;
|
wxColour bgCol;
|
||||||
bool drawDottedEdge = false;
|
bool doDrawDottedEdge = false;
|
||||||
|
bool doDrawSelRect = true;
|
||||||
|
|
||||||
|
// TODO: doDrawDottedEdge = true when focus has arrived to control via tab.
|
||||||
|
// (and other cases which are not that apparent).
|
||||||
|
|
||||||
if ( isEnabled )
|
if ( isEnabled )
|
||||||
{
|
{
|
||||||
// If popup is hidden and this control is focused,
|
// If popup is hidden and this control is focused,
|
||||||
// then draw the focus-indicator (selbgcolor background etc.).
|
// then draw the focus-indicator (selbgcolor background etc.).
|
||||||
if ( isFocused )
|
if ( doDrawFocusRect )
|
||||||
{
|
{
|
||||||
#if 0
|
// NB: We can't really use XP visual styles to get TMT_TEXTCOLOR since
|
||||||
// TODO: Proper theme color getting (JMS: I don't know which parts/colors to use,
|
// it is not properly defined for combo boxes. Instead, they expect
|
||||||
// those below don't work)
|
// you to use DrawThemeText.
|
||||||
if ( hTheme )
|
//
|
||||||
|
// Here is, however, sample code how to get theme colours:
|
||||||
|
//
|
||||||
|
// COLORREF cref;
|
||||||
|
// theme->GetThemeColor(hTheme,EP_EDITTEXT,ETS_NORMAL,TMT_TEXTCOLOR,&cref);
|
||||||
|
// dc.SetTextForeground( wxRGBToColour(cref) );
|
||||||
|
if ( (m_iFlags & wxCC_FULL_BUTTON) && !(flags & wxCONTROL_ISSUBMENU) )
|
||||||
{
|
{
|
||||||
theme->GetThemeColor(hTheme,EP_EDITTEXT,ETS_SELECTED,TMT_TEXTCOLOR,&cref);
|
// Vista style read-only combo
|
||||||
dc.SetTextForeground( wxRGBToColour(cref) );
|
doDrawSelRect = false;
|
||||||
theme->GetThemeColor(hTheme,EP_EDITTEXT,ETS_SELECTED,TMT_FILLCOLOR,&cref);
|
doDrawDottedEdge = true;
|
||||||
bgCol = wxRGBToColour(cref);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) );
|
dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) );
|
||||||
bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT);
|
bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT);
|
||||||
if ( m_windowStyle & wxCB_READONLY )
|
|
||||||
drawDottedEdge = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/*if ( hTheme )
|
dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT) );
|
||||||
{
|
bgCol = GetBackgroundColour();
|
||||||
theme->GetThemeColor(hTheme,EP_EDITTEXT,ETS_NORMAL,TMT_TEXTCOLOR,&cref);
|
doDrawSelRect = false;
|
||||||
dc.SetTextForeground( wxRGBToColour(cref) );
|
|
||||||
theme->GetThemeColor(hTheme,EP_EDITTEXT,ETS_NORMAL,TMT_FILLCOLOR,&cref);
|
|
||||||
bgCol = wxRGBToColour(cref);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{*/
|
|
||||||
dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT) );
|
|
||||||
bgCol = GetBackgroundColour();
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/*if ( hTheme )
|
dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT) );
|
||||||
{
|
bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE);
|
||||||
theme->GetThemeColor(hTheme,EP_EDITTEXT,ETS_DISABLED,TMT_TEXTCOLOR,&cref);
|
|
||||||
dc.SetTextForeground( wxRGBToColour(cref) );
|
|
||||||
theme->GetThemeColor(hTheme,EP_EDITTEXT,ETS_DISABLED,TMT_EDGEFILLCOLOR,&cref);
|
|
||||||
bgCol = wxRGBToColour(cref);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{*/
|
|
||||||
dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT) );
|
|
||||||
bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE);
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dc.SetBrush(bgCol);
|
dc.SetBrush(bgCol);
|
||||||
dc.SetPen(bgCol);
|
if ( doDrawSelRect )
|
||||||
dc.DrawRectangle(selRect);
|
{
|
||||||
if ( drawDottedEdge )
|
dc.SetPen(bgCol);
|
||||||
wxMSWDrawFocusRect(dc,selRect);
|
dc.DrawRectangle(selRect);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( doDrawDottedEdge )
|
||||||
|
wxMSWDrawFocusRect(dc, selRect);
|
||||||
|
|
||||||
// Don't clip exactly to the selection rectangle so we can draw
|
// Don't clip exactly to the selection rectangle so we can draw
|
||||||
// to the non-selected area in front of it.
|
// to the non-selected area in front of it.
|
||||||
@@ -397,84 +442,187 @@ void wxComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) )
|
|||||||
wxSize sz = GetClientSize();
|
wxSize sz = GetClientSize();
|
||||||
wxAutoBufferedPaintDC dc(this);
|
wxAutoBufferedPaintDC dc(this);
|
||||||
|
|
||||||
const wxRect& rectb = m_btnArea;
|
const wxRect& rectButton = m_btnArea;
|
||||||
wxRect rect = m_tcArea;
|
wxRect rectTextField = m_tcArea;
|
||||||
bool isEnabled = IsEnabled();
|
const bool isEnabled = IsEnabled();
|
||||||
wxColour bgCol = GetBackgroundColour();
|
wxColour bgCol = GetBackgroundColour();
|
||||||
wxColour fgCol;
|
|
||||||
|
HDC hDc = GetHdcOf(dc);
|
||||||
|
HWND hWnd = GetHwndOf(this);
|
||||||
|
|
||||||
wxUxThemeEngine* theme = NULL;
|
wxUxThemeEngine* theme = NULL;
|
||||||
wxUxThemeHandle hTheme(this, L"COMBOBOX");
|
wxUxThemeHandle hTheme(this, L"COMBOBOX");
|
||||||
int etsState;
|
|
||||||
|
|
||||||
// area around both controls
|
if ( hTheme )
|
||||||
wxRect rect2(0,0,sz.x,sz.y);
|
theme = wxUxThemeEngine::GetIfActive();
|
||||||
|
|
||||||
|
wxRect borderRect(0,0,sz.x,sz.y);
|
||||||
|
|
||||||
if ( m_iFlags & wxCC_IFLAG_BUTTON_OUTSIDE )
|
if ( m_iFlags & wxCC_IFLAG_BUTTON_OUTSIDE )
|
||||||
{
|
{
|
||||||
rect2 = m_tcArea;
|
borderRect = m_tcArea;
|
||||||
rect2.Inflate(1);
|
borderRect.Inflate(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use theme to draw border on XP
|
int drawButFlags = 0;
|
||||||
|
|
||||||
if ( hTheme )
|
if ( hTheme )
|
||||||
{
|
{
|
||||||
theme = wxUxThemeEngine::GetIfActive();
|
const bool useVistaComboBox = ::wxGetWinVersion() >= wxWinVersion_Vista;
|
||||||
COLORREF cref;
|
|
||||||
|
RECT rFull;
|
||||||
|
wxCopyRectToRECT(borderRect, rFull);
|
||||||
|
|
||||||
|
RECT rButton;
|
||||||
|
wxCopyRectToRECT(rectButton, rButton);
|
||||||
|
|
||||||
|
RECT rBorder;
|
||||||
|
wxCopyRectToRECT(borderRect, rBorder);
|
||||||
|
|
||||||
|
bool isNonStdButton = (m_iFlags & wxCC_IFLAG_BUTTON_OUTSIDE) ||
|
||||||
|
(m_iFlags & wxCC_IFLAG_HAS_NONSTANDARD_BUTTON);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get some states for themed drawing
|
||||||
|
int butState;
|
||||||
|
|
||||||
// Select correct border colour
|
|
||||||
if ( !isEnabled )
|
if ( !isEnabled )
|
||||||
etsState = ETS_DISABLED;
|
|
||||||
else
|
|
||||||
etsState = ETS_NORMAL;
|
|
||||||
|
|
||||||
if ( m_widthCustomBorder )
|
|
||||||
{
|
{
|
||||||
theme->GetThemeColor(hTheme,EP_EDITTEXT,etsState,TMT_BORDERCOLOR,&cref);
|
butState = CBXS_DISABLED;
|
||||||
|
}
|
||||||
// Set border colour
|
// Vista will display the drop-button as depressed always
|
||||||
dc.SetPen( wxRGBToColour(cref) );
|
// when the popup window is visilbe
|
||||||
|
else if ( (m_btnState & wxCONTROL_PRESSED) ||
|
||||||
dc.SetBrush( *wxTRANSPARENT_BRUSH );
|
(useVistaComboBox && !IsPopupWindowState(Hidden)) )
|
||||||
dc.DrawRectangle(rect2);
|
{
|
||||||
|
butState = CBXS_PRESSED;
|
||||||
|
}
|
||||||
|
else if ( m_btnState & wxCONTROL_CURRENT )
|
||||||
|
{
|
||||||
|
butState = CBXS_HOT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
butState = CBXS_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
theme->GetThemeColor(hTheme,EP_EDITTEXT,etsState,TMT_TEXTCOLOR,&cref);
|
int comboBoxPart = 0; // For XP, use the 'default' part
|
||||||
fgCol = wxRGBToColour(cref);
|
RECT* rUseForBg = &rBorder;
|
||||||
|
|
||||||
|
bool drawFullButton = false;
|
||||||
|
int bgState = butState;
|
||||||
|
const bool isFocused = (FindFocus() == GetMainWindowOfCompositeControl()) ? true : false;
|
||||||
|
|
||||||
|
if ( useVistaComboBox )
|
||||||
|
{
|
||||||
|
// FIXME: Either SetBackgroundColour or GetBackgroundColour
|
||||||
|
// doesn't work under Vista, so here's a temporary
|
||||||
|
// workaround.
|
||||||
|
bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
|
||||||
|
|
||||||
|
// Draw the entire control as a single button?
|
||||||
|
if ( !isNonStdButton )
|
||||||
|
{
|
||||||
|
if ( HasFlag(wxCB_READONLY) )
|
||||||
|
drawFullButton = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( drawFullButton )
|
||||||
|
{
|
||||||
|
comboBoxPart = CP_READONLY;
|
||||||
|
rUseForBg = &rFull;
|
||||||
|
|
||||||
|
// It should be safe enough to update this flag here.
|
||||||
|
m_iFlags |= wxCC_FULL_BUTTON;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
comboBoxPart = CP_BORDER;
|
||||||
|
m_iFlags &= ~wxCC_FULL_BUTTON;
|
||||||
|
|
||||||
|
if ( isFocused )
|
||||||
|
bgState = CBB_FOCUSED;
|
||||||
|
else
|
||||||
|
bgState = CBB_NORMAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Draw parent's background, if necessary
|
||||||
|
RECT* rUseForTb = NULL;
|
||||||
|
|
||||||
|
if ( theme->IsThemeBackgroundPartiallyTransparent( hTheme, comboBoxPart, bgState ) )
|
||||||
|
rUseForTb = &rFull;
|
||||||
|
else if ( m_iFlags & wxCC_IFLAG_BUTTON_OUTSIDE )
|
||||||
|
rUseForTb = &rButton;
|
||||||
|
|
||||||
|
if ( rUseForTb )
|
||||||
|
theme->DrawThemeParentBackground( hWnd, hDc, rUseForTb );
|
||||||
|
|
||||||
|
//
|
||||||
|
// Draw the control background (including the border)
|
||||||
|
if ( m_widthCustomBorder > 0 )
|
||||||
|
{
|
||||||
|
theme->DrawThemeBackground( hTheme, hDc, comboBoxPart, bgState, rUseForBg, NULL );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// No border. We can't use theme, since it cannot be relied on
|
||||||
|
// to deliver borderless drawing, even with DrawThemeBackgroundEx.
|
||||||
|
dc.SetBrush(bgCol);
|
||||||
|
dc.SetPen(bgCol);
|
||||||
|
dc.DrawRectangle(borderRect);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Draw the drop-button
|
||||||
|
if ( !isNonStdButton )
|
||||||
|
{
|
||||||
|
drawButFlags = Button_BitmapOnly;
|
||||||
|
|
||||||
|
int butPart = CP_DROPDOWNBUTTON;
|
||||||
|
|
||||||
|
if ( useVistaComboBox )
|
||||||
|
{
|
||||||
|
if ( drawFullButton )
|
||||||
|
{
|
||||||
|
// We need to alter the button style slightly before
|
||||||
|
// drawing the actual button (but it was good above
|
||||||
|
// when background etc was done).
|
||||||
|
if ( butState == CBXS_HOT || butState == CBXS_PRESSED )
|
||||||
|
butState = CBXS_NORMAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( m_btnSide == wxRIGHT )
|
||||||
|
butPart = CP_DROPDOWNBUTTONRIGHT;
|
||||||
|
else
|
||||||
|
butPart = CP_DROPDOWNBUTTONLEFT;
|
||||||
|
|
||||||
|
}
|
||||||
|
theme->DrawThemeBackground( hTheme, hDc, butPart, butState, &rButton, NULL );
|
||||||
|
}
|
||||||
|
else if ( useVistaComboBox &&
|
||||||
|
(m_iFlags & wxCC_IFLAG_BUTTON_OUTSIDE) )
|
||||||
|
{
|
||||||
|
// We'll do this, because DrawThemeParentBackground
|
||||||
|
// doesn't seem to be reliable on Vista.
|
||||||
|
drawButFlags |= Button_PaintBackground;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// draw regular background
|
// Windows 2000 and earlier
|
||||||
fgCol = GetForegroundColour();
|
drawButFlags = Button_PaintBackground;
|
||||||
|
|
||||||
|
dc.SetBrush(bgCol);
|
||||||
|
dc.SetPen(bgCol);
|
||||||
|
dc.DrawRectangle(borderRect);
|
||||||
}
|
}
|
||||||
|
|
||||||
rect2.Deflate(m_widthCustomBorder);
|
// Button rendering (may only do the bitmap on button, depending on the flags)
|
||||||
|
DrawButton( dc, rectButton, drawButFlags );
|
||||||
|
|
||||||
dc.SetBrush(bgCol);
|
// Paint required portion of the custom image on the control
|
||||||
dc.SetPen(bgCol);
|
|
||||||
|
|
||||||
// clear main background
|
|
||||||
dc.DrawRectangle(rect);
|
|
||||||
|
|
||||||
// Button background with theme?
|
|
||||||
int drawButFlags = Draw_PaintBg;
|
|
||||||
if ( hTheme && m_blankButtonBg )
|
|
||||||
{
|
|
||||||
RECT r;
|
|
||||||
wxCopyRectToRECT(rectb, r);
|
|
||||||
|
|
||||||
// Draw parent background if needed (since button looks like its out of
|
|
||||||
// the combo, this is preferred).
|
|
||||||
theme->DrawThemeParentBackground(GetHwndOf(this),
|
|
||||||
GetHdcOf(dc),
|
|
||||||
&r);
|
|
||||||
|
|
||||||
drawButFlags = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Standard button rendering
|
|
||||||
DrawButton(dc,rectb,drawButFlags);
|
|
||||||
|
|
||||||
// paint required portion on the control
|
|
||||||
if ( (!m_text || m_widthCustomPaint) )
|
if ( (!m_text || m_widthCustomPaint) )
|
||||||
{
|
{
|
||||||
wxASSERT( m_widthCustomPaint >= 0 );
|
wxASSERT( m_widthCustomPaint >= 0 );
|
||||||
@@ -482,15 +630,15 @@ void wxComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) )
|
|||||||
// this is intentionally here to allow drawed rectangle's
|
// this is intentionally here to allow drawed rectangle's
|
||||||
// right edge to be hidden
|
// right edge to be hidden
|
||||||
if ( m_text )
|
if ( m_text )
|
||||||
rect.width = m_widthCustomPaint;
|
rectTextField.width = m_widthCustomPaint;
|
||||||
|
|
||||||
dc.SetFont( GetFont() );
|
dc.SetFont( GetFont() );
|
||||||
|
|
||||||
dc.SetClippingRegion(rect);
|
dc.SetClippingRegion(rectTextField);
|
||||||
if ( m_popupInterface )
|
if ( m_popupInterface )
|
||||||
m_popupInterface->PaintComboControl(dc,rect);
|
m_popupInterface->PaintComboControl(dc,rectTextField);
|
||||||
else
|
else
|
||||||
wxComboPopup::DefaultPaintComboControl(this,dc,rect);
|
wxComboPopup::DefaultPaintComboControl(this,dc,rectTextField);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user