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:
@@ -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,15 +288,39 @@ 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();
|
||||
const wxSize size = GetClientSize();
|
||||
for ( int x = 0; x < size.x; x += 10 )
|
||||
{
|
||||
dc.DrawLine(x, 0, x, size.y);
|
||||
|
Reference in New Issue
Block a user