added scrolling support to wxWindow
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/wxUNIVERSAL@8198 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -63,6 +63,7 @@ public:
|
|||||||
|
|
||||||
// background pixmap support
|
// background pixmap support
|
||||||
// -------------------------
|
// -------------------------
|
||||||
|
|
||||||
virtual void SetBackground(const wxBitmap& bitmap,
|
virtual void SetBackground(const wxBitmap& bitmap,
|
||||||
int alignment = wxALIGN_CENTRE,
|
int alignment = wxALIGN_CENTRE,
|
||||||
wxStretch stretch = wxSTRETCH_NOT);
|
wxStretch stretch = wxSTRETCH_NOT);
|
||||||
@@ -74,9 +75,9 @@ public:
|
|||||||
// instead of the native ones
|
// instead of the native ones
|
||||||
// ------------------------------------------------------------------
|
// ------------------------------------------------------------------
|
||||||
|
|
||||||
virtual void SetScrollbar( int orient,
|
virtual void SetScrollbar(int orient,
|
||||||
int pos,
|
int pos,
|
||||||
int thumbVisible,
|
int page,
|
||||||
int range,
|
int range,
|
||||||
bool refresh = TRUE );
|
bool refresh = TRUE );
|
||||||
virtual void SetScrollPos( int orient, int pos, bool refresh = TRUE );
|
virtual void SetScrollPos( int orient, int pos, bool refresh = TRUE );
|
||||||
@@ -103,7 +104,14 @@ protected:
|
|||||||
// common part of all ctors
|
// common part of all ctors
|
||||||
void Init();
|
void Init();
|
||||||
|
|
||||||
|
// overridden base class virtuals
|
||||||
|
|
||||||
|
// we deal with the scrollbars in these functions
|
||||||
|
virtual void DoSetClientSize(int width, int height);
|
||||||
|
virtual void DoGetClientSize(int *width, int *height) const;
|
||||||
|
|
||||||
// event handlers
|
// event handlers
|
||||||
|
void OnSize(wxSizeEvent& event);
|
||||||
void OnPaint(wxPaintEvent& event);
|
void OnPaint(wxPaintEvent& event);
|
||||||
void OnErase(wxEraseEvent& event);
|
void OnErase(wxEraseEvent& event);
|
||||||
|
|
||||||
@@ -120,6 +128,15 @@ protected:
|
|||||||
// adjust the size of the window to take into account its borders
|
// adjust the size of the window to take into account its borders
|
||||||
wxSize AdjustSize(const wxSize& size) const;
|
wxSize AdjustSize(const wxSize& size) const;
|
||||||
|
|
||||||
|
// get the scrollbar (may be NULL) for the given orientation
|
||||||
|
wxScrollBar *GetScrollbar(int orient) const
|
||||||
|
{
|
||||||
|
return orient & wxVERTICAL ? m_scrollbarVert : m_scrollbarHorz;
|
||||||
|
}
|
||||||
|
|
||||||
|
// put the scrollbars along the edges of the window
|
||||||
|
void PositionScrollbars();
|
||||||
|
|
||||||
// background bitmap info
|
// background bitmap info
|
||||||
wxBitmap m_bitmapBg;
|
wxBitmap m_bitmapBg;
|
||||||
int m_alignBgBitmap;
|
int m_alignBgBitmap;
|
||||||
|
@@ -37,6 +37,7 @@
|
|||||||
#include "wx/bmpbuttn.h"
|
#include "wx/bmpbuttn.h"
|
||||||
#include "wx/button.h"
|
#include "wx/button.h"
|
||||||
#include "wx/scrolbar.h"
|
#include "wx/scrolbar.h"
|
||||||
|
#include "wx/scrolwin.h"
|
||||||
#include "wx/statbox.h"
|
#include "wx/statbox.h"
|
||||||
#include "wx/stattext.h"
|
#include "wx/stattext.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -236,11 +237,26 @@ MyUnivFrame::MyUnivFrame(const wxString& title)
|
|||||||
new wxStaticBitmap(this, -1, wxBITMAP(tip), wxPoint(50, 350),
|
new wxStaticBitmap(this, -1, wxBITMAP(tip), wxPoint(50, 350),
|
||||||
wxDefaultSize, wxSUNKEN_BORDER);
|
wxDefaultSize, wxSUNKEN_BORDER);
|
||||||
|
|
||||||
|
#if 0
|
||||||
wxScrollBar *sb;
|
wxScrollBar *sb;
|
||||||
sb = new wxScrollBar(this, -1, wxPoint(200, 300), wxSize(300, -1));
|
sb = new wxScrollBar(this, -1, wxPoint(200, 300), wxSize(300, -1));
|
||||||
sb->SetScrollbar(0, 10, 100, 10);
|
sb->SetScrollbar(0, 10, 100, 10);
|
||||||
sb = new wxScrollBar(this, -1, wxPoint(200, 330), wxSize(-1, 150), wxSB_VERTICAL);
|
sb = new wxScrollBar(this, -1, wxPoint(200, 330), wxSize(-1, 150), wxSB_VERTICAL);
|
||||||
sb->SetScrollbar(50, 50, 100, 10);
|
sb->SetScrollbar(50, 50, 100, 10);
|
||||||
|
#elif 1
|
||||||
|
wxWindow *win = new wxWindow(this, -1,
|
||||||
|
wxPoint(200, 300),
|
||||||
|
wxSize(300, 150),
|
||||||
|
wxSUNKEN_BORDER);
|
||||||
|
win->SetScrollbar(wxHORIZONTAL, 0, 10, 30);
|
||||||
|
win->SetScrollbar(wxVERTICAL, 0, 5, 30);
|
||||||
|
#else
|
||||||
|
wxScrolledWindow *win = new wxScrolledWindow(this, -1,
|
||||||
|
wxPoint(200, 300),
|
||||||
|
wxSize(300, 150),
|
||||||
|
wxSUNKEN_BORDER);
|
||||||
|
win->SetScrollbars(10, 5, 30, 30, 15, 15);
|
||||||
|
#endif
|
||||||
|
|
||||||
new wxButton(this, -1, wxBITMAP(open), _T("&Open..."), wxPoint(10, 420));
|
new wxButton(this, -1, wxBITMAP(open), _T("&Open..."), wxPoint(10, 420));
|
||||||
|
|
||||||
|
@@ -768,7 +768,9 @@ gint gtk_window_event_event_callback( GtkWidget *widget,
|
|||||||
/* This callback is a complete replacement of the gtk_pizza_draw() function,
|
/* This callback is a complete replacement of the gtk_pizza_draw() function,
|
||||||
which disabled. */
|
which disabled. */
|
||||||
|
|
||||||
static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxWindowGTK *win )
|
static void gtk_window_draw_callback( GtkWidget *widget,
|
||||||
|
GdkRectangle *rect,
|
||||||
|
wxWindow *win )
|
||||||
{
|
{
|
||||||
DEBUG_MAIN_THREAD
|
DEBUG_MAIN_THREAD
|
||||||
|
|
||||||
@@ -801,7 +803,8 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW
|
|||||||
|
|
||||||
win->m_clipPaintRegion = TRUE;
|
win->m_clipPaintRegion = TRUE;
|
||||||
|
|
||||||
wxEraseEvent eevent( win->GetId() );
|
wxClientDC dc(win);
|
||||||
|
wxEraseEvent eevent( win->GetId(), &dc );
|
||||||
eevent.SetEventObject( win );
|
eevent.SetEventObject( win );
|
||||||
win->GetEventHandler()->ProcessEvent(eevent);
|
win->GetEventHandler()->ProcessEvent(eevent);
|
||||||
|
|
||||||
|
@@ -768,7 +768,9 @@ gint gtk_window_event_event_callback( GtkWidget *widget,
|
|||||||
/* This callback is a complete replacement of the gtk_pizza_draw() function,
|
/* This callback is a complete replacement of the gtk_pizza_draw() function,
|
||||||
which disabled. */
|
which disabled. */
|
||||||
|
|
||||||
static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxWindowGTK *win )
|
static void gtk_window_draw_callback( GtkWidget *widget,
|
||||||
|
GdkRectangle *rect,
|
||||||
|
wxWindow *win )
|
||||||
{
|
{
|
||||||
DEBUG_MAIN_THREAD
|
DEBUG_MAIN_THREAD
|
||||||
|
|
||||||
@@ -801,7 +803,8 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW
|
|||||||
|
|
||||||
win->m_clipPaintRegion = TRUE;
|
win->m_clipPaintRegion = TRUE;
|
||||||
|
|
||||||
wxEraseEvent eevent( win->GetId() );
|
wxClientDC dc(win);
|
||||||
|
wxEraseEvent eevent( win->GetId(), &dc );
|
||||||
eevent.SetEventObject( win );
|
eevent.SetEventObject( win );
|
||||||
win->GetEventHandler()->ProcessEvent(eevent);
|
win->GetEventHandler()->ProcessEvent(eevent);
|
||||||
|
|
||||||
|
@@ -77,12 +77,7 @@ bool wxScrollBar::Create(wxWindow *parent,
|
|||||||
if ( !wxControl::Create(parent, id, pos, size, style, wxDefaultValidator, name) )
|
if ( !wxControl::Create(parent, id, pos, size, style, wxDefaultValidator, name) )
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if ( size.x == -1 || size.y == -1 )
|
SetBestSize(size);
|
||||||
{
|
|
||||||
wxSize sizeBest = DoGetBestSize();
|
|
||||||
SetSize(size.x == -1 ? sizeBest.x : size.x,
|
|
||||||
size.y == -1 ? sizeBest.y : size.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@@ -33,6 +33,7 @@
|
|||||||
#include "wx/window.h"
|
#include "wx/window.h"
|
||||||
#include "wx/dcclient.h"
|
#include "wx/dcclient.h"
|
||||||
#include "wx/event.h"
|
#include "wx/event.h"
|
||||||
|
#include "wx/scrolbar.h"
|
||||||
#endif // WX_PRECOMP
|
#endif // WX_PRECOMP
|
||||||
|
|
||||||
#include "wx/univ/renderer.h"
|
#include "wx/univ/renderer.h"
|
||||||
@@ -49,6 +50,8 @@
|
|||||||
IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxWindowBase)
|
IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxWindowBase)
|
||||||
|
|
||||||
BEGIN_EVENT_TABLE(wxWindow, wxWindowBase)
|
BEGIN_EVENT_TABLE(wxWindow, wxWindowBase)
|
||||||
|
EVT_SIZE(wxWindow::OnSize)
|
||||||
|
|
||||||
EVT_PAINT(wxWindow::OnPaint)
|
EVT_PAINT(wxWindow::OnPaint)
|
||||||
EVT_ERASE_BACKGROUND(wxWindow::OnErase)
|
EVT_ERASE_BACKGROUND(wxWindow::OnErase)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
@@ -197,6 +200,16 @@ int wxWindow::GetStateFlags() const
|
|||||||
// size
|
// size
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void wxWindow::OnSize(wxSizeEvent& event)
|
||||||
|
{
|
||||||
|
if ( m_scrollbarVert || m_scrollbarHorz )
|
||||||
|
{
|
||||||
|
PositionScrollbars();
|
||||||
|
}
|
||||||
|
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
wxSize wxWindow::AdjustSize(const wxSize& size) const
|
wxSize wxWindow::AdjustSize(const wxSize& size) const
|
||||||
{
|
{
|
||||||
wxSize sz = size;
|
wxSize sz = size;
|
||||||
@@ -204,36 +217,98 @@ wxSize wxWindow::AdjustSize(const wxSize& size) const
|
|||||||
return sz;
|
return sz;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxWindow::DoSetClientSize(int width, int height)
|
||||||
|
{
|
||||||
|
// take into account the scrollbars
|
||||||
|
if ( m_scrollbarVert )
|
||||||
|
width += m_scrollbarVert->GetSize().x;
|
||||||
|
|
||||||
|
if ( m_scrollbarHorz )
|
||||||
|
height += m_scrollbarHorz->GetSize().y;
|
||||||
|
|
||||||
|
wxWindowNative::DoSetClientSize(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWindow::DoGetClientSize(int *width, int *height) const
|
||||||
|
{
|
||||||
|
wxWindowNative::DoGetClientSize(width, height);
|
||||||
|
|
||||||
|
if ( width && m_scrollbarVert )
|
||||||
|
*width -= m_scrollbarVert->GetSize().x;
|
||||||
|
|
||||||
|
if ( height && m_scrollbarHorz )
|
||||||
|
*height -= m_scrollbarHorz->GetSize().y;
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// scrolling
|
// scrolling: we implement it entirely ourselves except for ScrollWindow()
|
||||||
|
// function which is supposed to be (efficiently) implemented by the native
|
||||||
|
// window class
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void wxWindow::PositionScrollbars()
|
||||||
|
{
|
||||||
|
wxCoord x, y;
|
||||||
|
DoGetSize(&x, &y);
|
||||||
|
|
||||||
|
int width = m_scrollbarVert ? m_scrollbarVert->GetSize().x : 0;
|
||||||
|
int height = m_scrollbarHorz ? m_scrollbarHorz->GetSize().y : 0;
|
||||||
|
|
||||||
|
if ( m_scrollbarVert )
|
||||||
|
m_scrollbarVert->SetSize(x - width, 0, width, y - height);
|
||||||
|
if ( m_scrollbarHorz )
|
||||||
|
m_scrollbarHorz->SetSize(0, y - height, x - width, height);
|
||||||
|
}
|
||||||
|
|
||||||
void wxWindow::SetScrollbar(int orient,
|
void wxWindow::SetScrollbar(int orient,
|
||||||
int pos,
|
int pos,
|
||||||
int thumb,
|
int thumb,
|
||||||
int range,
|
int range,
|
||||||
bool refresh)
|
bool refresh)
|
||||||
{
|
{
|
||||||
return wxWindowNative::SetScrollbar(orient, pos, thumb, range, refresh);
|
wxScrollBar *scrollbar = GetScrollbar(orient);
|
||||||
|
if ( !scrollbar )
|
||||||
|
{
|
||||||
|
// create it
|
||||||
|
scrollbar = new wxScrollBar(this, -1,
|
||||||
|
wxDefaultPosition, wxDefaultSize,
|
||||||
|
orient & wxVERTICAL ? wxSB_VERTICAL
|
||||||
|
: wxSB_HORIZONTAL);
|
||||||
|
if ( orient & wxVERTICAL )
|
||||||
|
m_scrollbarVert = scrollbar;
|
||||||
|
else
|
||||||
|
m_scrollbarHorz = scrollbar;
|
||||||
|
|
||||||
|
PositionScrollbars();
|
||||||
|
}
|
||||||
|
|
||||||
|
scrollbar->SetScrollbar(pos, thumb, range, thumb, refresh);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWindow::SetScrollPos(int orient, int pos, bool refresh)
|
void wxWindow::SetScrollPos(int orient, int pos, bool refresh)
|
||||||
{
|
{
|
||||||
return wxWindowNative::SetScrollPos(orient, pos, refresh);
|
wxScrollBar *scrollbar = GetScrollbar(orient);
|
||||||
|
wxCHECK_RET( scrollbar, _T("no scrollbar to set position for") );
|
||||||
|
|
||||||
|
scrollbar->SetThumbPosition(pos);
|
||||||
|
if ( refresh )
|
||||||
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxWindow::GetScrollPos(int orient) const
|
int wxWindow::GetScrollPos(int orient) const
|
||||||
{
|
{
|
||||||
return wxWindowNative::GetScrollPos(orient);
|
wxScrollBar *scrollbar = GetScrollbar(orient);
|
||||||
|
return scrollbar ? scrollbar->GetThumbPosition() : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxWindow::GetScrollThumb(int orient) const
|
int wxWindow::GetScrollThumb(int orient) const
|
||||||
{
|
{
|
||||||
return wxWindowNative::GetScrollThumb(orient);
|
wxScrollBar *scrollbar = GetScrollbar(orient);
|
||||||
|
return scrollbar ? scrollbar->GetThumbSize() : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxWindow::GetScrollRange(int orient) const
|
int wxWindow::GetScrollRange(int orient) const
|
||||||
{
|
{
|
||||||
return wxWindowNative::GetScrollRange(orient);
|
wxScrollBar *scrollbar = GetScrollbar(orient);
|
||||||
|
return scrollbar ? scrollbar->GetRange() : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user