Applied some of [ 810965 ] Implement wxEVT_LEAVE_WINDOW with TrackMouseEvent
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@24747 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
6f951810a1
commit
e5297b7f46
@ -2400,6 +2400,61 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam
|
||||
wParam);
|
||||
break;
|
||||
|
||||
#ifndef __WXWINCE__
|
||||
case WM_MOUSELEAVE:
|
||||
{
|
||||
wxASSERT_MSG( !m_mouseInWindow, wxT("the mouse should be in a window to generate this event!") );
|
||||
|
||||
// only process this message if the mouse is not in the window,
|
||||
// This can also check for children in composite windows.
|
||||
// however, this may mean the the wxEVT_LEAVE_WINDOW is never sent
|
||||
// if the mouse does not enter the window from it's child before
|
||||
// leaving the scope of the window. ( perhaps this can be picked
|
||||
// up in the OnIdle code as before, for this special case )
|
||||
if ( /*IsComposite() && */ !IsMouseInWindow() )
|
||||
{
|
||||
m_mouseInWindow = FALSE;
|
||||
|
||||
// Unfortunately no mouse state is passed with a WM_MOUSE_LEAVE
|
||||
int state = 0;
|
||||
if ( wxIsShiftDown() )
|
||||
state |= MK_SHIFT;
|
||||
if ( wxIsCtrlDown() )
|
||||
state |= MK_CONTROL;
|
||||
if ( GetKeyState( VK_LBUTTON ) )
|
||||
state |= MK_LBUTTON;
|
||||
if ( GetKeyState( VK_MBUTTON ) )
|
||||
state |= MK_MBUTTON;
|
||||
if ( GetKeyState( VK_RBUTTON ) )
|
||||
state |= MK_RBUTTON;
|
||||
|
||||
POINT pt;
|
||||
if ( !::GetCursorPos(&pt) )
|
||||
{
|
||||
wxLogLastError(_T("GetCursorPos"));
|
||||
}
|
||||
|
||||
// we need to have client coordinates here for symmetry with
|
||||
// wxEVT_ENTER_WINDOW
|
||||
RECT rect = wxGetWindowRect(GetHwnd());
|
||||
pt.x -= rect.left;
|
||||
pt.y -= rect.top;
|
||||
|
||||
wxMouseEvent event2(wxEVT_LEAVE_WINDOW);
|
||||
InitMouseEvent(event2, pt.x, pt.y, state);
|
||||
|
||||
(void)GetEventHandler()->ProcessEvent(event2);
|
||||
}
|
||||
// always pass processed back as false, this allows the window
|
||||
// manager to process the message too. This is needed to ensure
|
||||
// windows XP themes work properly as the mouse moves over widgets
|
||||
// like buttons.
|
||||
processed = false;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
// __WXWINCE__
|
||||
|
||||
#if wxUSE_MOUSEWHEEL
|
||||
case WM_MOUSEWHEEL:
|
||||
processed = HandleMouseWheel(wParam, lParam);
|
||||
@ -4342,6 +4397,18 @@ bool wxWindowMSW::HandleMouseMove(int x, int y, WXUINT flags)
|
||||
// Generate an ENTER event
|
||||
m_mouseInWindow = TRUE;
|
||||
|
||||
#ifndef __WXWINCE__
|
||||
TRACKMOUSEEVENT trackinfo;
|
||||
|
||||
trackinfo.cbSize = sizeof(trackinfo);
|
||||
trackinfo.dwFlags = TME_LEAVE;
|
||||
trackinfo.hwndTrack = GetHwnd();
|
||||
//Use the commctrl.h _TrackMouseEvent, which will call the
|
||||
// appropriate TrackMouseEvent or emulate it ( win95 )
|
||||
// else we need _WIN32_WINNT >= 0x0400
|
||||
_TrackMouseEvent(&trackinfo);
|
||||
#endif
|
||||
|
||||
wxMouseEvent event(wxEVT_ENTER_WINDOW);
|
||||
InitMouseEvent(event, x, y, flags);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user