]> git.saurik.com Git - wxWidgets.git/commitdiff
wxWindowMSW now eats EVT_CHAR if the key was handled in EVT_KEY_DOWN
authorRobin Dunn <robin@alldunn.com>
Tue, 2 Apr 2002 00:36:29 +0000 (00:36 +0000)
committerRobin Dunn <robin@alldunn.com>
Tue, 2 Apr 2002 00:36:29 +0000 (00:36 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14900 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/latex/wx/keyevent.tex
include/wx/msw/window.h
src/msw/window.cpp

index 0abdc667d4cd0915ff2f79e5a5b30fb8344b694b..8f78c1a23c663e143ba0704f0e71081444024af3 100644 (file)
@@ -7,7 +7,7 @@ key down and up events and char events. The difference between the first two
 is clear - the first corresponds to a key press and the second to a key
 release - otherwise they are identical. Just note that if the key is
 maintained in a pressed state you will typically get a lot of (automatically
 is clear - the first corresponds to a key press and the second to a key
 release - otherwise they are identical. Just note that if the key is
 maintained in a pressed state you will typically get a lot of (automatically
-generated) down events but only up one so it is wrong to assume that there is
+generated) down events but only one up so it is wrong to assume that there is
 one up event corresponding to each down one.
 
 Both key events provide untranslated key codes while the char event carries
 one up event corresponding to each down one.
 
 Both key events provide untranslated key codes while the char event carries
@@ -17,17 +17,22 @@ from the \helpref{keycodes table}{keycodes}. The translated key is, in
 general, the character the user expects to appear as the result of the key
 combination when typing the text into a text entry zone, for example.
 
 general, the character the user expects to appear as the result of the key
 combination when typing the text into a text entry zone, for example.
 
+If the key up event is caught and the event handler does not call
+event.Skip() then the coresponding char event will not happen.  This
+is by design and enables the programs that handle both types of events
+to be a bit simpler.
+
 A few examples to clarify this (all assume that {\sc Caps Lock} is unpressed
 and the standard US keyboard): when the {\tt 'A'} key is pressed, the key down
 event key code is equal to {\tt ASCII A} $== 65$. But the char event key code
 is {\tt ASCII a} $== 97$. On the other hand, if you press both {\sc Shift} and
 {\tt 'A'} keys simultaneously , the key code in key down event will still be
 A few examples to clarify this (all assume that {\sc Caps Lock} is unpressed
 and the standard US keyboard): when the {\tt 'A'} key is pressed, the key down
 event key code is equal to {\tt ASCII A} $== 65$. But the char event key code
 is {\tt ASCII a} $== 97$. On the other hand, if you press both {\sc Shift} and
 {\tt 'A'} keys simultaneously , the key code in key down event will still be
-just {\tt 'A'} while the char event key code parameter will now be {\tt 'A'} 
+just {\tt 'A'} while the char event key code parameter will now be {\tt 'A'}
 as well.
 
 Although in this simple case it is clear that the correct key code could be
 as well.
 
 Although in this simple case it is clear that the correct key code could be
-found in the key down event handler by checking the value returned by 
-\helpref{ShiftDown()}{wxkeyeventshiftdown}, in general you should use 
+found in the key down event handler by checking the value returned by
+\helpref{ShiftDown()}{wxkeyeventshiftdown}, in general you should use
 {\tt EVT\_CHAR} for this as for non alphanumeric keys the translation is
 keyboard-layout dependent and can only be done properly by the system itself.
 
 {\tt EVT\_CHAR} for this as for non alphanumeric keys the translation is
 keyboard-layout dependent and can only be done properly by the system itself.
 
@@ -41,7 +46,7 @@ running the \helpref{text}{sampletext} wxWindows sample and pressing some keys
 in any of the text controls shown in it.
 
 {\bf Note for Windows programmers:} The key and char events in wxWindows are
 in any of the text controls shown in it.
 
 {\bf Note for Windows programmers:} The key and char events in wxWindows are
-similar to but slightly different from Windows {\tt WM\_KEYDOWN} and 
+similar to but slightly different from Windows {\tt WM\_KEYDOWN} and
 {\tt WM\_CHAR} events. In particular, Alt-x combination will generate a char
 event in wxWindows (unless it is used as an acclerator).
 
 {\tt WM\_CHAR} events. In particular, Alt-x combination will generate a char
 event in wxWindows (unless it is used as an acclerator).
 
@@ -66,12 +71,6 @@ functions that take a wxKeyEvent argument.
 %\twocolitem{{\bf EVT\_CHAR\_HOOK(func)}}{Process a wxEVT\_CHAR\_HOOK event.}
 \end{twocollist}%
 
 %\twocolitem{{\bf EVT\_CHAR\_HOOK(func)}}{Process a wxEVT\_CHAR\_HOOK event.}
 \end{twocollist}%
 
-\wxheading{See also}
-
-\helpref{wxWindow::OnChar}{wxwindowonchar}, 
-\helpref{wxWindow::OnCharHook}{wxwindowoncharhook}, 
-\helpref{wxWindow::OnKeyDown}{wxwindowonkeydown}, 
-\helpref{wxWindow::OnKeyUp}{wxwindowonkeyup}
 
 \latexignore{\rtfignore{\wxheading{Members}}}
 
 
 \latexignore{\rtfignore{\wxheading{Members}}}
 
@@ -176,7 +175,7 @@ Obtains the position at which the key was pressed.
 Returns TRUE if either {\sc Ctrl} or {\sc Alt} keys was down
 at the time of the key event. Note that this function does not take into
 account neither {\sc Shift} nor {\sc Meta} key states (the reason for ignoring
 Returns TRUE if either {\sc Ctrl} or {\sc Alt} keys was down
 at the time of the key event. Note that this function does not take into
 account neither {\sc Shift} nor {\sc Meta} key states (the reason for ignoring
-the latter is that it is common for {\sc NumLock} key to be configured as 
+the latter is that it is common for {\sc NumLock} key to be configured as
 {\sc Meta} under X but the key presses even while {\sc NumLock} is on should
 be still processed normally).
 
 {\sc Meta} under X but the key presses even while {\sc NumLock} is on should
 be still processed normally).
 
index d15f9a208ebefcd6bfb769819c0c7ca569bf9bed..a43525a245d902c7e2d4ea6420da002adac23ec8 100644 (file)
@@ -419,6 +419,7 @@ protected:
     bool                  m_backgroundTransparent:1;
     bool                  m_mouseInWindow:1;
     bool                  m_doubleClickAllowed:1;
     bool                  m_backgroundTransparent:1;
     bool                  m_mouseInWindow:1;
     bool                  m_doubleClickAllowed:1;
+    bool                  m_lastKeydownProcessed:1;
 
     // the size of one page for scrolling
     int                   m_xThumbSize;
 
     // the size of one page for scrolling
     int                   m_xThumbSize;
@@ -446,7 +447,7 @@ protected:
 
     virtual void DoCaptureMouse();
     virtual void DoReleaseMouse();
 
     virtual void DoCaptureMouse();
     virtual void DoReleaseMouse();
-    
+
     // move the window to the specified location and resize it: this is called
     // from both DoSetSize() and DoSetClientSize() and would usually just call
     // ::MoveWindow() except for composite controls which will want to arrange
     // move the window to the specified location and resize it: this is called
     // from both DoSetSize() and DoSetClientSize() and would usually just call
     // ::MoveWindow() except for composite controls which will want to arrange
index 4ee8e7b1f36dfbd65187e9e42c997bc09f4a05b1..7e0faddaea933af6a163e1ca23ee25f63117449f 100644 (file)
@@ -297,6 +297,7 @@ void wxWindowMSW::Init()
     m_oldWndProc = 0;
     m_useCtl3D = FALSE;
     m_mouseInWindow = FALSE;
     m_oldWndProc = 0;
     m_useCtl3D = FALSE;
     m_mouseInWindow = FALSE;
+    m_lastKeydownProcessed = FALSE;
 
     // wxWnd
     m_hMenu = 0;
 
     // wxWnd
     m_hMenu = 0;
@@ -2463,12 +2464,13 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam
 
         case WM_SYSKEYDOWN:
         case WM_KEYDOWN:
 
         case WM_SYSKEYDOWN:
         case WM_KEYDOWN:
+            m_lastKeydownProcessed = FALSE;
             // If this has been processed by an event handler,
             // return 0 now (we've handled it).
             if ( HandleKeyDown((WORD) wParam, lParam) )
             {
                 processed = TRUE;
             // If this has been processed by an event handler,
             // return 0 now (we've handled it).
             if ( HandleKeyDown((WORD) wParam, lParam) )
             {
                 processed = TRUE;
-
+                m_lastKeydownProcessed = TRUE;
                 break;
             }
 
                 break;
             }
 
@@ -2476,7 +2478,6 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam
             if ( wParam == VK_SHIFT || wParam == VK_CONTROL )
             {
                 processed = TRUE;
             if ( wParam == VK_SHIFT || wParam == VK_CONTROL )
             {
                 processed = TRUE;
-
                 break;
             }
 
                 break;
             }
 
@@ -4035,6 +4036,14 @@ wxKeyEvent wxWindowMSW::CreateKeyEvent(wxEventType evType,
 // WM_KEYDOWN one
 bool wxWindowMSW::HandleChar(WXWPARAM wParam, WXLPARAM lParam, bool isASCII)
 {
 // WM_KEYDOWN one
 bool wxWindowMSW::HandleChar(WXWPARAM wParam, WXLPARAM lParam, bool isASCII)
 {
+    if (m_lastKeydownProcessed) {
+        // The key was handled in the EVT_KEY_DOWN.  Handling a key in an
+        // EVT_KEY_DOWN handler is meant, by design, to prevent EVT_CHARs
+        // from happening, so just bail out at this point.
+        m_lastKeydownProcessed = FALSE;
+        return TRUE;
+    }
+
     bool ctrlDown = FALSE;
 
     int id;
     bool ctrlDown = FALSE;
 
     int id;