Move SetBackgroundBitmap() from wxPanel to new wxCustomBackgroundWindow.
wxCustomBackgroundWindow is a new class allowing to set a custom bitmap for the background of any window. The relevant code was mostly moved from wxPanel to which it was added only recently (before 2.9.2) making it unnecessary to preserve compatibility. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@69378 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
50
include/wx/custombgwin.h
Normal file
50
include/wx/custombgwin.h
Normal file
@@ -0,0 +1,50 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Name: wx/custombgwin.h
|
||||
// Purpose: Class adding support for custom window backgrounds.
|
||||
// Author: Vadim Zeitlin
|
||||
// Created: 2011-10-10
|
||||
// RCS-ID: $Id: wxhead.h,v 1.12 2010-04-22 12:44:51 zeitlin Exp $
|
||||
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
|
||||
// Licence: wxWindows licence
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _WX_CUSTOMBGWIN_H_
|
||||
#define _WX_CUSTOMBGWIN_H_
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxCustomBackgroundWindow: Adds support for custom backgrounds to any
|
||||
// wxWindow-derived class.
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class wxCustomBackgroundWindowBase
|
||||
{
|
||||
public:
|
||||
// Trivial default ctor.
|
||||
wxCustomBackgroundWindowBase() { }
|
||||
|
||||
// Use the given bitmap to tile the background of this window. This bitmap
|
||||
// will show through any transparent children.
|
||||
//
|
||||
// Notice that you must not prevent the base class EVT_ERASE_BACKGROUND
|
||||
// handler from running (i.e. not to handle this event yourself) for this
|
||||
// to work.
|
||||
void SetBackgroundBitmap(const wxBitmap& bmp)
|
||||
{
|
||||
DoSetBackgroundBitmap(bmp);
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual void DoSetBackgroundBitmap(const wxBitmap& bmp) = 0;
|
||||
|
||||
wxDECLARE_NO_COPY_CLASS(wxCustomBackgroundWindowBase);
|
||||
};
|
||||
|
||||
#if defined(__WXUNIVERSAL__)
|
||||
#include "wx/univ/custombgwin.h"
|
||||
#elif defined(__WXMSW__)
|
||||
#include "wx/msw/custombgwin.h"
|
||||
#else
|
||||
#include "wx/generic/custombgwin.h"
|
||||
#endif
|
||||
|
||||
#endif // _WX_CUSTOMBGWIN_H_
|
96
include/wx/generic/custombgwin.h
Normal file
96
include/wx/generic/custombgwin.h
Normal file
@@ -0,0 +1,96 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Name: wx/generic/custombgwin.h
|
||||
// Purpose: Generic implementation of wxCustomBackgroundWindow.
|
||||
// Author: Vadim Zeitlin
|
||||
// Created: 2011-10-10
|
||||
// RCS-ID: $Id: wxhead.h,v 1.12 2010-04-22 12:44:51 zeitlin Exp $
|
||||
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
|
||||
// Licence: wxWindows licence
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _WX_GENERIC_CUSTOMBGWIN_H_
|
||||
#define _WX_GENERIC_CUSTOMBGWIN_H_
|
||||
|
||||
#include "wx/bitmap.h"
|
||||
|
||||
// A helper to avoid template bloat: this class contains all type-independent
|
||||
// code of wxCustomBackgroundWindow<> below.
|
||||
class wxCustomBackgroundWindowGenericBase : public wxCustomBackgroundWindowBase
|
||||
{
|
||||
public:
|
||||
wxCustomBackgroundWindowGenericBase() { }
|
||||
|
||||
protected:
|
||||
void DoEraseBackground(wxEraseEvent& event, wxWindow* win)
|
||||
{
|
||||
wxDC& dc = *event.GetDC();
|
||||
|
||||
const wxSize clientSize = win->GetClientSize();
|
||||
const wxSize bitmapSize = m_bitmapBg.GetSize();
|
||||
|
||||
for ( int x = 0; x < clientSize.x; x += bitmapSize.x )
|
||||
{
|
||||
for ( int y = 0; y < clientSize.y; y += bitmapSize.y )
|
||||
{
|
||||
dc.DrawBitmap(m_bitmapBg, x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// The bitmap used for painting the background if valid.
|
||||
wxBitmap m_bitmapBg;
|
||||
|
||||
|
||||
wxDECLARE_NO_COPY_CLASS(wxCustomBackgroundWindowGenericBase);
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxCustomBackgroundWindow
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
template <class W>
|
||||
class wxCustomBackgroundWindow : public W,
|
||||
public wxCustomBackgroundWindowGenericBase
|
||||
{
|
||||
public:
|
||||
typedef W BaseWindowClass;
|
||||
|
||||
wxCustomBackgroundWindow() { }
|
||||
|
||||
protected:
|
||||
virtual void DoSetBackgroundBitmap(const wxBitmap& bmp)
|
||||
{
|
||||
m_bitmapBg = bmp;
|
||||
|
||||
if ( m_bitmapBg.IsOk() )
|
||||
{
|
||||
BaseWindowClass::Connect
|
||||
(
|
||||
wxEVT_ERASE_BACKGROUND,
|
||||
wxEraseEventHandler(wxCustomBackgroundWindow::OnEraseBackground)
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
BaseWindowClass::Disconnect
|
||||
(
|
||||
wxEVT_ERASE_BACKGROUND,
|
||||
wxEraseEventHandler(wxCustomBackgroundWindow::OnEraseBackground)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
// Event handler for erasing the background which is only used when we have
|
||||
// a valid background bitmap.
|
||||
void OnEraseBackground(wxEraseEvent& event)
|
||||
{
|
||||
DoEraseBackground(event, this);
|
||||
}
|
||||
|
||||
|
||||
wxDECLARE_NO_COPY_TEMPLATE_CLASS(wxCustomBackgroundWindow, W);
|
||||
};
|
||||
|
||||
#endif // _WX_GENERIC_CUSTOMBGWIN_H_
|
@@ -42,18 +42,7 @@ public:
|
||||
)
|
||||
#endif // WXWIN_COMPATIBILITY_2_8
|
||||
|
||||
protected:
|
||||
virtual void DoSetBackgroundBitmap(const wxBitmap& bmp);
|
||||
|
||||
private:
|
||||
// Event handler for erasing the background which is only used when we have
|
||||
// a valid background bitmap.
|
||||
void OnEraseBackground(wxEraseEvent& event);
|
||||
|
||||
|
||||
// The bitmap used for painting the background if valid.
|
||||
wxBitmap m_bitmapBg;
|
||||
|
||||
wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxPanel);
|
||||
};
|
||||
|
||||
|
58
include/wx/msw/custombgwin.h
Normal file
58
include/wx/msw/custombgwin.h
Normal file
@@ -0,0 +1,58 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Name: wx/msw/custombgwin.h
|
||||
// Purpose: wxMSW implementation of wxCustomBackgroundWindow
|
||||
// Author: Vadim Zeitlin
|
||||
// Created: 2011-10-10
|
||||
// RCS-ID: $Id: wxhead.h,v 1.12 2010-04-22 12:44:51 zeitlin Exp $
|
||||
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
|
||||
// Licence: wxWindows licence
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _WX_MSW_CUSTOMBGWIN_H_
|
||||
#define _WX_MSW_CUSTOMBGWIN_H_
|
||||
|
||||
#include "wx/bitmap.h"
|
||||
#include "wx/brush.h"
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxCustomBackgroundWindow
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
template <class W>
|
||||
class wxCustomBackgroundWindow : public W,
|
||||
public wxCustomBackgroundWindowBase
|
||||
{
|
||||
public:
|
||||
typedef W BaseWindowClass;
|
||||
|
||||
wxCustomBackgroundWindow() { m_backgroundBrush = NULL; }
|
||||
|
||||
virtual ~wxCustomBackgroundWindow() { delete m_backgroundBrush; }
|
||||
|
||||
protected:
|
||||
virtual void DoSetBackgroundBitmap(const wxBitmap& bmp)
|
||||
{
|
||||
delete m_backgroundBrush;
|
||||
m_backgroundBrush = bmp.IsOk() ? new wxBrush(bmp) : NULL;
|
||||
|
||||
// Our transparent children should use our background if we have it,
|
||||
// otherwise try to restore m_inheritBgCol to some reasonable value: true
|
||||
// if we also have non-default background colour or false otherwise.
|
||||
BaseWindowClass::m_inheritBgCol = bmp.IsOk()
|
||||
|| BaseWindowClass::UseBgCol();
|
||||
}
|
||||
|
||||
virtual WXHBRUSH MSWGetCustomBgBrush()
|
||||
{
|
||||
if ( m_backgroundBrush )
|
||||
return (WXHBRUSH)m_backgroundBrush->GetResourceHandle();
|
||||
|
||||
return BaseWindowClass::MSWGetCustomBgBrush();
|
||||
}
|
||||
|
||||
wxBrush *m_backgroundBrush;
|
||||
|
||||
wxDECLARE_NO_COPY_TEMPLATE_CLASS(wxCustomBackgroundWindow, W);
|
||||
};
|
||||
|
||||
#endif // _WX_MSW_CUSTOMBGWIN_H_
|
@@ -20,7 +20,7 @@ class WXDLLIMPEXP_FWD_CORE wxBrush;
|
||||
class WXDLLIMPEXP_CORE wxPanel : public wxPanelBase
|
||||
{
|
||||
public:
|
||||
wxPanel() { Init(); }
|
||||
wxPanel() { }
|
||||
|
||||
wxPanel(wxWindow *parent,
|
||||
wxWindowID winid = wxID_ANY,
|
||||
@@ -29,13 +29,9 @@ public:
|
||||
long style = wxTAB_TRAVERSAL | wxNO_BORDER,
|
||||
const wxString& name = wxPanelNameStr)
|
||||
{
|
||||
Init();
|
||||
|
||||
Create(parent, winid, pos, size, style, name);
|
||||
}
|
||||
|
||||
virtual ~wxPanel();
|
||||
|
||||
// This is overridden for MSW to return true for all panels that are child
|
||||
// of a window with themed background (such as wxNotebook) which should
|
||||
// show through the child panels.
|
||||
@@ -54,18 +50,7 @@ public:
|
||||
)
|
||||
#endif // WXWIN_COMPATIBILITY_2_8
|
||||
|
||||
protected:
|
||||
void Init()
|
||||
{
|
||||
m_backgroundBrush = NULL;
|
||||
}
|
||||
|
||||
virtual void DoSetBackgroundBitmap(const wxBitmap& bmp);
|
||||
virtual WXHBRUSH MSWGetCustomBgBrush();
|
||||
|
||||
private:
|
||||
wxBrush *m_backgroundBrush;
|
||||
|
||||
wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxPanel);
|
||||
};
|
||||
|
||||
|
@@ -52,26 +52,11 @@ public:
|
||||
const wxString& name = wxPanelNameStr);
|
||||
|
||||
|
||||
// Use the given bitmap to tile the background of this panel. This bitmap
|
||||
// will show through any transparent children.
|
||||
//
|
||||
// Notice that you must not prevent the base class EVT_ERASE_BACKGROUND
|
||||
// handler from running (i.e. not to handle this event yourself) for this
|
||||
// to work.
|
||||
void SetBackgroundBitmap(const wxBitmap& bmp)
|
||||
{
|
||||
DoSetBackgroundBitmap(bmp);
|
||||
}
|
||||
|
||||
|
||||
// implementation from now on
|
||||
// --------------------------
|
||||
|
||||
virtual void InitDialog();
|
||||
|
||||
protected:
|
||||
virtual void DoSetBackgroundBitmap(const wxBitmap& bmp) = 0;
|
||||
|
||||
private:
|
||||
wxDECLARE_NO_COPY_CLASS(wxPanelBase);
|
||||
};
|
||||
|
37
include/wx/univ/custombgwin.h
Normal file
37
include/wx/univ/custombgwin.h
Normal file
@@ -0,0 +1,37 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Name: wx/univ/custombgwin.h
|
||||
// Purpose: wxUniv implementation of wxCustomBackgroundWindow.
|
||||
// Author: Vadim Zeitlin
|
||||
// Created: 2011-10-10
|
||||
// RCS-ID: $Id: wxhead.h,v 1.12 2010-04-22 12:44:51 zeitlin Exp $
|
||||
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
|
||||
// Licence: wxWindows licence
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _WX_UNIV_CUSTOMBGWIN_H_
|
||||
#define _WX_UNIV_CUSTOMBGWIN_H_
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxCustomBackgroundWindow
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
template <class W>
|
||||
class wxCustomBackgroundWindow : public W,
|
||||
public wxCustomBackgroundWindowBase
|
||||
{
|
||||
public:
|
||||
typedef W BaseWindowClass;
|
||||
|
||||
wxCustomBackgroundWindow() { }
|
||||
|
||||
protected:
|
||||
virtual void DoSetBackgroundBitmap(const wxBitmap& bmp)
|
||||
{
|
||||
// We have support for background bitmap even at the base class level.
|
||||
BaseWindowClass::SetBackground(bmp, wxALIGN_NOT, wxTILE);
|
||||
}
|
||||
|
||||
wxDECLARE_NO_COPY_TEMPLATE_CLASS(wxCustomBackgroundWindow, W);
|
||||
};
|
||||
|
||||
#endif // _WX_UNIV_CUSTOMBGWIN_H_
|
@@ -44,13 +44,6 @@ public:
|
||||
)
|
||||
#endif // WXWIN_COMPATIBILITY_2_8
|
||||
|
||||
protected:
|
||||
virtual void DoSetBackgroundBitmap(const wxBitmap& bmp)
|
||||
{
|
||||
// We have support for background bitmap even at the base class level.
|
||||
SetBackground(bmp, wxALIGN_NOT, wxTILE);
|
||||
}
|
||||
|
||||
private:
|
||||
wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxPanel);
|
||||
};
|
||||
|
Reference in New Issue
Block a user