Introduce wxAnyButton class, a common base class for wxButton and wxToggleButton, allowing to reuse the same implementation for them. This also allows to implement support for bitmaps in wxToggleButton for all platforms and make wxBitmapToggleButton a trivial subclass of it everywhere, similarly to wxBitmapButton and wxButton. Closes #13198. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67931 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
198 lines
5.5 KiB
C++
198 lines
5.5 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/msw/tglbtn.cpp
|
|
// Purpose: Definition of the wxToggleButton class, which implements a
|
|
// toggle button under wxMSW.
|
|
// Author: John Norris, minor changes by Axel Schlueter
|
|
// and William Gallafent.
|
|
// Modified by:
|
|
// Created: 08.02.01
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) 2000 Johnny C. Norris II
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// ============================================================================
|
|
// declarations
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// headers
|
|
// ----------------------------------------------------------------------------
|
|
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#if wxUSE_TOGGLEBTN
|
|
|
|
#include "wx/tglbtn.h"
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/button.h"
|
|
#include "wx/brush.h"
|
|
#include "wx/dcscreen.h"
|
|
#include "wx/settings.h"
|
|
|
|
#include "wx/log.h"
|
|
#endif // WX_PRECOMP
|
|
|
|
#include "wx/msw/private.h"
|
|
#include "wx/msw/private/button.h"
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// macros
|
|
// ----------------------------------------------------------------------------
|
|
|
|
wxDEFINE_EVENT( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEvent );
|
|
|
|
// ============================================================================
|
|
// implementation
|
|
// ============================================================================
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// wxBitmapToggleButton
|
|
//-----------------------------------------------------------------------------
|
|
|
|
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 )
|
|
{
|
|
if (!wxToggleButton::Create( parent, id, wxEmptyString, pos, size, style, validator, name ))
|
|
return false;
|
|
|
|
SetBitmap(label);
|
|
|
|
if (size.x == -1 || size.y == -1)
|
|
{
|
|
wxSize new_size = GetBestSize();
|
|
if (size.x != -1)
|
|
new_size.x = size.x;
|
|
if (size.y != -1)
|
|
new_size.y = size.y;
|
|
SetSize( new_size );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxToggleButton
|
|
// ----------------------------------------------------------------------------
|
|
|
|
IMPLEMENT_DYNAMIC_CLASS(wxToggleButton, wxControl)
|
|
|
|
void wxToggleButton::Init()
|
|
{
|
|
m_state = false;
|
|
}
|
|
|
|
// Single check box item
|
|
bool wxToggleButton::Create(wxWindow *parent,
|
|
wxWindowID id,
|
|
const wxString& label,
|
|
const wxPoint& pos,
|
|
const wxSize& size, long style,
|
|
const wxValidator& validator,
|
|
const wxString& name)
|
|
{
|
|
Init();
|
|
|
|
if ( !CreateControl(parent, id, pos, size, style, validator, name) )
|
|
return false;
|
|
|
|
// if the label contains several lines we must explicitly tell the button
|
|
// about it or it wouldn't draw it correctly ("\n"s would just appear as
|
|
// black boxes)
|
|
//
|
|
// NB: we do it here and not in MSWGetStyle() because we need the label
|
|
// value and the label is not set yet when MSWGetStyle() is called
|
|
WXDWORD exstyle;
|
|
WXDWORD msStyle = MSWGetStyle(style, &exstyle);
|
|
msStyle |= wxMSWButton::GetMultilineStyle(label);
|
|
|
|
return MSWCreateControl(wxT("BUTTON"), msStyle, pos, size, label, exstyle);
|
|
}
|
|
|
|
WXDWORD wxToggleButton::MSWGetStyle(long style, WXDWORD *exstyle) const
|
|
{
|
|
WXDWORD msStyle = wxControl::MSWGetStyle(style, exstyle);
|
|
|
|
msStyle |= BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP;
|
|
|
|
if ( style & wxBU_LEFT )
|
|
msStyle |= BS_LEFT;
|
|
if ( style & wxBU_RIGHT )
|
|
msStyle |= BS_RIGHT;
|
|
if ( style & wxBU_TOP )
|
|
msStyle |= BS_TOP;
|
|
if ( style & wxBU_BOTTOM )
|
|
msStyle |= BS_BOTTOM;
|
|
|
|
return msStyle;
|
|
}
|
|
|
|
void wxToggleButton::SetValue(bool val)
|
|
{
|
|
m_state = val;
|
|
if ( IsOwnerDrawn() )
|
|
{
|
|
Refresh();
|
|
}
|
|
else
|
|
{
|
|
::SendMessage(GetHwnd(), BM_SETCHECK, val, 0);
|
|
}
|
|
}
|
|
|
|
bool wxToggleButton::GetValue() const
|
|
{
|
|
if ( IsOwnerDrawn() )
|
|
{
|
|
return m_state;
|
|
}
|
|
else
|
|
{
|
|
return ::SendMessage(GetHwnd(), BM_GETCHECK, 0, 0) == BST_CHECKED;
|
|
}
|
|
}
|
|
|
|
void wxToggleButton::Command(wxCommandEvent& event)
|
|
{
|
|
SetValue(event.GetInt() != 0);
|
|
ProcessCommand(event);
|
|
}
|
|
|
|
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);
|
|
ProcessCommand(event);
|
|
return true;
|
|
}
|
|
|
|
wxAnyButton::State wxToggleButton::GetNormalState() const
|
|
{
|
|
if ( GetValue() )
|
|
return State_Pressed;
|
|
else
|
|
return State_Normal;
|
|
}
|
|
|
|
#endif // wxUSE_TOGGLEBTN
|