From aae736694eebe4d291360e2acf62638314b3b02c Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Wed, 20 Mar 2002 21:36:36 +0000 Subject: [PATCH] No more pixel junk when resizing windows that use the wxNO_FULL_REPAINT_ON_RESIZE flag and which have a border. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14695 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/univ/window.h | 3 ++ src/univ/winuniv.cpp | 66 +++++++++++++++++++++++++++++++++++----- src/x11/window.cpp | 2 +- 3 files changed, 62 insertions(+), 9 deletions(-) diff --git a/include/wx/univ/window.h b/include/wx/univ/window.h index 8a53c0b34e..02b48e85eb 100644 --- a/include/wx/univ/window.h +++ b/include/wx/univ/window.h @@ -265,6 +265,9 @@ protected: wxBitmap m_bitmapBg; int m_alignBgBitmap; wxStretch m_stretchBgBitmap; + + // old size + wxSize m_oldSize; // is the mouse currently inside the window? bool m_isCurrent:1; diff --git a/src/univ/winuniv.cpp b/src/univ/winuniv.cpp index ba8e127164..83a0c68761 100644 --- a/src/univ/winuniv.cpp +++ b/src/univ/winuniv.cpp @@ -108,6 +108,9 @@ void wxWindow::Init() m_isCurrent = FALSE; m_renderer = wxTheme::Get()->GetRenderer(); + + m_oldSize.x = -1; + m_oldSize.y = -1; } bool wxWindow::Create(wxWindow *parent, @@ -446,18 +449,29 @@ int wxWindow::GetStateFlags() const void wxWindow::OnSize(wxSizeEvent& event) { + event.Skip(); + if ( m_scrollbarVert || m_scrollbarHorz ) { PositionScrollbars(); } -#if 0 +#ifndef __WXMSW__ // Refresh the area (strip) previously occupied by the border - if (HasFlag( wxNO_FULL_REPAINT_ON_RESIZE )) + if (HasFlag( wxNO_FULL_REPAINT_ON_RESIZE ) && IsShown()) { + // This code assumes that wxSizeEvent.GetSize() returns + // the area of the entire window, not just the client + // area. wxSize newSize = event.GetSize(); + if (m_oldSize.x == -1 && m_oldSize.y == -1) + { + m_oldSize = newSize; + return; + } + if (HasFlag( wxSIMPLE_BORDER )) { if (newSize.y > m_oldSize.y) @@ -465,19 +479,38 @@ void wxWindow::OnSize(wxSizeEvent& event) wxRect rect; rect.x = 0; rect.width = m_oldSize.x; - rect.y = m_oldSize.y; + rect.y = m_oldSize.y-2; rect.height = 1; Refresh( TRUE, &rect ); } + else if (newSize.y < m_oldSize.y) + { + wxRect rect; + rect.y = newSize.y; + rect.x = 0; + rect.height = 1; + rect.width = newSize.x; + wxWindowNative::Refresh( TRUE, &rect ); + } + if (newSize.x > m_oldSize.x) { wxRect rect; rect.y = 0; rect.height = m_oldSize.y; - rect.x = m_oldSize.x; + rect.x = m_oldSize.x-2; rect.width = 1; Refresh( TRUE, &rect ); } + else if (newSize.x < m_oldSize.x) + { + wxRect rect; + rect.x = newSize.x; + rect.y = 0; + rect.width = 1; + rect.height = newSize.y; + wxWindowNative::Refresh( TRUE, &rect ); + } } else if (HasFlag( wxSUNKEN_BORDER ) || HasFlag( wxRAISED_BORDER )) @@ -487,26 +520,43 @@ void wxWindow::OnSize(wxSizeEvent& event) wxRect rect; rect.x = 0; rect.width = m_oldSize.x; - rect.y = m_oldSize.y-1; + rect.y = m_oldSize.y-4; rect.height = 2; Refresh( TRUE, &rect ); } + else if (newSize.y < m_oldSize.y) + { + wxRect rect; + rect.y = newSize.y; + rect.x = 0; + rect.height = 2; + rect.width = newSize.x; + wxWindowNative::Refresh( TRUE, &rect ); + } + if (newSize.x > m_oldSize.x) { wxRect rect; rect.y = 0; rect.height = m_oldSize.y; - rect.x = m_oldSize.x-1; + rect.x = m_oldSize.x-4; rect.width = 2; Refresh( TRUE, &rect ); } + else if (newSize.x < m_oldSize.x) + { + wxRect rect; + rect.x = newSize.x; + rect.y = 0; + rect.width = 2; + rect.height = newSize.y; + wxWindowNative::Refresh( TRUE, &rect ); + } } m_oldSize = newSize; } #endif - - event.Skip(); } wxSize wxWindow::DoGetBestSize() const diff --git a/src/x11/window.cpp b/src/x11/window.cpp index b40174b341..5724880368 100644 --- a/src/x11/window.cpp +++ b/src/x11/window.cpp @@ -1054,7 +1054,7 @@ void wxWindowX11::SendEraseEvents() void wxWindowX11::SendPaintEvents() { m_clipPaintRegion = TRUE; - + wxNcPaintEvent nc_paint_event( GetId() ); nc_paint_event.SetEventObject( this ); GetEventHandler()->ProcessEvent( nc_paint_event ); -- 2.45.2