]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/window.cpp
Added $(NEW_WXLIBNAME) to allow changing the library or DLL name
[wxWidgets.git] / src / msw / window.cpp
index 750f5c7c53093f0e67eab2e59cb7348ce9ad7cab..7149e45154d3609a3fb02dbb148b0eefa1f3a3eb 100644 (file)
@@ -59,6 +59,8 @@
 
 #include "wx/msw/private.h"
 
+#include "wx/textctrl.h"
+
 #include <string.h>
 
 #ifndef __GNUWIN32__
@@ -234,6 +236,7 @@ void wxWindow::Init()
     m_isWindow = TRUE;
 
     // Generic
+//    m_windowCursor = * wxSTANDARD_CURSOR;
     m_windowId = 0;
     m_isShown = TRUE;
     m_windowStyle = 0;
@@ -938,7 +941,7 @@ LRESULT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
     #define DIMENSION_TYPE int
 #endif
 
-// Main Windows window proc
+// Main Windows window proc
 long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
 {
     wxASSERT( m_lastMsg == message &&
@@ -1176,6 +1179,7 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
             return MSWOnSysCommand(wParam, lParam);
             break;
         }
+
     case WM_COMMAND:
         {
 #ifdef __WIN32__
@@ -1227,14 +1231,11 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
             return MSWOnMeasureItem((int)wParam, (WXMEASUREITEMSTRUCT *)lParam);
             break;
         }
-
     case WM_KEYDOWN:
         // If this has been processed by an event handler,
         // return 0 now (we've handled it).
-        if (MSWOnKeyDown((WORD) wParam, lParam))
-        {
-            return 0;
-        }
+        if ( MSWOnKeyDown((WORD) wParam, lParam) )
+            break;
 
         // we consider these message "not interesting" to OnChar
         if ( wParam == VK_SHIFT || wParam == VK_CONTROL )
@@ -1242,21 +1243,25 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
             return Default();
         }
 
-        // Avoid duplicate messages to OnChar for these special keys
         switch ( wParam )
         {
+            // avoid duplicate messages to OnChar for these ASCII keys: they
+            // will be translated by TranslateMessage() and received in WM_CHAR
             case VK_ESCAPE:
             case VK_SPACE:
             case VK_RETURN:
             case VK_BACK:
             case VK_TAB:
-            case VK_LEFT:
-            case VK_RIGHT:
-            case VK_DOWN:
-            case VK_UP:
                 return Default();
 
 #ifdef VK_APPS
+
+            // normally these macros would be defined in windows.h
+#ifndef GET_X_LPARAM
+    #define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
+    #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
+#endif
+
             // special case of VK_APPS: treat it the same as right mouse click
             // because both usually pop up a context menu
             case VK_APPS:
@@ -1279,28 +1284,28 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
                 break;
 #endif // VK_APPS
 
+            case VK_LEFT:
+            case VK_RIGHT:
+            case VK_DOWN:
+            case VK_UP:
             default:
-                if (!MSWOnChar((WORD)wParam, lParam))
+                if ( !MSWOnChar((WORD)wParam, lParam) )
                 {
                     return Default();
                 }
                 break;
         }
-
         break;
 
     case WM_KEYUP:
-    {
-        if (!MSWOnKeyUp((WORD) wParam, lParam))
+        if ( !MSWOnKeyUp((WORD) wParam, lParam) )
             return Default();
         break;
-    }
+
     case WM_CHAR: // Always an ASCII character
-        {
-            if (!MSWOnChar((WORD)wParam, lParam, TRUE))
-                return Default();
-            break;
-        }
+        if ( !MSWOnChar((WORD)wParam, lParam, TRUE) )
+            return Default();
+        break;
 
     case WM_HSCROLL:
         {
@@ -1479,7 +1484,6 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
                 return 1L;
             break;
         }
-
     case WM_GETMINMAXINFO:
         {
             MINMAXINFO *info = (MINMAXINFO *)lParam;
@@ -1494,55 +1498,63 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
             return MSWDefWindowProc(message, wParam, lParam );
             break;
         }
-
     case WM_GETDLGCODE:
-        return MSWGetDlgCode();
-
+        {
+            return MSWGetDlgCode();
+        }
     case WM_SETCURSOR:
         {
-            // don't set cursor when the mouse is not in the client part
-            short nHitTest = LOWORD(lParam);
-            if ( nHitTest == HTCLIENT || nHitTest == HTERROR )
+            // 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 )
             {
-                HCURSOR hcursor = 0;
-                if ( wxIsBusy() )
-                {
-                    extern HCURSOR gs_wxBusyCursor; // from msw\utils.cpp
-
-                    hcursor = gs_wxBusyCursor;
-                }
-                else
+                // don't set cursor when the mouse is not in the client part
+                short nHitTest = LOWORD(lParam);
+                if ( nHitTest == HTCLIENT || nHitTest == HTERROR )
                 {
-                    wxCursor *cursor = NULL;
-
-                    if ( m_windowCursor.Ok() )
+                    HCURSOR hcursor = 0;
+                    if ( wxIsBusy() )
                     {
-                        cursor = &m_windowCursor;
+                        // from msw\utils.cpp
+                        extern HCURSOR gs_wxBusyCursor;
+
+                        hcursor = gs_wxBusyCursor;
                     }
                     else
                     {
-                        extern wxCursor *g_globalCursor; // from msw\data.cpp
+                        wxCursor *cursor = NULL;
 
-                        if ( g_globalCursor && g_globalCursor->Ok() )
-                            cursor = g_globalCursor;
-                    }
+                        if ( m_windowCursor.Ok() )
+                        {
+                            cursor = &m_windowCursor;
+                        }
+                        else
+                        {
+                            // from msw\data.cpp
+                            extern wxCursor *g_globalCursor;
 
-                    if ( cursor )
-                        hcursor = (HCURSOR)cursor->GetHCURSOR();
-                }
+                            if ( g_globalCursor && g_globalCursor->Ok() )
+                                cursor = g_globalCursor;
+                        }
 
-                if ( hcursor )
-                {
-                    ::SetCursor(hcursor);
+                        if ( cursor )
+                            hcursor = (HCURSOR)cursor->GetHCURSOR();
+                    }
 
-                    // returning TRUE stops the DefWindowProc() from further
-                    // processing this message - exactly what we need because we've
-                    // just set the cursor.
-                    return TRUE;
+                    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:
@@ -2026,21 +2038,23 @@ long wxWindow::MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
 
 long wxWindow::Default()
 {
-    // Ignore 'fake' events (perhaps generated as a result of a separate real event)
-    if (m_lastMsg == 0)
+    // Ignore 'fake' events (perhaps generated as a result of a separate real
+    // event)
+    if ( m_lastMsg == 0 )
         return 0;
 
 #ifdef __WXDEBUG__
     wxLogTrace(wxTraceMessages, "Forwarding %s to DefWindowProc.",
-        wxGetMessageName(m_lastMsg));
+               wxGetMessageName(m_lastMsg));
 #endif // __WXDEBUG__
 
-    return this->MSWDefWindowProc(m_lastMsg, m_lastWParam, m_lastLParam);
+    return MSWDefWindowProc(m_lastMsg, m_lastWParam, m_lastLParam);
 }
 
 bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
 {
-    if ( m_hWnd != 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL) ) {
+    if ( m_hWnd != 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL) )
+    {
         // intercept dialog navigation keys
         MSG *msg = (MSG *)pMsg;
         bool bProcess = TRUE;
@@ -2138,6 +2152,7 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
         if ( ::IsDialogMessage((HWND)GetHWND(), msg) )
             return TRUE;
     }
+
 #if wxUSE_TOOLTIPS
     if ( m_tooltip )
     {
@@ -2148,6 +2163,19 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
     }
 #endif // wxUSE_TOOLTIPS
 
+/* This code manages to disable character input completely. Nice one!
+ * Probably because the dialog is requesting all char input. Or,
+ * it gets called by non-dialog windows.
+
+    // In case we don't have wxTAB_TRAVERSAL style on.
+    // If we don't call this, we may never process Enter correctly.
+    if ( m_hWnd != 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL) == 0 )
+    {
+        MSG *msg = (MSG *)pMsg;
+        if ( ::IsDialogMessage((HWND)GetHWND(), msg) )
+            return TRUE;
+    }
+*/
     return FALSE;
 }
 
@@ -2537,6 +2565,8 @@ void wxWindow::MSWOnMouseLeave(int x, int y, WXUINT flags)
     GetEventHandler()->ProcessEvent(event);
 }
 
+// isASCII is TRUE only when we're called from WM_CHAR handler and not from
+// WM_KEYDOWN one
 bool wxWindow::MSWOnChar(WXWORD wParam, WXLPARAM lParam, bool isASCII)
 {
     int id;
@@ -2608,7 +2638,7 @@ bool wxWindow::MSWOnChar(WXWORD wParam, WXLPARAM lParam, bool isASCII)
         return FALSE;
 }
 
-bool wxWindow::MSWOnKeyDown(WXWORD wParam, WXLPARAM lParam, bool isASCII)
+bool wxWindow::MSWOnKeyDown(WXWORD wParam, WXLPARAM lParam)
 {
     int id;
 
@@ -2649,7 +2679,7 @@ bool wxWindow::MSWOnKeyDown(WXWORD wParam, WXLPARAM lParam, bool isASCII)
     }
 }
 
-bool wxWindow::MSWOnKeyUp(WXWORD wParam, WXLPARAM lParam, bool isASCII)
+bool wxWindow::MSWOnKeyUp(WXWORD wParam, WXLPARAM lParam)
 {
     int id;
 
@@ -3756,14 +3786,7 @@ WXDWORD wxWindow::Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D)
 
 void wxWindow::OnChar(wxKeyEvent& event)
 {
-    bool isVirtual;
-    int id = wxCharCodeWXToMSW((int)event.KeyCode(), &isVirtual);
-
-    if ( id == -1 )
-        id= m_lastWParam;
-
-    if ( !event.ControlDown() ) // Why this test?
-        (void) MSWDefWindowProc(m_lastMsg, (WPARAM) id, m_lastLParam);
+    event.Skip();
 }
 
 void wxWindow::OnKeyDown(wxKeyEvent& event)