X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/526954c5968baa29218c994ec48e476ae2bd4b9f..b404a8f3b072129c107c6d9a5e0f6f53cd34807b:/src/msw/tglbtn.cpp diff --git a/src/msw/tglbtn.cpp b/src/msw/tglbtn.cpp index cde1757758..e4effb9ff0 100644 --- a/src/msw/tglbtn.cpp +++ b/src/msw/tglbtn.cpp @@ -38,9 +38,6 @@ #include "wx/log.h" #endif // WX_PRECOMP -#include "wx/renderer.h" -#include "wx/dcclient.h" - #include "wx/msw/private.h" #include "wx/msw/private/button.h" @@ -58,32 +55,16 @@ wxDEFINE_EVENT( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEvent ); // wxBitmapToggleButton //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxBitmapToggleButton, wxControl) - -BEGIN_EVENT_TABLE(wxBitmapToggleButton,wxToggleButtonBase) - EVT_PAINT(wxBitmapToggleButton::OnPaint) - EVT_MOUSE_EVENTS(wxBitmapToggleButton::OnMouse) - EVT_CHAR(wxBitmapToggleButton::OnChar) - EVT_SIZE(wxBitmapToggleButton::OnSize) -END_EVENT_TABLE() - -void wxBitmapToggleButton::Init() -{ - m_depressed = false; - m_oldValue = false; - m_capturing = false; -} +IMPLEMENT_DYNAMIC_CLASS(wxBitmapToggleButton, wxToggleButton) bool wxBitmapToggleButton::Create( wxWindow *parent, wxWindowID id, const wxBitmap& label,const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name ) { - Init(); - - if (!wxToggleButtonBase::Create( parent, id, pos, size, style, validator, name )) + if (!wxToggleButton::Create( parent, id, wxEmptyString, pos, size, style, validator, name )) return false; - m_bitmap = label; + SetBitmap(label); if (size.x == -1 || size.y == -1) { @@ -98,152 +79,6 @@ bool wxBitmapToggleButton::Create( wxWindow *parent, wxWindowID id, return true; } -void wxBitmapToggleButton::SetValue(bool state) -{ - if (m_capturing) return; - - if (state == m_depressed) return; - - m_depressed = state; - Refresh(); -} - -bool wxBitmapToggleButton::GetValue() const -{ - return m_depressed; -} - -void wxBitmapToggleButton::SetLabel(const wxBitmap& label) -{ - m_bitmap = label; - m_disabledBitmap = wxBitmap(); - - Refresh(); -} - -bool wxBitmapToggleButton::Enable(bool enable) -{ - if (m_capturing) return false; - - if (!wxToggleButtonBase::Enable( enable )) - return false; - - Refresh(); - - return true; -} - -void wxBitmapToggleButton::OnPaint(wxPaintEvent &WXUNUSED(event)) -{ - wxSize size = GetSize(); - - wxBitmap bitmap = m_bitmap; - - wxPaintDC dc(this); - wxRendererNative &renderer = wxRendererNative::Get(); - int flags = 0; - if (m_depressed) - flags |= wxCONTROL_PRESSED; - wxRect rect(0,0,size.x,size.y); - renderer.DrawPushButton( this, dc, rect, flags ); - - if (bitmap.IsOk()) - { - if (!IsEnabled()) - { - if (!m_disabledBitmap.IsOk()) - { - wxImage image = m_bitmap.ConvertToImage(); - m_disabledBitmap = wxBitmap( image.ConvertToGreyscale() ); - } - - bitmap = m_disabledBitmap; - } - - wxSize bsize = bitmap.GetSize(); - int offset = 0; - if (m_depressed) offset = 1; - dc.DrawBitmap( bitmap, (size.x-bsize.x) / 2 + offset, (size.y-bsize.y) / 2 + offset, true ); - } - -} - -void wxBitmapToggleButton::OnMouse(wxMouseEvent &event) -{ - if (!IsEnabled()) - return; - - wxSize size = GetSize(); - bool mouse_in = ((event.GetX() > 0) && (event.GetX() < size.x) && - (event.GetY() > 0) && (event.GetY() < size.y)); - - if (m_capturing) - { - bool old_depressed = m_depressed; - if (mouse_in) - m_depressed = !m_oldValue; - else - m_depressed = m_oldValue; - - if (event.LeftUp()) - { - ReleaseMouse(); - m_capturing = false; - if (mouse_in) - { - wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, m_windowId); - event.SetInt(GetValue()); - event.SetEventObject(this); - ProcessCommand(event); - } - } - - if (old_depressed != m_depressed) - Refresh(); - } - else - { - if (event.LeftDown()) - { - m_capturing = true; - m_oldValue = m_depressed; - m_depressed = !m_oldValue; - CaptureMouse(); - Refresh(); - } - } -} - -void wxBitmapToggleButton::OnChar(wxKeyEvent &event) -{ - if (event.GetKeyCode() == WXK_SPACE) - { - m_depressed = !m_depressed; - Refresh(); - - wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, m_windowId); - event.SetInt(GetValue()); - event.SetEventObject(this); - ProcessCommand(event); - } -} - -void wxBitmapToggleButton::OnSize(wxSizeEvent &WXUNUSED(event)) -{ - Refresh(); -} - -wxSize wxBitmapToggleButton::DoGetBestSize() const -{ - if (!m_bitmap.IsOk()) - return wxSize(16,16); - - wxSize ret = m_bitmap.GetSize(); - ret.x += 8; - ret.y += 8; - return ret; -} - // ---------------------------------------------------------------------------- // wxToggleButton @@ -251,6 +86,11 @@ wxSize wxBitmapToggleButton::DoGetBestSize() const IMPLEMENT_DYNAMIC_CLASS(wxToggleButton, wxControl) +void wxToggleButton::Init() +{ + m_state = false; +} + // Single check box item bool wxToggleButton::Create(wxWindow *parent, wxWindowID id, @@ -260,6 +100,8 @@ bool wxToggleButton::Create(wxWindow *parent, const wxValidator& validator, const wxString& name) { + Init(); + if ( !CreateControl(parent, id, pos, size, style, validator, name) ) return false; @@ -294,26 +136,29 @@ WXDWORD wxToggleButton::MSWGetStyle(long style, WXDWORD *exstyle) const return msStyle; } -wxSize wxToggleButton::DoGetBestSize() const -{ - return wxMSWButton::ComputeBestSize(const_cast(this)); -} - -void wxToggleButton::SetLabel(const wxString& label) -{ - wxMSWButton::UpdateMultilineStyle(GetHwnd(), label); - - wxToggleButtonBase::SetLabel(label); -} - void wxToggleButton::SetValue(bool val) { - ::SendMessage(GetHwnd(), BM_SETCHECK, val, 0); + m_state = val; + if ( IsOwnerDrawn() ) + { + Refresh(); + } + else + { + ::SendMessage(GetHwnd(), BM_SETCHECK, val, 0); + } } bool wxToggleButton::GetValue() const { - return ::SendMessage(GetHwnd(), BM_GETCHECK, 0, 0) == BST_CHECKED; + if ( IsOwnerDrawn() ) + { + return m_state; + } + else + { + return ::SendMessage(GetHwnd(), BM_GETCHECK, 0, 0) == BST_CHECKED; + } } void wxToggleButton::Command(wxCommandEvent& event) @@ -322,8 +167,18 @@ void wxToggleButton::Command(wxCommandEvent& event) ProcessCommand(event); } -bool wxToggleButton::MSWCommand(WXUINT WXUNUSED(param), WXWORD WXUNUSED(id)) +bool wxToggleButton::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) { + if ( param != BN_CLICKED && param != BN_DBLCLK ) + return false; + + // first update the value so that user event handler gets the new + // toggle button value + + // ownerdrawn buttons don't manage their state themselves unlike usual + // auto checkboxes so do it ourselves in any case + m_state = !m_state; + wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, m_windowId); event.SetInt(GetValue()); event.SetEventObject(this); @@ -331,4 +186,12 @@ bool wxToggleButton::MSWCommand(WXUINT WXUNUSED(param), WXWORD WXUNUSED(id)) return true; } +wxAnyButton::State wxToggleButton::GetNormalState() const +{ + if ( GetValue() ) + return State_Pressed; + else + return State_Normal; +} + #endif // wxUSE_TOGGLEBTN