The change of 4990515aba resulted in
(disabled by default, but which may be enabled when building
applications using wxWidgets) MSVS 2017 warning C4265 ('class' : class
has virtual functions, but destructor is not virtual), so test for clang
explicitly instead of just testing for non-gcc.
		
	
		
			
				
	
	
		
			140 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
///////////////////////////////////////////////////////////////////////////////
 | 
						|
// Name:        wx/msw/ownerdrawnbutton.h
 | 
						|
// Purpose:     Common base class for wxCheckBox and wxRadioButton
 | 
						|
// Author:      Vadim Zeitlin
 | 
						|
// Created:     2014-05-04
 | 
						|
// Copyright:   (c) 2014 Vadim Zeitlin <vadim@wxwidgets.org>
 | 
						|
// Licence:     wxWindows licence
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
#ifndef _WX_MSW_OWNERDRAWNBUTTON_H_
 | 
						|
#define _WX_MSW_OWNERDRAWNBUTTON_H_
 | 
						|
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// wxMSWOwnerDrawnButton: base class for any kind of Windows buttons
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
 | 
						|
// This class contains the type-independent part of wxMSWOwnerDrawnButton and
 | 
						|
// is implemented in src/msw/control.cpp.
 | 
						|
//
 | 
						|
// Notice that this class is internal implementation detail only and is
 | 
						|
// intentionally not documented. Ideally it wouldn't be even exported from the
 | 
						|
// DLL but this somehow breaks building of applications using wxWidgets with
 | 
						|
// Intel compiler using LTCG, so we do export it.
 | 
						|
class WXDLLIMPEXP_CORE wxMSWOwnerDrawnButtonBase
 | 
						|
{
 | 
						|
protected:
 | 
						|
    // Ctor takes the back pointer to the real window, must be non-NULL.
 | 
						|
    wxMSWOwnerDrawnButtonBase(wxWindow* win) :
 | 
						|
        m_win(win)
 | 
						|
    {
 | 
						|
        m_isPressed =
 | 
						|
        m_isHot = false;
 | 
						|
    }
 | 
						|
 | 
						|
    // Explicitly define the destructor even if it's trivial to make it
 | 
						|
    // protected. This avoids compiler warnings about the fact that this class
 | 
						|
    // has virtual functions, but no virtual destructor without making the dtor
 | 
						|
    // virtual which is not needed here as objects are never deleted via
 | 
						|
    // pointers to this class (and protected dtor enforces this).
 | 
						|
    //
 | 
						|
    // Unfortunately g++ 3.4.5 still complains about the dtor being non virtual
 | 
						|
    // even if it is protected, but actually does not give any warnings if the
 | 
						|
    // dtor is not defined at all, so work around this 3.4.5 bug inside our
 | 
						|
    // general g++ workaround.
 | 
						|
#if wxCHECK_GCC_VERSION(4, 0) || defined(__clang__)
 | 
						|
    ~wxMSWOwnerDrawnButtonBase() { }
 | 
						|
#endif // g++ 4.0+
 | 
						|
 | 
						|
    // Make the control owner drawn if necessary to implement support for the
 | 
						|
    // given foreground colour.
 | 
						|
    void MSWMakeOwnerDrawnIfNecessary(const wxColour& colFg);
 | 
						|
 | 
						|
    // Return true if the control is currently owner drawn.
 | 
						|
    bool MSWIsOwnerDrawn() const;
 | 
						|
 | 
						|
    // Draw the button if the message information about which is provided in
 | 
						|
    // the given DRAWITEMSTRUCT asks us to do it, otherwise just return false.
 | 
						|
    bool MSWDrawButton(WXDRAWITEMSTRUCT *item);
 | 
						|
 | 
						|
 | 
						|
    // Methods which must be overridden in the derived concrete class.
 | 
						|
 | 
						|
    // Return the style to use for the non-owner-drawn button.
 | 
						|
    virtual int MSWGetButtonStyle() const = 0;
 | 
						|
 | 
						|
    // Called after reverting button to non-owner drawn state, provides a hook
 | 
						|
    // for wxCheckBox-specific hack.
 | 
						|
    virtual void MSWOnButtonResetOwnerDrawn() { }
 | 
						|
 | 
						|
    // Return the flags (such as wxCONTROL_CHECKED) to use for the control when
 | 
						|
    // drawing it. Notice that this class already takes care of the common
 | 
						|
    // logic and sets the other wxCONTROL_XXX flags on its own, this method
 | 
						|
    // really only needs to return the flags depending on the checked state.
 | 
						|
    virtual int MSWGetButtonCheckedFlag() const = 0;
 | 
						|
 | 
						|
    // Actually draw the check or radio bitmap, typically just by using the
 | 
						|
    // appropriate wxRendererNative method.
 | 
						|
    virtual void
 | 
						|
        MSWDrawButtonBitmap(wxDC& dc, const wxRect& rect, int flags) = 0;
 | 
						|
 | 
						|
 | 
						|
private:
 | 
						|
    // Make the control owner drawn or reset it to normal style.
 | 
						|
    void MSWMakeOwnerDrawn(bool ownerDrawn);
 | 
						|
 | 
						|
    // Event handlers used to update the appearance of owner drawn button.
 | 
						|
    void OnMouseEnterOrLeave(wxMouseEvent& event);
 | 
						|
    void OnMouseLeft(wxMouseEvent& event);
 | 
						|
    void OnFocus(wxFocusEvent& event);
 | 
						|
 | 
						|
 | 
						|
    // The real window.
 | 
						|
    wxWindow* const m_win;
 | 
						|
 | 
						|
    // true if the checkbox is currently pressed
 | 
						|
    bool m_isPressed;
 | 
						|
 | 
						|
    // true if mouse is currently over the control
 | 
						|
    bool m_isHot;
 | 
						|
 | 
						|
 | 
						|
    wxDECLARE_NO_COPY_CLASS(wxMSWOwnerDrawnButtonBase);
 | 
						|
};
 | 
						|
 | 
						|
// This class uses a weak version of CRTP, i.e. it's a template class taking
 | 
						|
// the base class that the class deriving from it would normally derive from.
 | 
						|
template <class T>
 | 
						|
class wxMSWOwnerDrawnButton
 | 
						|
    : public T,
 | 
						|
      private wxMSWOwnerDrawnButtonBase
 | 
						|
{
 | 
						|
private:
 | 
						|
    typedef T Base;
 | 
						|
 | 
						|
public:
 | 
						|
    wxMSWOwnerDrawnButton() : wxMSWOwnerDrawnButtonBase(this)
 | 
						|
    {
 | 
						|
    }
 | 
						|
 | 
						|
    virtual bool SetForegroundColour(const wxColour& colour) wxOVERRIDE
 | 
						|
    {
 | 
						|
        if ( !Base::SetForegroundColour(colour) )
 | 
						|
            return false;
 | 
						|
 | 
						|
        MSWMakeOwnerDrawnIfNecessary(colour);
 | 
						|
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    virtual bool MSWOnDraw(WXDRAWITEMSTRUCT *item) wxOVERRIDE
 | 
						|
    {
 | 
						|
        return MSWDrawButton(item) || Base::MSWOnDraw(item);
 | 
						|
    }
 | 
						|
 | 
						|
protected:
 | 
						|
    bool IsOwnerDrawn() const { return MSWIsOwnerDrawn(); }
 | 
						|
};
 | 
						|
 | 
						|
#endif // _WX_MSW_OWNERDRAWNBUTTON_H_
 |