2. wxScrollBar draws almost fine under GTK git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/wxUNIVERSAL@8155 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
203 lines
7.7 KiB
C++
203 lines
7.7 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: wx/univ/renderer.h
|
|
// Purpose: wxRenderer class declaration
|
|
// Author: Vadim Zeitlin
|
|
// Modified by:
|
|
// Created: 06.08.00
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
|
|
// Licence: wxWindows license
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*
|
|
wxRenderer class is used to draw all wxWindows controls. This is an ABC and
|
|
the look of the application is determined by the concrete derivation of
|
|
wxRenderer used in the program.
|
|
*/
|
|
|
|
#ifdef __GNUG__
|
|
#pragma interface "renderer.h"
|
|
#endif
|
|
|
|
#ifndef _WX_UNIV_RENDERER_H_
|
|
#define _WX_UNIV_RENDERER_H_
|
|
|
|
class WXDLLEXPORT wxControl;
|
|
class WXDLLEXPORT wxDC;
|
|
class WXDLLEXPORT wxWindow;
|
|
|
|
#include "wx/string.h"
|
|
#include "wx/gdicmn.h"
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxRenderer: abstract renderers interface
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class WXDLLEXPORT wxRenderer
|
|
{
|
|
public:
|
|
// draw the controls background
|
|
virtual void DrawBackground(wxDC& dc,
|
|
const wxRect& rect,
|
|
int flags) = 0;
|
|
|
|
// draw the label inside the given rectangle with the specified alignment
|
|
// and optionally emphasize the character with the given index
|
|
virtual void DrawLabel(wxDC& dc,
|
|
const wxString& label,
|
|
const wxRect& rect,
|
|
int flags = 0,
|
|
int alignment = wxALIGN_LEFT | wxALIGN_TOP,
|
|
int indexAccel = -1) = 0;
|
|
|
|
// draw the border and optionally return the rectangle containing the
|
|
// region inside the border
|
|
virtual void DrawBorder(wxDC& dc,
|
|
wxBorder border,
|
|
const wxRect& rect,
|
|
int flags = 0,
|
|
wxRect *rectIn = (wxRect *)NULL) = 0;
|
|
|
|
// draw push button border and return the rectangle left for the label
|
|
virtual void DrawButtonBorder(wxDC& dc,
|
|
const wxRect& rect,
|
|
int flags = 0,
|
|
wxRect *rectIn = (wxRect *)NULL) = 0;
|
|
|
|
// draw a frame with the label (horizontal alignment can be specified)
|
|
virtual void DrawFrame(wxDC& dc,
|
|
const wxString& label,
|
|
const wxRect& rect,
|
|
int flags = 0,
|
|
int alignment = wxALIGN_LEFT,
|
|
int indexAccel = -1) = 0;
|
|
|
|
// draw an arrow in the given direction
|
|
virtual void DrawArrow(wxDC& dc,
|
|
wxDirection dir,
|
|
const wxRect& rect,
|
|
int flags = 0) = 0;
|
|
|
|
// draw a scrollbar: thumb positions are in percent of the full scrollbar
|
|
// length
|
|
virtual void DrawScrollbar(wxDC& dc,
|
|
wxOrientation orient,
|
|
int thumbPosStart,
|
|
int thumbPosEnd,
|
|
const wxRect& rect,
|
|
int flags = 0,
|
|
int extraFlags = 0) = 0;
|
|
|
|
// TODO: having this is ugly but I don't see how to solve GetBestSize()
|
|
// problem without something like this
|
|
|
|
// adjust the size of the control of the given class: for most controls,
|
|
// this just takes into account the border, but for some (buttons, for
|
|
// example) it is more complicated - the result being, in any case, that
|
|
// the control looks "nice" if it uses the adjusted rectangle
|
|
virtual void AdjustSize(wxSize *size, const wxWindow *window) = 0;
|
|
|
|
// virtual dtor for any base class
|
|
virtual ~wxRenderer();
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxDelegateRenderer: it is impossible to inherit from any of standard
|
|
// renderers as their declarations are in private code, but you can use this
|
|
// class to override only some of the Draw() functions - all the other ones
|
|
// will be left to the original renderer
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class WXDLLEXPORT wxDelegateRenderer : public wxRenderer
|
|
{
|
|
public:
|
|
wxDelegateRenderer(wxRenderer *renderer) : m_renderer(renderer) { }
|
|
|
|
virtual void DrawBackground(wxDC& dc,
|
|
const wxRect& rect,
|
|
int flags)
|
|
{ m_renderer->DrawBackground(dc, rect, flags); }
|
|
virtual void DrawLabel(wxDC& dc,
|
|
const wxString& label,
|
|
const wxRect& rect,
|
|
int flags = 0,
|
|
int align = wxALIGN_LEFT | wxALIGN_TOP,
|
|
int indexAccel = -1)
|
|
{ m_renderer->DrawLabel(dc, label, rect, flags, align, indexAccel); }
|
|
virtual void DrawBorder(wxDC& dc,
|
|
wxBorder border,
|
|
const wxRect& rect,
|
|
int flags = 0,
|
|
wxRect *rectIn = (wxRect *)NULL)
|
|
{ m_renderer->DrawBorder(dc, border, rect, flags, rectIn); }
|
|
virtual void DrawFrame(wxDC& dc,
|
|
const wxString& label,
|
|
const wxRect& rect,
|
|
int flags = 0,
|
|
int align = wxALIGN_LEFT,
|
|
int indexAccel = -1)
|
|
{ m_renderer->DrawFrame(dc, label, rect, flags, align, indexAccel); }
|
|
virtual void DrawButtonBorder(wxDC& dc,
|
|
const wxRect& rect,
|
|
int flags = 0,
|
|
wxRect *rectIn = (wxRect *)NULL)
|
|
{ m_renderer->DrawButtonBorder(dc, rect, flags, rectIn); }
|
|
virtual void DrawArrow(wxDC& dc,
|
|
wxDirection dir,
|
|
const wxRect& rect,
|
|
int flags = 0)
|
|
{ m_renderer->DrawArrow(dc, dir, rect, flags); }
|
|
virtual void DrawScrollbar(wxDC& dc,
|
|
wxOrientation orient,
|
|
int thumbPosStart,
|
|
int thumbPosEnd,
|
|
const wxRect& rect,
|
|
int flags = 0,
|
|
int extraFlags = 0)
|
|
{ m_renderer->DrawScrollbar(dc, orient, thumbPosStart,
|
|
thumbPosEnd, rect, flags, extraFlags); }
|
|
|
|
virtual void AdjustSize(wxSize *size, const wxWindow *window)
|
|
{ m_renderer->AdjustSize(size, window); }
|
|
|
|
protected:
|
|
wxRenderer *m_renderer;
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxControlRenderer: wraps the wxRenderer functions in a form easy to use from
|
|
// OnPaint()
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class WXDLLEXPORT wxControlRenderer
|
|
{
|
|
public:
|
|
// create a renderer for this dc with this "fundamental" renderer
|
|
wxControlRenderer(wxControl *control, wxDC& dc, wxRenderer *renderer);
|
|
|
|
// operations
|
|
void DrawLabel();
|
|
void DrawBorder();
|
|
void DrawButtonBorder();
|
|
void DrawFrame();
|
|
void DrawBackgroundBitmap();
|
|
void DrawScrollbar(int thumbStart, int thumbEnd, int extraFlags = 0);
|
|
|
|
// accessors
|
|
wxRenderer *GetRenderer() const { return m_renderer; }
|
|
|
|
wxDC& GetDC() { return m_dc; }
|
|
|
|
const wxRect& GetRect() const { return m_rect; }
|
|
wxRect& GetRect() { return m_rect; }
|
|
|
|
private:
|
|
wxControl *m_ctrl;
|
|
wxRenderer *m_renderer;
|
|
wxDC& m_dc;
|
|
wxRect m_rect;
|
|
};
|
|
|
|
#endif // _WX_UNIV_RENDERER_H_
|
|
|