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