]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/window.cpp
VC++ warning suppressed
[wxWidgets.git] / src / msw / window.cpp
index 3c3728462ad1d7e83204fcc0d6c33ed532777e53..fec86503347e04803615b0f339c3677de6fdd1e9 100644 (file)
@@ -303,8 +303,6 @@ wxWindow::~wxWindow(void)
   // wxWnd
   MSWDetachWindowMenu();
 
-  wxRemoveHandleAssociation(this);
-
   // TODO for backward compatibility
 #if 0
   // WX_CANVAS
@@ -325,6 +323,8 @@ wxWindow::~wxWindow(void)
 
   if (m_hWnd)
     ::DestroyWindow((HWND)m_hWnd);
+
+  wxRemoveHandleAssociation(this);
   m_hWnd = 0;
 #ifndef __WIN32__
   if (m_globalHandle)
@@ -566,7 +566,11 @@ wxEvtHandler *wxWindow::PopEventHandler(bool deleteHandler)
 
 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);
@@ -1538,6 +1542,10 @@ wxWindow *wxFindWinFromHandle(WXHWND 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);
 }
@@ -1680,15 +1688,15 @@ bool wxWindow::MSWOnDestroy(void)
 #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;
 }
@@ -2227,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);
@@ -2254,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);
@@ -2282,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);
@@ -2334,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);
@@ -2364,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);
@@ -2393,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);
@@ -2439,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);
@@ -2466,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);
@@ -2493,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);
@@ -2530,127 +2450,15 @@ void wxWindow::MSWOnMouseMove(const int x, const int y, const WXUINT flags)
   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);
@@ -2676,26 +2484,10 @@ void wxWindow::MSWOnMouseMove(int x, int y, WXUINT flags)
   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);
@@ -2706,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);
@@ -2739,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);
 }
@@ -2802,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
@@ -4942,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();
 }