]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/window.cpp
detabified
[wxWidgets.git] / src / msw / window.cpp
index 5994bed1f73b2a82684dcf0455ab301c6c6d6b00..74a6560574f144a5843c6677e8ac23af5b90366b 100644 (file)
@@ -424,7 +424,7 @@ void wxWindowMSW::SetFocus()
 #ifndef __WXMICROWIN__
     ::SetLastError(0);
 #endif
-    
+
     if ( !::SetFocus(hWnd) )
     {
         // was there really an error?
@@ -496,7 +496,19 @@ bool wxWindowMSW::Show(bool show)
 
     if ( show )
     {
+#ifdef __WXMICROWIN__
+       // It seems that MicroWindows brings the _parent_ of the
+       // window to the top, which can be the wrong one.
+
+       /* activate (set focus to) specified window*/
+       ::SetFocus(hWnd);
+
+       /* raise top level parent to top of z order*/
+       ::SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0,
+               SWP_NOMOVE|SWP_NOSIZE);
+#else
         BringWindowToTop(hWnd);
+#endif
     }
 
     return TRUE;
@@ -508,8 +520,20 @@ void wxWindowMSW::Raise()
 #ifdef __WIN16__
     ::BringWindowToTop(GetHwnd());
 #else // Win32
+#ifdef __WXMICROWIN__
+       // It seems that MicroWindows brings the _parent_ of the
+       // window to the top, which can be the wrong one.
+
+       /* activate (set focus to) specified window*/
+       ::SetFocus(GetHwnd());
+
+       /* raise top level parent to top of z order*/
+       ::SetWindowPos(GetHwnd(), HWND_TOP, 0, 0, 0, 0,
+               SWP_NOMOVE|SWP_NOSIZE);
+#else
     ::SetForegroundWindow(GetHwnd());
 #endif
+#endif
 }
 
 // Lower the window to the bottom of the Z order
@@ -921,6 +945,9 @@ void wxWindowMSW::SubclassWin(WXHWND hWnd)
     wxAssociateWinWithHandle(hwnd, this);
 
     m_oldWndProc = (WXFARPROC) GetWindowLong(hwnd, GWL_WNDPROC);
+
+    wxASSERT( (WXFARPROC) m_oldWndProc != (WXFARPROC) wxWndProc );
+
     SetWindowLong(hwnd, GWL_WNDPROC, (LONG) wxWndProc);
 }
 
@@ -2076,21 +2103,11 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam
             }
             break;
 
-#if defined(__WXUNIVERSAL__) && !defined(__WXMICROWIN__)
+#ifndef __WXMICROWIN__
         case WM_ACTIVATEAPP:
             wxTheApp->SetActive(wParam != 0, FindFocus());
             break;
-
-        case WM_NCHITTEST:
-            // we shouldn't allow the windows which don't want to get focus to
-            // get it
-            if ( !AcceptsFocus() )
-            {
-                rc.result = HTTRANSPARENT;
-                processed = TRUE;
-            }
-            break;
-#endif // __WXUNIVERSAL__
+#endif
 
         case WM_ACTIVATE:
             {
@@ -2138,12 +2155,6 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam
 #endif
 
         case WM_LBUTTONDOWN:
-           // set focus to this window
-           if (AcceptsFocus())
-                SetFocus();
-
-           // fall through
-
         case WM_LBUTTONUP:
         case WM_LBUTTONDBLCLK:
         case WM_RBUTTONDOWN:
@@ -2152,11 +2163,67 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam
         case WM_MBUTTONDOWN:
         case WM_MBUTTONUP:
         case WM_MBUTTONDBLCLK:
-            processed = HandleMouseEvent(message,
+         {
+                processed = FALSE;
+#ifdef __WXMICROWIN__
+                // MicroWindows seems to ignore the fact that a window
+                // is disabled. So catch mouse events and throw them away if necessary.
+                wxWindowMSW* win = this;
+                while (win)
+                {
+                    if (!win->IsEnabled())
+                    {
+                        processed = TRUE;
+                        break;
+                    }
+                    win = win->GetParent();
+                    if (win && win->IsTopLevel())
+                        break;
+                }
+#endif
+                if (!processed)
+                {
+                    if (message == WM_LBUTTONDOWN && AcceptsFocus())
+                        SetFocus();
+                     processed = HandleMouseEvent(message,
                                          GET_X_LPARAM(lParam),
                                          GET_Y_LPARAM(lParam),
-                                         wParam);
-            break;
+                                                  wParam);
+                }
+                break;
+         }
+
+#ifdef __WXMICROWIN__
+        case WM_NCLBUTTONDOWN:
+        case WM_NCLBUTTONUP:
+        case WM_NCLBUTTONDBLCLK:
+        case WM_NCRBUTTONDOWN:
+        case WM_NCRBUTTONUP:
+        case WM_NCRBUTTONDBLCLK:
+#if 0
+        case WM_NCMBUTTONDOWN:
+        case WM_NCMBUTTONUP:
+        case WM_NCMBUTTONDBLCLK:
+#endif
+            {
+                // MicroWindows seems to ignore the fact that a window
+                // is disabled. So catch mouse events and throw them away if necessary.
+                processed = FALSE;
+                wxWindowMSW* win = this;
+                while (win)
+                {
+                    if (!win->IsEnabled())
+                    {
+                        processed = TRUE;
+                        break;
+                    }
+                    win = win->GetParent();
+                    if (win && win->IsTopLevel())
+                        break;
+                }
+                break;
+            }
+#endif
 
 #ifdef MM_JOY1MOVE // __WXMICROWIN__
         case MM_JOY1MOVE:
@@ -2463,6 +2530,18 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam
             }
             break;
 #endif // __WIN32__
+
+#ifdef __WXUNIVERSAL__
+        case WM_NCHITTEST:
+            // we shouldn't allow the windows which don't want to get focus to
+            // get it
+            if ( !AcceptsFocus() )
+            {
+                rc.result = HTTRANSPARENT;
+                processed = TRUE;
+            }
+            break;
+#endif // __WXUNIVERSAL__
     }
 
     if ( !processed )
@@ -2654,9 +2733,9 @@ bool wxWindowMSW::MSWCreate(int id,
 
     wxWndHook = this;
 
+#ifndef __WXMICROWIN__
     if ( dialog_template )
     {
-#ifndef __WXMICROWIN__
         // for the dialogs without wxDIALOG_NO_PARENT style, use the top level
         // app window as parent - this avoids creating modal dialogs without
         // parent
@@ -2728,11 +2807,11 @@ bool wxWindowMSW::MSWCreate(int id,
         {
             wxLogLastError(wxT("MoveWindow"));
         }
-#endif
-       // __WXMICROWIN__
 
     }
     else // creating a normal window, not a dialog
+#endif
+       // __WXMICROWIN__
     {
         int controlId = 0;
         if ( style & WS_CHILD )