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.47.2