void UseBuffer(bool useBuffer) { m_useBuffer = useBuffer; Refresh(); }
bool UsesBuffer() const { return m_useBuffer; }
+ void EraseBgInPaint(bool erase) { m_eraseBgInPaint = erase; Refresh(); }
+
private:
void OnPaint( wxPaintEvent &event );
void OnChar( wxKeyEvent &event );
// use wxMemoryDC in OnPaint()?
bool m_useBuffer;
+ // erase background in OnPaint()?
+ bool m_eraseBgInPaint;
+
DECLARE_EVENT_TABLE()
};
private:
void OnUseBuffer(wxCommandEvent& event);
+ void OnEraseBgInPaint(wxCommandEvent& event);
void OnChangeBgStyle(wxCommandEvent& event);
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
{
// menu items
Erase_Menu_UseBuffer = 100,
+ Erase_Menu_EraseBgInPaint,
Erase_Menu_BgStyleErase,
Erase_Menu_BgStyleSystem,
Erase_Menu_BgStylePaint,
// ----------------------------------------------------------------------------
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
- EVT_MENU(Erase_Menu_UseBuffer, MyFrame::OnUseBuffer)
+ EVT_MENU(Erase_Menu_UseBuffer, MyFrame::OnUseBuffer)
+ EVT_MENU(Erase_Menu_EraseBgInPaint, MyFrame::OnEraseBgInPaint)
EVT_MENU_RANGE(Erase_Menu_BgStyleErase, Erase_Menu_BgStylePaint,
MyFrame::OnChangeBgStyle)
wxMenu *menuFile = new wxMenu("", wxMENU_TEAROFF);
menuFile->AppendCheckItem(Erase_Menu_UseBuffer, "&Use memory DC\tCtrl-M");
+ menuFile->AppendCheckItem(Erase_Menu_EraseBgInPaint,
+ "&Erase background in EVT_PAINT\tCtrl-R");
menuFile->AppendSeparator();
menuFile->AppendRadioItem(Erase_Menu_BgStyleErase,
"Use wxBG_STYLE_&ERASE\tCtrl-E");
m_canvas->UseBuffer(event.IsChecked());
}
+void MyFrame::OnEraseBgInPaint(wxCommandEvent& event)
+{
+ m_canvas->EraseBgInPaint(event.IsChecked());
+}
+
void MyFrame::OnChangeBgStyle(wxCommandEvent& event)
{
int style = wxBG_STYLE_ERASE + event.GetId() - Erase_Menu_BgStyleErase;
: wxScrolledWindow(parent, wxID_ANY)
{
m_useBuffer = false;
+ m_eraseBgInPaint = false;
SetScrollbars( 10, 10, 40, 100, 0, 0 );
void MyCanvas::DoPaint(wxDC& dc)
{
+ if ( m_eraseBgInPaint )
+ {
+ dc.SetBackground(*wxLIGHT_GREY);
+ dc.Clear();
+
+ dc.DrawText("Background erased in OnPaint", 65, 110);
+ }
+ else if ( GetBackgroundStyle() == wxBG_STYLE_PAINT )
+ {
+ dc.SetTextForeground(*wxRED);
+ dc.DrawText("You must enable erasing background in OnPaint to avoid "
+ "display corruption", 65, 110);
+ }
+
dc.SetBrush( *wxBLACK_BRUSH );
dc.DrawRectangle( 10,10,60,50 );
BEGIN_EVENT_TABLE(wxWindowMSW, wxWindowBase)
EVT_SYS_COLOUR_CHANGED(wxWindowMSW::OnSysColourChanged)
- EVT_ERASE_BACKGROUND(wxWindowMSW::OnEraseBackground)
#ifdef __WXWINCE__
EVT_INIT_DIALOG(wxWindowMSW::OnInitDialog)
#endif
}
bool wxWindowMSW::HandleEraseBkgnd(WXHDC hdc)
-{
- wxDCTemp dc(hdc, GetClientSize());
- wxDCTempImpl *impl = (wxDCTempImpl*) dc.GetImpl();
-
- impl->SetHDC(hdc);
- impl->SetWindow((wxWindow *)this);
-
- wxEraseEvent event(m_windowId, &dc);
- event.SetEventObject(this);
- bool rc = HandleWindowEvent(event);
-
- // must be called manually as ~wxDC doesn't do anything for wxDCTemp
- impl->SelectOldObjects(hdc);
-
- return rc;
-}
-
-void wxWindowMSW::OnEraseBackground(wxEraseEvent& event)
{
// standard non top level controls (i.e. except the dialogs) always erase
// their background themselves in HandleCtlColor() or have some control-
// specific ways to set the colours (common controls)
if ( IsOfStandardClass() && !IsTopLevel() )
- {
- event.Skip();
- return;
- }
+ return false;
- if ( GetBackgroundStyle() == wxBG_STYLE_CUSTOM )
+ switch ( GetBackgroundStyle() )
{
- // don't skip the event here, custom background means that the app
- // is drawing it itself in its OnPaint(), so don't draw it at all
- // now to avoid flicker
- return;
- }
+ case wxBG_STYLE_ERASE:
+ // we need to generate an erase background event
+ {
+ wxDCTemp dc(hdc, GetClientSize());
+ wxDCTempImpl *impl = (wxDCTempImpl*) dc.GetImpl();
- wxDC *dc = event.GetDC();
- if (!dc) return;
- wxMSWDCImpl *impl = (wxMSWDCImpl*) dc->GetImpl();
+ impl->SetHDC(hdc);
+ impl->SetWindow((wxWindow *)this);
- // do default background painting
- if ( !DoEraseBackground(GetHdcOf(*impl)) )
- {
- // let the system paint the background
- event.Skip();
+ wxEraseEvent event(m_windowId, &dc);
+ event.SetEventObject(this);
+ bool rc = HandleWindowEvent(event);
+
+ // must be called manually as ~wxDC doesn't do anything for
+ // wxDCTemp
+ impl->SelectOldObjects(hdc);
+
+ if ( rc )
+ {
+ // background erase by the user-defined handler
+ return true;
+ }
+ }
+ // fall through
+
+ case wxBG_STYLE_SYSTEM:
+ if ( !DoEraseBackground(hdc) )
+ {
+ // let the default processing to take place if we didn't erase
+ // the background ourselves
+ return false;
+ }
+ break;
+
+ case wxBG_STYLE_PAINT:
+ // no need to do anything here at all, background will be entirely
+ // redrawn in WM_PAINT handler
+ break;
+
+ default:
+ wxFAIL_MSG( "unknown background style" );
}
+
+ return true;
}
bool wxWindowMSW::DoEraseBackground(WXHDC hDC)