Correction to dnd.h; EVT_MOUSE_EVENTS now includes LEAVE/ENTER events;
Windows LEAVE/ENTER events now work git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@86 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -2235,18 +2235,8 @@ void wxWindow::MSWOnLButtonDown(const int x, const int y, const WXUINT flags)
|
||||
}
|
||||
#endif
|
||||
|
||||
//wxDebugMsg("LButtonDown\n") ;
|
||||
wxMouseEvent event(wxEVENT_TYPE_LEFT_DOWN);
|
||||
|
||||
/*
|
||||
float px = (float)x;
|
||||
float py = (float)y;
|
||||
|
||||
MSWDeviceToLogical(&px, &py);
|
||||
|
||||
CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
|
||||
*/
|
||||
|
||||
event.m_x = x; event.m_y = y;
|
||||
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
|
||||
event.m_controlDown = ((flags & MK_CONTROL) != 0);
|
||||
@@ -2262,18 +2252,8 @@ void wxWindow::MSWOnLButtonDown(const int x, const int y, const WXUINT flags)
|
||||
|
||||
void wxWindow::MSWOnLButtonUp(const int x, const int y, const WXUINT flags)
|
||||
{
|
||||
//wxDebugMsg("LButtonUp\n") ;
|
||||
wxMouseEvent event(wxEVENT_TYPE_LEFT_UP);
|
||||
|
||||
/*
|
||||
float px = (float)x;
|
||||
float py = (float)y;
|
||||
|
||||
MSWDeviceToLogical(&px, &py);
|
||||
|
||||
CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
|
||||
*/
|
||||
|
||||
event.m_x = x; event.m_y = y;
|
||||
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
|
||||
event.m_controlDown = ((flags & MK_CONTROL) != 0);
|
||||
@@ -2290,20 +2270,10 @@ void wxWindow::MSWOnLButtonUp(const int x, const int y, const WXUINT flags)
|
||||
|
||||
void wxWindow::MSWOnLButtonDClick(const int x, const int y, const WXUINT flags)
|
||||
{
|
||||
//wxDebugMsg("LButtonDClick\n") ;
|
||||
/* MATTHEW: If dclick not allowed, generate another single-click */
|
||||
wxMouseEvent event(m_doubleClickAllowed ?
|
||||
wxEVENT_TYPE_LEFT_DCLICK : wxEVENT_TYPE_LEFT_DOWN);
|
||||
|
||||
/*
|
||||
float px = (float)x;
|
||||
float py = (float)y;
|
||||
|
||||
MSWDeviceToLogical(&px, &py);
|
||||
|
||||
CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
|
||||
*/
|
||||
|
||||
event.m_x = x; event.m_y = y;
|
||||
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
|
||||
event.m_controlDown = ((flags & MK_CONTROL) != 0);
|
||||
@@ -2342,18 +2312,8 @@ void wxWindow::MSWOnMButtonDown(const int x, const int y, const WXUINT flags)
|
||||
}
|
||||
#endif
|
||||
|
||||
//wxDebugMsg("MButtonDown\n") ;
|
||||
wxMouseEvent event(wxEVENT_TYPE_MIDDLE_DOWN);
|
||||
|
||||
/*
|
||||
float px = (float)x;
|
||||
float py = (float)y;
|
||||
|
||||
MSWDeviceToLogical(&px, &py);
|
||||
|
||||
CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
|
||||
*/
|
||||
|
||||
event.m_x = x; event.m_y = y;
|
||||
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
|
||||
event.m_controlDown = ((flags & MK_CONTROL) != 0);
|
||||
@@ -2372,15 +2332,6 @@ void wxWindow::MSWOnMButtonUp(const int x, const int y, const WXUINT flags)
|
||||
//wxDebugMsg("MButtonUp\n") ;
|
||||
wxMouseEvent event(wxEVENT_TYPE_MIDDLE_UP);
|
||||
|
||||
/*
|
||||
float px = (float)x;
|
||||
float py = (float)y;
|
||||
|
||||
MSWDeviceToLogical(&px, &py);
|
||||
|
||||
CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
|
||||
*/
|
||||
|
||||
event.m_x = x; event.m_y = y;
|
||||
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
|
||||
event.m_controlDown = ((flags & MK_CONTROL) != 0);
|
||||
@@ -2401,15 +2352,6 @@ void wxWindow::MSWOnMButtonDClick(const int x, const int y, const WXUINT flags)
|
||||
wxMouseEvent event((m_doubleClickAllowed) ?
|
||||
wxEVENT_TYPE_MIDDLE_DCLICK : wxEVENT_TYPE_MIDDLE_DOWN);
|
||||
|
||||
/*
|
||||
float px = (float)x;
|
||||
float py = (float)y;
|
||||
|
||||
MSWDeviceToLogical(&px, &py);
|
||||
|
||||
CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
|
||||
*/
|
||||
|
||||
event.m_x = x; event.m_y = y;
|
||||
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
|
||||
event.m_controlDown = ((flags & MK_CONTROL) != 0);
|
||||
@@ -2447,18 +2389,8 @@ void wxWindow::MSWOnRButtonDown(const int x, const int y, const WXUINT flags)
|
||||
}
|
||||
#endif
|
||||
|
||||
//wxDebugMsg("RButtonDown\n") ;
|
||||
wxMouseEvent event(wxEVENT_TYPE_RIGHT_DOWN);
|
||||
|
||||
/*
|
||||
float px = (float)x;
|
||||
float py = (float)y;
|
||||
|
||||
MSWDeviceToLogical(&px, &py);
|
||||
|
||||
CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
|
||||
*/
|
||||
|
||||
event.m_x = x; event.m_y = y;
|
||||
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
|
||||
event.m_controlDown = ((flags & MK_CONTROL) != 0);
|
||||
@@ -2474,18 +2406,8 @@ void wxWindow::MSWOnRButtonDown(const int x, const int y, const WXUINT flags)
|
||||
|
||||
void wxWindow::MSWOnRButtonUp(const int x, const int y, const WXUINT flags)
|
||||
{
|
||||
//wxDebugMsg("RButtonUp\n") ;
|
||||
wxMouseEvent event(wxEVENT_TYPE_RIGHT_UP);
|
||||
|
||||
/*
|
||||
float px = (float)x;
|
||||
float py = (float)y;
|
||||
|
||||
MSWDeviceToLogical(&px, &py);
|
||||
|
||||
CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
|
||||
*/
|
||||
|
||||
event.m_x = x; event.m_y = y;
|
||||
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
|
||||
event.m_controlDown = ((flags & MK_CONTROL) != 0);
|
||||
@@ -2501,20 +2423,10 @@ void wxWindow::MSWOnRButtonUp(const int x, const int y, const WXUINT flags)
|
||||
|
||||
void wxWindow::MSWOnRButtonDClick(const int x, const int y, const WXUINT flags)
|
||||
{
|
||||
//wxDebugMsg("RButtonDClick\n") ;
|
||||
/* MATTHEW: If dclick not allowed, generate another single-click */
|
||||
wxMouseEvent event((m_doubleClickAllowed) ?
|
||||
wxEVENT_TYPE_RIGHT_DCLICK : wxEVENT_TYPE_RIGHT_DOWN);
|
||||
|
||||
/*
|
||||
float px = (float)x;
|
||||
float py = (float)y;
|
||||
|
||||
MSWDeviceToLogical(&px, &py);
|
||||
|
||||
CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
|
||||
*/
|
||||
|
||||
event.m_x = x; event.m_y = y;
|
||||
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
|
||||
event.m_controlDown = ((flags & MK_CONTROL) != 0);
|
||||
@@ -2538,17 +2450,15 @@ void wxWindow::MSWOnMouseMove(const int x, const int y, const WXUINT flags)
|
||||
if (m_windowCursor.Ok() && !wxIsBusy())
|
||||
::SetCursor((HCURSOR) m_windowCursor.GetHCURSOR());
|
||||
|
||||
if (!m_mouseInWindow)
|
||||
{
|
||||
// Generate an ENTER event
|
||||
m_mouseInWindow = TRUE;
|
||||
MSWOnMouseEnter(x, y, flags);
|
||||
}
|
||||
|
||||
wxMouseEvent event(wxEVENT_TYPE_MOTION);
|
||||
|
||||
/*
|
||||
float px = (float)x;
|
||||
float py = (float)y;
|
||||
|
||||
MSWDeviceToLogical(&px, &py);
|
||||
|
||||
CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
|
||||
*/
|
||||
|
||||
event.m_x = x; event.m_y = y;
|
||||
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
|
||||
event.m_controlDown = ((flags & MK_CONTROL) != 0);
|
||||
@@ -2575,135 +2485,9 @@ void wxWindow::MSWOnMouseMove(const int x, const int y, const WXUINT flags)
|
||||
GetEventHandler()->OldOnMouseEvent(event);
|
||||
}
|
||||
|
||||
/* TODO put back leave/enter code if required
|
||||
*/
|
||||
#if 0
|
||||
void wxWindow::MSWOnMouseMove(int x, int y, WXUINT flags)
|
||||
{
|
||||
//wxDebugMsg("Client 0x%08x Move Msg %d,%d\n",this,x,y) ;
|
||||
|
||||
// #if MOUSE_EXIT_FIX //Should work now!!
|
||||
|
||||
// Don't do the Leave/Enter fix if we've captured the window,
|
||||
// or SetCapture won't work properly.
|
||||
if (!m_winCaptured)
|
||||
{
|
||||
HWND hunder ;
|
||||
POINT pt ;
|
||||
// See if we Leave/Enter the window.
|
||||
GetCursorPos(&pt) ;
|
||||
hunder = WindowFromPoint(pt) ;
|
||||
if (hunder==m_hWnd)
|
||||
{
|
||||
// I'm in the Window, but perhaps in NC area.
|
||||
RECT wind ;
|
||||
RECT nc ;
|
||||
GetClientRect(m_hWnd,&wind) ;
|
||||
GetWindowRect(m_hWnd,&nc) ;
|
||||
pt.x -= nc.left ;
|
||||
pt.y -= nc.top ;
|
||||
wind.left += WINDOW_MARGIN ; // to be able to 'see' leave
|
||||
wind.top += WINDOW_MARGIN ; // to be able to 'see' leave
|
||||
wind.right -= WINDOW_MARGIN ; // to be able to 'see' leave
|
||||
wind.bottom -= WINDOW_MARGIN ; // to be able to 'see' leave
|
||||
|
||||
if (!PtInRect(&wind,pt))
|
||||
hunder = NULL ; // So, I can simulate a Leave event...
|
||||
}
|
||||
|
||||
if (hunder!=m_hWnd)
|
||||
{
|
||||
if (m_mouseInWindow)
|
||||
{
|
||||
m_mouseInWindow = FALSE ;
|
||||
// Capture/Release is no more needed...
|
||||
//ReleaseCapture() ;
|
||||
MSWOnMouseLeave(x,y,flags) ;
|
||||
return ;
|
||||
}
|
||||
// We never want to see Enter or Motion in this part of the Window...
|
||||
return ;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Event was triggered while I'm really into my client area.
|
||||
// Do an Enter if not done.
|
||||
if (!m_mouseInWindow)
|
||||
{
|
||||
m_mouseInWindow = TRUE ;
|
||||
// Capture/Release is no more needed...
|
||||
//SetCapture(m_hWnd) ;
|
||||
// Set cursor, but only if we're not in 'busy' mode
|
||||
if (m_windowCursor.Ok() && !wxIsBusy())
|
||||
::SetCursor(m_windowCursor.ms_cursor);
|
||||
MSWOnMouseEnter(x,y,flags) ;
|
||||
return ;
|
||||
}
|
||||
}
|
||||
}
|
||||
// #endif //MOUSE_EXIT_FIX
|
||||
|
||||
// 'normal' move event...
|
||||
// Set cursor, but only if we're not in 'busy' mode
|
||||
if (m_windowCursor.Ok() && !wxIsBusy())
|
||||
::SetCursor(m_windowCursor.ms_cursor);
|
||||
|
||||
wxMouseEvent event(wxEVENT_TYPE_MOTION);
|
||||
|
||||
/*
|
||||
float px = (float)x;
|
||||
float py = (float)y;
|
||||
|
||||
MSWDeviceToLogical(&px, &py);
|
||||
|
||||
CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
|
||||
*/
|
||||
|
||||
event.m_x = x; event.m_y = y;
|
||||
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
|
||||
event.m_controlDown = ((flags & MK_CONTROL) != 0);
|
||||
event.m_leftDown = ((flags & MK_LBUTTON) != 0);
|
||||
event.m_middleDown = ((flags & MK_MBUTTON) != 0);
|
||||
event.m_rightDown = ((flags & MK_RBUTTON) != 0);
|
||||
event.SetTimestamp(wxApp::sm_lastMessageTime); /* MATTHEW: timeStamp */
|
||||
event.m_eventObject = this;
|
||||
|
||||
// Window gets a click down message followed by a mouse move
|
||||
// message even if position isn't changed! We want to discard
|
||||
// the trailing move event if x and y are the same.
|
||||
if ((m_lastEvent == wxEVENT_TYPE_RIGHT_DOWN || m_lastEvent == wxEVENT_TYPE_LEFT_DOWN ||
|
||||
m_lastEvent == wxEVENT_TYPE_MIDDLE_DOWN) &&
|
||||
(m_lastXPos == event.m_x && m_lastYPos == event.m_y))
|
||||
{
|
||||
m_lastXPos = event.m_x; m_lastYPos = event.m_y;
|
||||
m_lastEvent = wxEVENT_TYPE_MOTION;
|
||||
return;
|
||||
}
|
||||
|
||||
m_lastEvent = wxEVENT_TYPE_MOTION;
|
||||
m_lastXPos = event.m_x; m_lastYPos = event.m_y;
|
||||
GetEventHandler()->OldOnMouseEvent(event);
|
||||
}
|
||||
#endif
|
||||
|
||||
void wxWindow::MSWOnMouseEnter(const int x, const int y, const WXUINT flags)
|
||||
{
|
||||
//wxDebugMsg("Client 0x%08x Enter %d,%d\n",this,x,y) ;
|
||||
|
||||
// Set cursor, but only if we're not in 'busy' mode
|
||||
if (m_windowCursor.Ok() && !wxIsBusy())
|
||||
::SetCursor((HCURSOR) m_windowCursor.GetHCURSOR());
|
||||
|
||||
wxMouseEvent event(wxEVENT_TYPE_ENTER_WINDOW);
|
||||
|
||||
/*
|
||||
float px = (float)x;
|
||||
float py = (float)y;
|
||||
|
||||
MSWDeviceToLogical(&px, &py);
|
||||
|
||||
CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
|
||||
*/
|
||||
wxMouseEvent event(wxEVT_ENTER_WINDOW);
|
||||
|
||||
event.m_x = x; event.m_y = y;
|
||||
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
|
||||
@@ -2714,29 +2498,14 @@ void wxWindow::MSWOnMouseEnter(const int x, const int y, const WXUINT flags)
|
||||
event.SetTimestamp(wxApp::sm_lastMessageTime); /* MATTHEW: timeStamp */
|
||||
event.m_eventObject = this;
|
||||
|
||||
m_lastEvent = wxEVENT_TYPE_ENTER_WINDOW;
|
||||
m_lastEvent = wxEVT_ENTER_WINDOW;
|
||||
m_lastXPos = event.m_x; m_lastYPos = event.m_y;
|
||||
GetEventHandler()->OldOnMouseEvent(event);
|
||||
}
|
||||
|
||||
void wxWindow::MSWOnMouseLeave(const int x, const int y, const WXUINT flags)
|
||||
{
|
||||
//wxDebugMsg("Client 0x%08x Leave %d,%d\n",this,x,y) ;
|
||||
|
||||
// Set cursor, but only if we're not in 'busy' mode
|
||||
if (m_windowCursor.Ok() && !wxIsBusy())
|
||||
::SetCursor((HCURSOR) m_windowCursor.GetHCURSOR());
|
||||
|
||||
wxMouseEvent event(wxEVENT_TYPE_LEAVE_WINDOW);
|
||||
|
||||
/*
|
||||
float px = (float)x;
|
||||
float py = (float)y;
|
||||
|
||||
MSWDeviceToLogical(&px, &py);
|
||||
|
||||
CalcUnscrolledPosition((int)px, (int)py, &event.m_x, &event.m_y);
|
||||
*/
|
||||
wxMouseEvent event(wxEVT_LEAVE_WINDOW);
|
||||
|
||||
event.m_x = x; event.m_y = y;
|
||||
event.m_shiftDown = ((flags & MK_SHIFT) != 0);
|
||||
@@ -2747,7 +2516,7 @@ void wxWindow::MSWOnMouseLeave(const int x, const int y, const WXUINT flags)
|
||||
event.SetTimestamp(wxApp::sm_lastMessageTime); /* MATTHEW: timeStamp */
|
||||
event.m_eventObject = this;
|
||||
|
||||
m_lastEvent = wxEVENT_TYPE_LEAVE_WINDOW;
|
||||
m_lastEvent = wxEVT_LEAVE_WINDOW;
|
||||
m_lastXPos = event.m_x; m_lastYPos = event.m_y;
|
||||
GetEventHandler()->OldOnMouseEvent(event);
|
||||
}
|
||||
@@ -2810,13 +2579,6 @@ void wxWindow::MSWOnChar(const WXWORD wParam, const WXLPARAM lParam, const bool
|
||||
pt.x -= rect.left ;
|
||||
pt.y -= rect.top ;
|
||||
|
||||
/*
|
||||
float fx,fy ;
|
||||
fx = (float)pt.x ;
|
||||
fy = (float)pt.y ;
|
||||
MSWDeviceToLogical(&fx,&fy) ;
|
||||
CalcUnscrolledPosition((int)fx,(int)fy,&event.m_x,&event.m_y) ;
|
||||
*/
|
||||
event.m_x = pt.x; event.m_y = pt.y;
|
||||
|
||||
#if WXWIN_COMPATIBILITY
|
||||
@@ -4950,6 +4712,19 @@ void wxWindow::UpdateWindowUI(void)
|
||||
|
||||
void wxWindow::OnIdle(wxIdleEvent& event)
|
||||
{
|
||||
// Check if we need to send a LEAVE event
|
||||
if (m_mouseInWindow)
|
||||
{
|
||||
POINT pt;
|
||||
::GetCursorPos(&pt);
|
||||
if (::WindowFromPoint(pt) != (HWND) GetHWND())
|
||||
{
|
||||
// Generate a LEAVE event
|
||||
m_mouseInWindow = FALSE;
|
||||
MSWOnMouseLeave(pt.x, pt.y, 0);
|
||||
}
|
||||
}
|
||||
|
||||
UpdateWindowUI();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user