]> git.saurik.com Git - wxWidgets.git/commitdiff
Generate erase background events for native controls too under MSW.
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 7 Dec 2009 13:37:01 +0000 (13:37 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 7 Dec 2009 13:37:01 +0000 (13:37 +0000)
Remove the test which prevented the generation of erase background events from
wxMSW::wxWindow::HandleEraseBkgnd(). Although it is true that native controls
mostly erase background on their own, there are exceptions: we must erase the
background of wxToolBar ourselves, for example. More importantly, there is no
reason to prevent the user code from defining wxEVT_ERASE_BACKGROUND handlers
for the native controls as this works just fine under MSW (although it doesn't
under GTK nor probably other ports...). So also add a test erase background
handler to the toolbar sample to verify that this does work.

Closes #11514.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62805 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

samples/toolbar/toolbar.cpp
src/msw/window.cpp

index 7629206d39226bc035d845f86c6e27a97fe4116f..c66b6cf428ed2278039517dc16f05e285e078ba7 100644 (file)
@@ -134,6 +134,7 @@ public:
 
     void OnToolbarStyle(wxCommandEvent& event);
     void OnToolbarBgCol(wxCommandEvent& event);
+    void OnToolbarCustomBg(wxCommandEvent& event);
     void OnToolbarCustomBitmap(wxCommandEvent& event);
 
     void OnToolLeftClick(wxCommandEvent& event);
@@ -148,6 +149,8 @@ public:
         { event.Enable( m_tbar != NULL ); }
 
 private:
+    void OnEraseToolBarBackground(wxEraseEvent& event);
+
     void DoEnablePrint();
     void DoDeletePrint();
     void DoToggleHelp();
@@ -206,6 +209,7 @@ enum
     IDM_TOOLBAR_SHOW_ICONS,
     IDM_TOOLBAR_SHOW_BOTH,
     IDM_TOOLBAR_BG_COL,
+    IDM_TOOLBAR_CUSTOM_BG,
     IDM_TOOLBAR_CUSTOM_PATH,
     IDM_TOOLBAR_TOP_ORIENTATION,
     IDM_TOOLBAR_LEFT_ORIENTATION,
@@ -264,6 +268,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU_RANGE(IDM_TOOLBAR_SHOW_TEXT, IDM_TOOLBAR_SHOW_BOTH,
                    MyFrame::OnToolbarStyle)
     EVT_MENU(IDM_TOOLBAR_BG_COL, MyFrame::OnToolbarBgCol)
+    EVT_MENU(IDM_TOOLBAR_CUSTOM_BG, MyFrame::OnToolbarCustomBg)
 
     EVT_MENU(IDM_TOOLBAR_CUSTOM_PATH, MyFrame::OnToolbarCustomBitmap)
 
@@ -371,6 +376,17 @@ void MyFrame::RecreateToolbar()
     toolBar = CreateToolBar(style, ID_TOOLBAR);
 #endif
 
+    if ( GetMenuBar()->IsChecked(IDM_TOOLBAR_CUSTOM_BG) )
+    {
+        toolBar->Connect
+                 (
+                    wxEVT_ERASE_BACKGROUND,
+                    wxEraseEventHandler(MyFrame::OnEraseToolBarBackground),
+                    NULL,
+                    this
+                 );
+    }
+
     PopulateToolbar(toolBar);
 }
 
@@ -591,6 +607,7 @@ MyFrame::MyFrame(wxFrame* parent,
     tbarMenu->AppendRadioItem(IDM_TOOLBAR_SHOW_BOTH, wxT("Show &both\tCtrl-Alt-B"));
     tbarMenu->AppendSeparator();
     tbarMenu->Append(IDM_TOOLBAR_BG_COL, wxT("Choose bac&kground colour..."));
+    tbarMenu->AppendCheckItem(IDM_TOOLBAR_CUSTOM_BG, wxT("Draw custom back&ground"));
     tbarMenu->Append(IDM_TOOLBAR_CUSTOM_PATH, wxT("Custom &bitmap...\tCtrl-B"));
 
     wxMenu *toolMenu = new wxMenu;
@@ -690,6 +707,15 @@ void MyFrame::OnSize(wxSizeEvent& event)
     }
 }
 
+void MyFrame::OnEraseToolBarBackground(wxEraseEvent& event)
+{
+    wxDC& dc = *event.GetDC();
+    const wxSize size = dc.GetSize();
+    dc.SetPen(*wxRED_PEN);
+    dc.DrawLine(0, 0, size.x, size.y);
+    dc.DrawLine(0, size.y, size.x, 0);
+}
+
 void MyFrame::OnToggleToolbar(wxCommandEvent& WXUNUSED(event))
 {
     wxToolBar *tbar = GetToolBar();
@@ -956,6 +982,34 @@ void MyFrame::OnToolbarBgCol(wxCommandEvent& WXUNUSED(event))
     }
 }
 
+void MyFrame::OnToolbarCustomBg(wxCommandEvent& event)
+{
+    wxToolBarBase *tb = GetToolBar();
+
+    if ( event.IsChecked() )
+    {
+        tb->Connect
+            (
+             wxEVT_ERASE_BACKGROUND,
+             wxEraseEventHandler(MyFrame::OnEraseToolBarBackground),
+             NULL,
+             this
+            );
+    }
+    else
+    {
+        tb->Disconnect
+            (
+             wxEVT_ERASE_BACKGROUND,
+             wxEraseEventHandler(MyFrame::OnEraseToolBarBackground),
+             NULL,
+             this
+            );
+    }
+
+    tb->Refresh();
+}
+
 void MyFrame::OnToolbarCustomBitmap(wxCommandEvent& WXUNUSED(event))
 {
     m_pathBmp = wxLoadFileSelector("custom bitmap", "");
index 72d9fe96c124bf1eb60a44eab89912da9a31c43a..bad095f9e9eb1e13f827bf3550c410f7715271d3 100644 (file)
@@ -4754,12 +4754,6 @@ void wxWindowMSW::OnPaint(wxPaintEvent& event)
 
 bool wxWindowMSW::HandleEraseBkgnd(WXHDC hdc)
 {
-    // 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() )
-        return false;
-
     switch ( GetBackgroundStyle() )
     {
         case wxBG_STYLE_ERASE:
@@ -4782,7 +4776,7 @@ bool wxWindowMSW::HandleEraseBkgnd(WXHDC hdc)
 
                 if ( rc )
                 {
-                    // background erase by the user-defined handler
+                    // background erased by the user-defined handler
                     return true;
                 }
             }