Added various missing bits to scrolling wxCanvas.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8275 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -281,6 +281,7 @@ private:
|
||||
void OnIdle( wxIdleEvent &event );
|
||||
void OnSetFocus( wxFocusEvent &event );
|
||||
void OnKillFocus( wxFocusEvent &event );
|
||||
void OnEraseBackground( wxEraseEvent &event );
|
||||
|
||||
private:
|
||||
DECLARE_CLASS(wxCanvas)
|
||||
|
@@ -155,7 +155,7 @@ MyFrame::MyFrame()
|
||||
|
||||
m_canvas = new wxCanvas( this, -1, wxPoint(0,0), wxSize(10,10) );
|
||||
|
||||
m_canvas->SetArea( 400, 600 );
|
||||
m_canvas->SetArea( 1400, 600 );
|
||||
m_canvas->SetColour( 255, 255, 255 );
|
||||
|
||||
wxBitmap bitmap( smile_xpm );
|
||||
@@ -163,7 +163,7 @@ MyFrame::MyFrame()
|
||||
|
||||
m_sm1 = new wxCanvasImage( image, 0,70,16,16 );
|
||||
m_canvas->Append( m_sm1 );
|
||||
|
||||
|
||||
int i;
|
||||
for (i = 10; i < 300; i+=10)
|
||||
m_canvas->Append( new wxCanvasRect( i,50,3,140, 255,0,0 ) );
|
||||
@@ -186,12 +186,12 @@ MyFrame::MyFrame()
|
||||
for (i = 10; i < 300; i+=10)
|
||||
m_canvas->Append( new wxCanvasLine( 10,-15,i,300, 0,255,0 ) );
|
||||
|
||||
// m_canvas->Append( new wxCanvasLine( 10,-1500e6,50,300000e6, 0,255,0 ) );
|
||||
// m_canvas->Append( new wxCanvasLine( 10,-150000,50,300000, 0,255,0 ) );
|
||||
|
||||
m_sm4 = new MywxCanvasImage( image, 0,270,64,32 );
|
||||
m_canvas->Append( m_sm4 );
|
||||
|
||||
// m_canvas->Append( new wxCanvasLine( 10,-1500e6,50,300000e6, 0,255,0 ) );
|
||||
// m_canvas->Append( new wxCanvasLine( 10,-150000,50,300000, 0,255,0 ) );
|
||||
|
||||
m_log = new wxTextCtrl( this, -1, "", wxPoint(0,0), wxSize(100,100), wxTE_MULTILINE );
|
||||
wxLog *old_log = wxLog::SetActiveTarget( new wxLogTextCtrl( m_log ) );
|
||||
delete old_log;
|
||||
|
@@ -218,7 +218,7 @@ void wxCanvasLine::Render( int clip_x, int clip_y, int clip_width, int clip_heig
|
||||
wxImage *image = m_owner->GetBuffer();
|
||||
int buffer_x = m_owner->GetBufferX();
|
||||
int buffer_y = m_owner->GetBufferY();
|
||||
|
||||
|
||||
if ((m_area.width == 0) && (m_area.height == 0))
|
||||
{
|
||||
image->SetRGB( m_area.x-buffer_x, m_area.y-buffer_y, m_red, m_green, m_blue );
|
||||
@@ -248,8 +248,8 @@ void wxCanvasLine::Render( int clip_x, int clip_y, int clip_width, int clip_heig
|
||||
|
||||
while (ii != x1)
|
||||
{
|
||||
if ((ii >= clip_x) && (ii <= clip_x+clip_width) &&
|
||||
(jj >= clip_y) && (jj <= clip_y+clip_height))
|
||||
if ((ii >= clip_x) && (ii < clip_x+clip_width) &&
|
||||
(jj >= clip_y) && (jj < clip_y+clip_height))
|
||||
{
|
||||
image->SetRGB( ii-buffer_x, jj-buffer_y, m_red, m_blue, m_green );
|
||||
}
|
||||
@@ -269,8 +269,8 @@ void wxCanvasLine::Render( int clip_x, int clip_y, int clip_width, int clip_heig
|
||||
|
||||
while (jj != y1)
|
||||
{
|
||||
if ((ii >= clip_x) && (ii <= clip_x+clip_width) &&
|
||||
(jj >= clip_y) && (jj <= clip_y+clip_height))
|
||||
if ((ii >= clip_x) && (ii < clip_x+clip_width) &&
|
||||
(jj >= clip_y) && (jj < clip_y+clip_height))
|
||||
{
|
||||
image->SetRGB( ii-buffer_x, jj-buffer_y, m_red, m_blue, m_green );
|
||||
}
|
||||
@@ -555,6 +555,7 @@ BEGIN_EVENT_TABLE(wxCanvas,wxScrolledWindow)
|
||||
EVT_MOUSE_EVENTS( wxCanvas::OnMouse )
|
||||
EVT_SET_FOCUS( wxCanvas::OnSetFocus )
|
||||
EVT_KILL_FOCUS( wxCanvas::OnKillFocus )
|
||||
EVT_ERASE_BACKGROUND( wxCanvas::OnEraseBackground )
|
||||
END_EVENT_TABLE()
|
||||
|
||||
wxCanvas::wxCanvas( wxWindow *parent, wxWindowID id,
|
||||
@@ -597,6 +598,8 @@ void wxCanvas::SetColour( unsigned char red, unsigned char green, unsigned char
|
||||
m_green = green;
|
||||
m_blue = blue;
|
||||
|
||||
SetBackgroundColour( wxColour( red, green, blue ) );
|
||||
|
||||
if (m_frozen) return;
|
||||
|
||||
unsigned char *data = m_buffer.GetData();
|
||||
@@ -803,6 +806,8 @@ void wxCanvas::BlitBuffer( wxDC &dc )
|
||||
|
||||
void wxCanvas::UpdateNow()
|
||||
{
|
||||
if (m_frozen) return;
|
||||
|
||||
if (!m_needUpdate) return;
|
||||
|
||||
wxClientDC dc( this );
|
||||
@@ -928,8 +933,12 @@ void wxCanvas::OnPaint(wxPaintEvent &event)
|
||||
|
||||
void wxCanvas::ScrollWindow( int dx, int dy, const wxRect* rect )
|
||||
{
|
||||
// If any updates are pending, do them now since they will
|
||||
// expect the previous m_bufferX and m_bufferY values.
|
||||
UpdateNow();
|
||||
|
||||
// The buffer always starts at the top left corner of the
|
||||
// client area. Indeed, it is the client area.
|
||||
CalcUnscrolledPosition( 0, 0, &m_bufferX, &m_bufferY );
|
||||
|
||||
unsigned char* data = m_buffer.GetData();
|
||||
@@ -943,6 +952,9 @@ void wxCanvas::ScrollWindow( int dx, int dy, const wxRect* rect )
|
||||
size_t count = (size_t) (m_buffer.GetWidth() * 3 * (m_buffer.GetHeight()-dy));
|
||||
memmove( dest, source, count );
|
||||
|
||||
// We update the new buffer area, but there is no need to
|
||||
// blit (last param FALSE) since the ensuing paint event will
|
||||
// do that anyway.
|
||||
Update( m_bufferX, m_bufferY, m_buffer.GetWidth(), dy, FALSE );
|
||||
}
|
||||
else
|
||||
@@ -952,12 +964,45 @@ void wxCanvas::ScrollWindow( int dx, int dy, const wxRect* rect )
|
||||
size_t count = (size_t) (m_buffer.GetWidth() * 3 * (m_buffer.GetHeight()+dy));
|
||||
memmove( dest, source, count );
|
||||
|
||||
// We update the new buffer area, but there is no need to
|
||||
// blit (last param FALSE) since the ensuing paint event will
|
||||
// do that anyway.
|
||||
Update( m_bufferX, m_bufferY+m_buffer.GetHeight()+dy, m_buffer.GetWidth(), -dy, FALSE );
|
||||
}
|
||||
}
|
||||
|
||||
if (dx != 0)
|
||||
{
|
||||
if (dx > 0)
|
||||
{
|
||||
unsigned char *source = data;
|
||||
for (int y = 0; y < m_buffer.GetHeight(); y++)
|
||||
{
|
||||
unsigned char *dest = source + dx*3;
|
||||
memmove( dest, source, (m_buffer.GetWidth()-dx) * 3 );
|
||||
source += m_buffer.GetWidth()*3;
|
||||
}
|
||||
|
||||
// We update the new buffer area, but there is no need to
|
||||
// blit (last param FALSE) since the ensuing paint event will
|
||||
// do that anyway.
|
||||
Update( m_bufferX, m_bufferY, dx, m_buffer.GetHeight(), FALSE );
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned char *dest = data;
|
||||
for (int y = 0; y < m_buffer.GetHeight(); y++)
|
||||
{
|
||||
unsigned char *source = dest - dx*3;
|
||||
memmove( dest, source, (m_buffer.GetWidth()+dx) * 3 );
|
||||
dest += m_buffer.GetWidth()*3;
|
||||
}
|
||||
|
||||
// We update the new buffer area, but there is no need to
|
||||
// blit (last param FALSE) since the ensuing paint event will
|
||||
// do that anyway.
|
||||
Update( m_bufferX+m_buffer.GetWidth()+dx, m_bufferY, -dx, m_buffer.GetHeight(), FALSE );
|
||||
}
|
||||
}
|
||||
|
||||
wxWindow::ScrollWindow( dx, dy, rect );
|
||||
@@ -1096,6 +1141,10 @@ void wxCanvas::OnChar(wxKeyEvent &event)
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
void wxCanvas::OnEraseBackground(wxEraseEvent &event)
|
||||
{
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// wxCanvasModule
|
||||
//--------------------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user