]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/window.cpp
reset m_selectionOld when the selection is programatically changed
[wxWidgets.git] / src / msw / window.cpp
index 88dfe6c276b9d3b6e573115e6d874c168d1a1c29..d3745d4db5de6d660736e3c99e8aff804b0ef30f 100644 (file)
@@ -3938,9 +3938,6 @@ extern wxCOLORMAP *wxGetStdColourMap()
 
 bool wxWindowMSW::HandlePaint()
 {
-//    if (GetExtraStyle() & wxWS_EX_THEMED_BACKGROUND)
-//        return false;
-
     HRGN hRegion = ::CreateRectRgn(0, 0, 0, 0); // Dummy call to get a handle
     if ( !hRegion )
         wxLogLastError(wxT("CreateRectRgn"));
@@ -3980,10 +3977,6 @@ void wxWindowMSW::OnPaint(wxPaintEvent& event)
 
 bool wxWindowMSW::HandleEraseBkgnd(WXHDC hdc)
 {
-    // Prevents flicker when dragging
-    if ( ::IsIconic(GetHwnd()) )
-        return true;
-
     wxDCTemp dc(hdc);
 
     dc.SetHDC(hdc);
@@ -4004,53 +3997,77 @@ bool wxWindowMSW::HandleEraseBkgnd(WXHDC hdc)
 
 void wxWindowMSW::OnEraseBackground(wxEraseEvent& event)
 {
-    switch ( GetBackgroundStyle() )
+    // standard controls always erase their background themselves (although the
+    // user may try to override it in a derived class)
+    if ( IsOfStandardClass() )
     {
-        default:
-            wxFAIL_MSG( _T("unexpected background style") );
-            // fall through
+        event.Skip();
+        return;
+    }
 
-        case wxBG_STYLE_CUSTOM:
-            // don't skip the event here, custom background means that the app
-            // is drawing it itself in its OnPaint()
-            break;
+    if ( GetBackgroundStyle() == wxBG_STYLE_CUSTOM )
+    {
+        // 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_SYSTEM:
-#if wxUSE_NOTEBOOK && wxUSE_UXTHEME && !defined(__WXUNIVERSAL__)
-            // automatically apply the tab control theme background to any
-            // child panels to have the same look as the native property sheet
-            // dialogs
-            if ( !IsOfStandardClass() )
-            {
-                for ( wxWindow *win = this; win; win = win->GetParent() )
-                {
-                    wxNotebook *nbook = wxDynamicCast(win, wxNotebook);
-                    if ( nbook )
-                    {
-                        nbook->DoEraseBackground(event);
-                        return;
-                    }
-                }
-            }
-#endif // wxUSE_NOTEBOOK
-            event.Skip();
-            break;
 
-        case wxBG_STYLE_COLOUR:
-            // we have a fixed solid background colour, do use it
-            RECT rect;
-            ::GetClientRect(GetHwnd(), &rect);
+    // do default background painting
+    wxDC& dc = *event.GetDC();
+    HBRUSH hBrush = (HBRUSH)MSWGetBgBrush(dc.GetHDC());
+    if ( hBrush )
+    {
+        RECT rc;
+        ::GetClientRect(GetHwnd(), &rc);
+        ::FillRect(GetHdcOf(dc), &rc, hBrush);
+    }
+    else
+    {
+        // let the system paint the background
+        event.Skip();
+    }
+}
 
-            HBRUSH hBrush = ::CreateSolidBrush(
-                                    wxColourToPalRGB(GetBackgroundColour()));
-            if ( !hBrush )
-                wxLogLastError(wxT("CreateSolidBrush"));
+WXHBRUSH wxWindowMSW::MSWGetSolidBgBrushForChild(wxWindow *child)
+{
+    wxColour col = MSWGetBgColourForChild(child);
+    if ( col.Ok() )
+    {
+        // draw children with the same colour as the parent
+        wxBrush *brush = wxTheBrushList->FindOrCreateBrush(col, wxSOLID);
 
-            HDC hdc = GetHdcOf((*event.GetDC()));
+        return (WXHBRUSH)brush->GetResourceHandle();
+    }
 
-            ::FillRect(hdc, &rect, hBrush);
-            ::DeleteObject(hBrush);
+    return 0;
+}
+
+wxColour wxWindowMSW::MSWGetBgColourForChild(wxWindow * WXUNUSED(child))
+{
+    return m_hasBgCol ? GetBackgroundColour() : wxNullColour;
+}
+
+WXHBRUSH wxWindowMSW::MSWGetBgBrushForSelf(wxWindow *parent, WXHDC hDC)
+{
+    return parent->MSWGetBgBrushForChild(hDC, (wxWindow *)this);
+}
+
+WXHBRUSH wxWindowMSW::MSWGetBgBrush(WXHDC hDC)
+{
+    for ( wxWindow *win = (wxWindow *)this; win; win = win->GetParent() )
+    {
+        // background is not inherited beyond the containing TLW
+        if ( win->IsTopLevel() )
+            break;
+
+        WXHBRUSH hBrush = MSWGetBgBrushForSelf(win, hDC);
+        if ( hBrush )
+            return hBrush;
     }
+
+    return 0;
 }
 
 // ---------------------------------------------------------------------------
@@ -4954,8 +4971,10 @@ int wxCharCodeMSWToWX(int keySym, WXLPARAM lParam)
         case VK_NUMLOCK:    id = WXK_NUMLOCK; break;
         case VK_SCROLL:     id = WXK_SCROLL; break;
 
+        // the mapping for these keys may be incorrect on non-US keyboards so
+        // maybe we shouldn't map them to ASCII values at all
         case VK_OEM_1:      id = ';'; break;
-        case VK_OEM_PLUS:   id = '='; break;
+        case VK_OEM_PLUS:   id = '+'; break;
         case VK_OEM_COMMA:  id = ','; break;
         case VK_OEM_MINUS:  id = '-'; break;
         case VK_OEM_PERIOD: id = '.'; break;
@@ -5070,7 +5089,7 @@ bool wxGetKeyState(wxKeyCode key)
     bool bVirtual;
 
 //High order with GetAsyncKeyState only available on WIN32
-#ifdef __WIN32__    
+#ifdef __WIN32__
     //If the requested key is a LED key, return
     //true if the led is pressed
     if (key == WXK_NUMLOCK ||
@@ -5078,12 +5097,12 @@ bool wxGetKeyState(wxKeyCode key)
         key == WXK_SCROLL)
     {
 #endif
-        //low order bit means LED is highlighted, 
+        //low order bit means LED is highlighted,
         //high order means key is down
         //Here, for compat with other ports we want both
         return GetKeyState( wxCharCodeWXToMSW(key, &bVirtual) ) != 0;
 
-#ifdef __WIN32__    
+#ifdef __WIN32__
     }
     else
     {
@@ -5815,7 +5834,11 @@ public:
     static LRESULT CALLBACK MsgHookProc(int nCode, WPARAM wParam, LPARAM lParam)
     {
         MSG *msg = (MSG*)lParam;
-        if ( msg->message == WM_NULL )
+
+        // only process the message if it is actually going to be removed from
+        // the message queue, this prevents that the same event from being
+        // processed multiple times if now someone just called PeekMessage()
+        if ( msg->message == WM_NULL && wParam == PM_REMOVE )
         {
             wxTheApp->ProcessPendingEvents();
         }