added test for Blit()ting OnEraseBackground() results in OnPaint()

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31979 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2005-02-13 01:14:36 +00:00
parent 2458d90b1d
commit 79c5fe4be8

View File

@@ -54,35 +54,46 @@ public:
};
class MyFrame : public wxFrame
{
public:
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
private:
DECLARE_EVENT_TABLE()
};
class MyCanvas : public wxScrolledWindow
{
public:
MyCanvas( MyFrame *parent );
MyCanvas( wxFrame *parent );
void UseBuffer(bool useBuffer) { m_useBuffer = useBuffer; Refresh(); }
private:
void OnPaint( wxPaintEvent &event );
void OnChar( wxKeyEvent &event );
void OnEraseBackground( wxEraseEvent &event );
void DoPaint(wxDC& dc);
wxBitmap m_bitmap;
wxString m_text;
private:
// use wxMemoryDC in OnPaint()?
bool m_useBuffer;
DECLARE_EVENT_TABLE()
};
class MyFrame : public wxFrame
{
public:
MyFrame();
void OnUseBuffer(wxCommandEvent& event);
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
private:
MyCanvas *m_canvas;
DECLARE_EVENT_TABLE()
};
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
@@ -90,7 +101,9 @@ private:
enum
{
// menu items
ID_MENU_QUIT = 1,
Erase_Menu_UseBuffer = 100,
Erase_Menu_Exit = wxID_EXIT,
Erase_Menu_About = wxID_ABOUT
};
@@ -102,8 +115,7 @@ IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
MyFrame *frame = new MyFrame(_T("Erase sample"),
wxPoint(50, 50), wxSize(450, 340));
MyFrame *frame = new MyFrame;
frame->Show(true);
@@ -115,22 +127,26 @@ bool MyApp::OnInit()
// ----------------------------------------------------------------------------
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_MENU_QUIT, MyFrame::OnQuit)
EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
EVT_MENU(Erase_Menu_UseBuffer, MyFrame::OnUseBuffer)
EVT_MENU(Erase_Menu_Exit, MyFrame::OnQuit)
EVT_MENU(Erase_Menu_About, MyFrame::OnAbout)
END_EVENT_TABLE()
// frame constructor
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame((wxFrame *)NULL, wxID_ANY, title, pos, size)
MyFrame::MyFrame()
: wxFrame(NULL, wxID_ANY, _T("Erase sample"),
wxPoint(50, 50), wxSize(450, 340))
{
SetIcon(wxICON(mondrian));
wxMenu *menuFile = new wxMenu(_T(""), wxMENU_TEAROFF);
menuFile->AppendCheckItem(Erase_Menu_UseBuffer, _T("&Use memory DC\tCtrl-M"));
menuFile->AppendSeparator();
menuFile->Append(Erase_Menu_Exit, _T("E&xit\tAlt-X"), _T("Quit this program"));
wxMenu *helpMenu = new wxMenu;
helpMenu->Append(wxID_ABOUT, _T("&About...\tCtrl-A"), _T("Show about dialog"));
menuFile->Append(ID_MENU_QUIT, _T("E&xit\tAlt-X"), _T("Quit this program"));
helpMenu->Append(Erase_Menu_About, _T("&About...\tCtrl-A"), _T("Show about dialog"));
wxMenuBar *menuBar = new wxMenuBar();
menuBar->Append(menuFile, _T("&File"));
@@ -144,10 +160,15 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
SetStatusText(_T("Welcome to wxWidgets erase sample!"));
#endif // wxUSE_STATUSBAR
(void)new MyCanvas( this );
m_canvas = new MyCanvas( this );
}
void MyFrame::OnUseBuffer(wxCommandEvent& event)
{
m_canvas->UseBuffer(event.IsChecked());
}
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
Close(true);
@@ -166,12 +187,12 @@ BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
EVT_ERASE_BACKGROUND( MyCanvas::OnEraseBackground)
END_EVENT_TABLE()
MyCanvas::MyCanvas( MyFrame *parent )
MyCanvas::MyCanvas( wxFrame *parent )
: wxScrolledWindow( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize,
wxScrolledWindowStyle |
wxNO_FULL_REPAINT_ON_RESIZE|
wxSUNKEN_BORDER )
wxScrolledWindowStyle | wxSUNKEN_BORDER )
{
m_useBuffer = false;
SetScrollbars( 10, 10, 40, 100, 0, 0 );
m_bitmap = wxBitmap( wxICON(mondrian) );
@@ -200,14 +221,10 @@ void MyCanvas::OnChar( wxKeyEvent &event )
case WXK_RETURN: m_text += wxT( "<ENTER>" ); break;
default: m_text += (wxChar)event.m_keyCode; break;
}
}
void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
void MyCanvas::DoPaint(wxDC& dc)
{
wxPaintDC dc(this);
PrepareDC( dc );
dc.SetBrush( *wxBLACK_BRUSH );
dc.DrawRectangle( 0,0,200,50 );
@@ -271,21 +288,45 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
#endif // 0
}
void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
{
wxPaintDC dcWin(this);
PrepareDC( dcWin );
if ( m_useBuffer )
{
const wxSize size = GetClientSize();
wxMemoryDC dc;
wxBitmap bmp(size.x, size.y);
dc.SelectObject(bmp);
dc.Blit(0, 0, size.x, size.y, &dcWin, 0, 0);
dc.DrawText(_T("(copy of background)"), 5, 120 );
DoPaint(dc);
dcWin.Blit(0, 0, size.x, size.y, &dc, 0, 0);
}
else
{
DoPaint(dcWin);
}
}
void MyCanvas::OnEraseBackground( wxEraseEvent& event )
{
wxDC& dc = *event.GetDC();
dc.SetPen(*wxGREEN_PEN);
// this line is needed, otherwise the junk is left on win the background
// clear any junk currently displayed
dc.Clear();
wxSize size = GetClientSize();
for ( int x = 0; x < size.x; x+= 10 )
const wxSize size = GetClientSize();
for ( int x = 0; x < size.x; x += 10 )
{
dc.DrawLine(x, 0, x, size.y);
}
for ( int y = 0; y < size.y; y+= 10 )
for ( int y = 0; y < size.y; y += 10 )
{
dc.DrawLine(0, y, size.x, y);
}