]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/window.cpp
added wxMenu::Append( wxMenuItem )
[wxWidgets.git] / src / msw / window.cpp
index e737b2328d7f80e8eb4f896dfc806082953d8fb4..a3e3a9d72794b7586186cbee77617651b5134ea1 100644 (file)
@@ -231,13 +231,14 @@ void wxWindow::SetHWND(WXHWND hWnd)
 
 void wxWindow::Init()
 {
+    m_isWindow = TRUE;
+
     // Generic
     m_windowId = 0;
     m_isShown = TRUE;
     m_windowStyle = 0;
     m_windowParent = NULL;
     m_windowEventHandler = this;
-    m_windowCursor = *wxSTANDARD_CURSOR;
     m_children = new wxList;
     m_doubleClickAllowed = 0 ;
     m_winCaptured = FALSE;
@@ -670,12 +671,12 @@ void wxWindow::GetClientSize(int *x, int *y) const
 {
     HWND hWnd = (HWND) GetHWND();
     RECT rect;
-    GetClientRect(hWnd, &rect);
+    ::GetClientRect(hWnd, &rect);
     *x = rect.right;
     *y = rect.bottom;
 }
 
-void wxWindow::SetSize(int x, int y, int width, int height, int sizeFlags)
+void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 {
     int currentX, currentY;
     GetPosition(&currentX, &currentY);
@@ -706,14 +707,16 @@ void wxWindow::SetSize(int x, int y, int width, int height, int sizeFlags)
         MoveWindow(hWnd, actualX, actualY, actualWidth, actualHeight, (BOOL)TRUE);
 }
 
-void wxWindow::SetClientSize(int width, int height)
+void wxWindow::DoSetClientSize(int width, int height)
 {
     wxWindow *parent = GetParent();
     HWND hWnd = (HWND) GetHWND();
-    HWND hParentWnd = (HWND) (HWND) parent->GetHWND();
+    HWND hParentWnd = (HWND) 0;
+    if (parent)
+        hParentWnd = (HWND) parent->GetHWND();
 
     RECT rect;
-    GetClientRect(hWnd, &rect);
+    ::GetClientRect(hWnd, &rect);
 
     RECT rect2;
     GetWindowRect(hWnd, &rect2);
@@ -1226,7 +1229,6 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
         }
 
     case WM_KEYDOWN:
-    {
         // If this has been processed by an event handler,
         // return 0 now (we've handled it).
         if (MSWOnKeyDown((WORD) wParam, lParam))
@@ -1252,28 +1254,41 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
             case VK_RIGHT:
             case VK_DOWN:
             case VK_UP:
-            {
-/*
-//            if ( ::GetKeyState(VK_CONTROL) & 0x100 ) // Don't understand purpose of this test
-                if (!MSWOnChar((WORD)wParam, lParam))
-                    return Default();
-*/
-              break;
-            }
+                return Default();
+
+#ifdef VK_APPS
+            // special case of VK_APPS: treat it the same as right mouse click
+            // because both usually pop up a context menu
+            case VK_APPS:
+                {
+                    // construct the key mask
+                    WPARAM fwKeys = MK_RBUTTON;
+                    if ( (::GetKeyState(VK_CONTROL) & 0x100) != 0 )
+                        fwKeys |= MK_CONTROL;
+                    if ( (::GetKeyState(VK_SHIFT) & 0x100) != 0 )
+                        fwKeys |= MK_SHIFT;
+
+                    // simulate right mouse button click
+                    DWORD dwPos = ::GetMessagePos();
+                    int x = GET_X_LPARAM(dwPos),
+                        y = GET_Y_LPARAM(dwPos);
+
+                    ScreenToClient(&x, &y);
+                    MSWOnRButtonDown(x, y, fwKeys);
+                }
+                break;
+#endif // VK_APPS
+
             default:
                 if (!MSWOnChar((WORD)wParam, lParam))
                 {
                     return Default();
                 }
-/*
-                if ( ::GetKeyState(VK_CONTROL) & 0x100 )
-                    return Default();
-*/
                 break;
         }
 
         break;
-    }
+
     case WM_KEYUP:
     {
         if (!MSWOnKeyUp((WORD) wParam, lParam))
@@ -1483,6 +1498,62 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
     case WM_GETDLGCODE:
         return MSWGetDlgCode();
 
+    case WM_SETCURSOR:
+        {
+            // don't set cursor for other windows, only for this one: this
+            // prevents children of this window from gettign the same cursor
+            // as the parent has (don't forget that this message is propagated
+            // by default up the window parent-child hierarchy)
+            if ( (HWND)wParam == hWnd )
+            {
+                // don't set cursor when the mouse is not in the client part
+                short nHitTest = LOWORD(lParam);
+                if ( nHitTest == HTCLIENT || nHitTest == HTERROR )
+                {
+                    HCURSOR hcursor = 0;
+                    if ( wxIsBusy() )
+                    {
+                        // from msw\utils.cpp
+                        extern HCURSOR gs_wxBusyCursor;
+
+                        hcursor = gs_wxBusyCursor;
+                    }
+                    else
+                    {
+                        wxCursor *cursor = NULL;
+
+                        if ( m_windowCursor.Ok() )
+                        {
+                            cursor = &m_windowCursor;
+                        }
+                        else
+                        {
+                            // from msw\data.cpp
+                            extern wxCursor *g_globalCursor;
+
+                            if ( g_globalCursor && g_globalCursor->Ok() )
+                                cursor = g_globalCursor;
+                        }
+
+                        if ( cursor )
+                            hcursor = (HCURSOR)cursor->GetHCURSOR();
+                    }
+
+                    if ( hcursor )
+                    {
+                        ::SetCursor(hcursor);
+
+                        // returning TRUE stops the DefWindowProc() from
+                        // further processing this message - exactly what we
+                        // need because we've just set the cursor.
+                        return TRUE;
+                    }
+                }
+            }
+        }
+
+        return MSWDefWindowProc(message, wParam, lParam );
+
     default:
         return MSWDefWindowProc(message, wParam, lParam );
     }
@@ -2397,11 +2468,6 @@ void wxWindow::MSWOnRButtonDClick(int x, int y, WXUINT flags)
 void wxWindow::MSWOnMouseMove(int x, int y, WXUINT flags)
 {
     // 'normal' move event...
-    // Set cursor, but only if we're not in 'busy' mode
-
-    // Trouble with this is that it sets the cursor for controls too :-(
-    if (m_windowCursor.Ok() && !wxIsBusy())
-        ::SetCursor((HCURSOR) m_windowCursor.GetHCURSOR());
 
     if (!m_mouseInWindow)
     {