From 3eddf563edad7403f84906650506370f4f7dedb2 Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Sun, 28 Feb 1999 14:16:33 +0000
Subject: [PATCH] SetCursor() doesn't set cursor for children of the window any
 more

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1827 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/latex/wx/window.tex |  7 ++---
 src/msw/window.cpp       | 67 +++++++++++++++++++++++-----------------
 2 files changed, 41 insertions(+), 33 deletions(-)

diff --git a/docs/latex/wx/window.tex b/docs/latex/wx/window.tex
index b5bc55cf75..e267566210 100644
--- a/docs/latex/wx/window.tex
+++ b/docs/latex/wx/window.tex
@@ -1685,10 +1685,9 @@ implements the following methods:\par
 
 \func{virtual void}{SetCursor}{\param{const wxCursor\&}{cursor}}
 
-Sets the window's cursor. Notice that setting the cursor for this window also
-sets it for all the children of the window unless they have their own cursor
-(either explicitly set with the same function, or, in the case of Windows, a
-standard one for some of standard controls).
+Sets the window's cursor. Notice that setting the cursor for this window does
+not set it for its children so you'll need to explicitly call SetCursor() for
+them too if you need it.
 
 \wxheading{Parameters}
 
diff --git a/src/msw/window.cpp b/src/msw/window.cpp
index 750f5c7c53..a3e3a9d727 100644
--- a/src/msw/window.cpp
+++ b/src/msw/window.cpp
@@ -1500,45 +1500,54 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
 
     case WM_SETCURSOR:
         {
-            // don't set cursor when the mouse is not in the client part
-            short nHitTest = LOWORD(lParam);
-            if ( nHitTest == HTCLIENT || nHitTest == HTERROR )
+            // don't set cursor for other windows, only for this one: this
+            // prevents children of this window from gettign the same cursor
+            // as the parent has (don't forget that this message is propagated
+            // by default up the window parent-child hierarchy)
+            if ( (HWND)wParam == hWnd )
             {
-                HCURSOR hcursor = 0;
-                if ( wxIsBusy() )
+                // don't set cursor when the mouse is not in the client part
+                short nHitTest = LOWORD(lParam);
+                if ( nHitTest == HTCLIENT || nHitTest == HTERROR )
                 {
-                    extern HCURSOR gs_wxBusyCursor; // from msw\utils.cpp
-
-                    hcursor = gs_wxBusyCursor;
-                }
-                else
-                {
-                    wxCursor *cursor = NULL;
-
-                    if ( m_windowCursor.Ok() )
+                    HCURSOR hcursor = 0;
+                    if ( wxIsBusy() )
                     {
-                        cursor = &m_windowCursor;
+                        // from msw\utils.cpp
+                        extern HCURSOR gs_wxBusyCursor;
+
+                        hcursor = gs_wxBusyCursor;
                     }
                     else
                     {
-                        extern wxCursor *g_globalCursor; // from msw\data.cpp
+                        wxCursor *cursor = NULL;
 
-                        if ( g_globalCursor && g_globalCursor->Ok() )
-                            cursor = g_globalCursor;
-                    }
+                        if ( m_windowCursor.Ok() )
+                        {
+                            cursor = &m_windowCursor;
+                        }
+                        else
+                        {
+                            // from msw\data.cpp
+                            extern wxCursor *g_globalCursor;
 
-                    if ( cursor )
-                        hcursor = (HCURSOR)cursor->GetHCURSOR();
-                }
+                            if ( g_globalCursor && g_globalCursor->Ok() )
+                                cursor = g_globalCursor;
+                        }
 
-                if ( hcursor )
-                {
-                    ::SetCursor(hcursor);
+                        if ( cursor )
+                            hcursor = (HCURSOR)cursor->GetHCURSOR();
+                    }
 
-                    // returning TRUE stops the DefWindowProc() from further
-                    // processing this message - exactly what we need because we've
-                    // just set the cursor.
-                    return TRUE;
+                    if ( hcursor )
+                    {
+                        ::SetCursor(hcursor);
+
+                        // returning TRUE stops the DefWindowProc() from
+                        // further processing this message - exactly what we
+                        // need because we've just set the cursor.
+                        return TRUE;
+                    }
                 }
             }
         }
-- 
2.50.0

