]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/window.cpp
VC++ /Wp64 warning fixes
[wxWidgets.git] / src / msw / window.cpp
index 64bf883fc57404a29a6b6bc3308e33c6f11806ec..800b06910dc2347c975664eb9e5191acd8e158b0 100644 (file)
@@ -800,7 +800,7 @@ bool wxWindowMSW::SetCursor(const wxCursor& cursor)
     return true;
 }
 
-void wxWindowMSW::WarpPointer (int x, int y)
+void wxWindowMSW::WarpPointer(int x, int y)
 {
     ClientToScreen(&x, &y);
 
@@ -810,6 +810,29 @@ void wxWindowMSW::WarpPointer (int x, int y)
     }
 }
 
+void wxWindowMSW::MSWUpdateUIState()
+{
+    // WM_UPDATEUISTATE only appeared in Windows 2000 so it can do us no good
+    // to use it on older systems -- and could possibly do some harm
+    static int s_needToUpdate = -1;
+    if ( s_needToUpdate == -1 )
+    {
+        int verMaj, verMin;
+        s_needToUpdate = wxGetOsVersion(&verMaj, &verMin) == wxWINDOWS_NT &&
+                            verMaj >= 5;
+    }
+
+    if ( s_needToUpdate )
+    {
+        // NB: it doesn't seem to matter what we put in wParam, whether we
+        //     include just one UISF_XXX or both, both are affected, no idea
+        //     why
+        ::SendMessage(GetHwnd(), WM_UPDATEUISTATE,
+                        MAKEWPARAM(UIS_INITIALIZE,
+                                   UISF_HIDEFOCUS | UISF_HIDEACCEL), 0);
+    }
+}
+
 // ---------------------------------------------------------------------------
 // scrolling stuff
 // ---------------------------------------------------------------------------
@@ -2061,6 +2084,12 @@ bool wxWindowMSW::MSWProcessMessage(WXMSG* pMsg)
 
                 if ( GetEventHandler()->ProcessEvent(event) )
                 {
+                    // as we don't call IsDialogMessage(), which would take of
+                    // this by default, we need to manually send this message
+                    // so that controls could change their appearance
+                    // appropriately
+                    MSWUpdateUIState();
+
                     return true;
                 }
             }
@@ -4597,6 +4626,18 @@ bool wxWindowMSW::HandleMouseMove(int x, int y, WXUINT flags)
             (void)GetEventHandler()->ProcessEvent(event);
         }
     }
+#ifdef HAVE_TRACKMOUSEEVENT
+    else
+    {
+        // Check if we need to send a LEAVE event
+        // Windows doesn't send WM_MOUSELEAVE if the mouse has been captured so
+        // send it here if we are using native mouse leave tracking
+        if ( HasCapture() && !IsMouseInWindow() )
+        {
+            GenerateMouseLeave();
+        }
+    }
+#endif // HAVE_TRACKMOUSEEVENT 
 
 #if wxUSE_MOUSEEVENT_HACK
     // Window gets a click down message followed by a mouse move message even