// wxWnd
MSWDetachWindowMenu();
- wxRemoveHandleAssociation(this);
-
// TODO for backward compatibility
#if 0
// WX_CANVAS
if (m_hWnd)
::DestroyWindow((HWND)m_hWnd);
+
+ wxRemoveHandleAssociation(this);
m_hWnd = 0;
#ifndef __WIN32__
if (m_globalHandle)
void wxWindow::SetDropTarget(wxDropTarget *pDropTarget)
{
- DELETEP(m_pDropTarget);
+ if ( m_pDropTarget != 0 ) {
+ m_pDropTarget->Revoke(m_hWnd);
+ delete m_pDropTarget;
+ }
+
m_pDropTarget = pDropTarget;
if ( m_pDropTarget != 0 )
m_pDropTarget->Register(m_hWnd);
void wxAssociateWinWithHandle(HWND hWnd, wxWindow *win)
{
+ // adding NULL hWnd is (first) surely a result of an error and
+ // (secondly) breaks menu command processing
+ wxCHECK( hWnd != NULL );
+
if ( !wxWinHandleList->Find((long)hWnd) )
wxWinHandleList->Append((long)hWnd, win);
}
#if DEBUG > 1
wxDebugMsg("wxWindow::MSWOnDestroy %d\n", handle);
#endif
- // delete our log target if we've got one
-#if USE_DRAG_AND_DROP
- if ( m_pDropTarget != 0 ) {
+ // delete our drop target if we've got one
+ #if USE_DRAG_AND_DROP
+ if ( m_pDropTarget != NULL ) {
m_pDropTarget->Revoke(m_hWnd);
delete m_pDropTarget;
m_pDropTarget = NULL;
}
-#endif
+ #endif
return TRUE;
}
}
#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);
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);
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);
}
#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);
//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);
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);
}
#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);
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);
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);
if (m_windowCursor.Ok() && !wxIsBusy())
::SetCursor((HCURSOR) m_windowCursor.GetHCURSOR());
- 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);
-}
-
-/* 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)
+ if (!m_mouseInWindow)
{
- 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 ;
- }
- }
+ // Generate an ENTER event
+ m_mouseInWindow = TRUE;
+ MSWOnMouseEnter(x, y, flags);
}
-// #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);
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);
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);
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);
}
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
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();
}