wxWindowMSW now eats EVT_CHAR if the key was handled in EVT_KEY_DOWN
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14900 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -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
|
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
|
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
|
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.
|
one up event corresponding to each down one.
|
||||||
|
|
||||||
Both key events provide untranslated key codes while the char event carries
|
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
|
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.
|
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
|
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
|
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
|
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
|
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
|
{\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.
|
as well.
|
||||||
|
|
||||||
Although in this simple case it is clear that the correct key code could be
|
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
|
found in the key down event handler by checking the value returned by
|
||||||
\helpref{ShiftDown()}{wxkeyeventshiftdown}, in general you should use
|
\helpref{ShiftDown()}{wxkeyeventshiftdown}, in general you should use
|
||||||
{\tt EVT\_CHAR} for this as for non alphanumeric keys the translation is
|
{\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.
|
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.
|
in any of the text controls shown in it.
|
||||||
|
|
||||||
{\bf Note for Windows programmers:} The key and char events in wxWindows are
|
{\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
|
{\tt WM\_CHAR} events. In particular, Alt-x combination will generate a char
|
||||||
event in wxWindows (unless it is used as an acclerator).
|
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.}
|
%\twocolitem{{\bf EVT\_CHAR\_HOOK(func)}}{Process a wxEVT\_CHAR\_HOOK event.}
|
||||||
\end{twocollist}%
|
\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
|
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
|
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
|
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
|
{\sc Meta} under X but the key presses even while {\sc NumLock} is on should
|
||||||
be still processed normally).
|
be still processed normally).
|
||||||
|
|
||||||
|
@@ -419,6 +419,7 @@ protected:
|
|||||||
bool m_backgroundTransparent:1;
|
bool m_backgroundTransparent:1;
|
||||||
bool m_mouseInWindow:1;
|
bool m_mouseInWindow:1;
|
||||||
bool m_doubleClickAllowed:1;
|
bool m_doubleClickAllowed:1;
|
||||||
|
bool m_lastKeydownProcessed:1;
|
||||||
|
|
||||||
// the size of one page for scrolling
|
// the size of one page for scrolling
|
||||||
int m_xThumbSize;
|
int m_xThumbSize;
|
||||||
@@ -446,7 +447,7 @@ protected:
|
|||||||
|
|
||||||
virtual void DoCaptureMouse();
|
virtual void DoCaptureMouse();
|
||||||
virtual void DoReleaseMouse();
|
virtual void DoReleaseMouse();
|
||||||
|
|
||||||
// move the window to the specified location and resize it: this is called
|
// move the window to the specified location and resize it: this is called
|
||||||
// from both DoSetSize() and DoSetClientSize() and would usually just call
|
// from both DoSetSize() and DoSetClientSize() and would usually just call
|
||||||
// ::MoveWindow() except for composite controls which will want to arrange
|
// ::MoveWindow() except for composite controls which will want to arrange
|
||||||
|
@@ -297,6 +297,7 @@ void wxWindowMSW::Init()
|
|||||||
m_oldWndProc = 0;
|
m_oldWndProc = 0;
|
||||||
m_useCtl3D = FALSE;
|
m_useCtl3D = FALSE;
|
||||||
m_mouseInWindow = FALSE;
|
m_mouseInWindow = FALSE;
|
||||||
|
m_lastKeydownProcessed = FALSE;
|
||||||
|
|
||||||
// wxWnd
|
// wxWnd
|
||||||
m_hMenu = 0;
|
m_hMenu = 0;
|
||||||
@@ -2463,12 +2464,13 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam
|
|||||||
|
|
||||||
case WM_SYSKEYDOWN:
|
case WM_SYSKEYDOWN:
|
||||||
case WM_KEYDOWN:
|
case WM_KEYDOWN:
|
||||||
|
m_lastKeydownProcessed = FALSE;
|
||||||
// If this has been processed by an event handler,
|
// If this has been processed by an event handler,
|
||||||
// return 0 now (we've handled it).
|
// return 0 now (we've handled it).
|
||||||
if ( HandleKeyDown((WORD) wParam, lParam) )
|
if ( HandleKeyDown((WORD) wParam, lParam) )
|
||||||
{
|
{
|
||||||
processed = TRUE;
|
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 )
|
if ( wParam == VK_SHIFT || wParam == VK_CONTROL )
|
||||||
{
|
{
|
||||||
processed = TRUE;
|
processed = TRUE;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4035,6 +4036,14 @@ wxKeyEvent wxWindowMSW::CreateKeyEvent(wxEventType evType,
|
|||||||
// WM_KEYDOWN one
|
// WM_KEYDOWN one
|
||||||
bool wxWindowMSW::HandleChar(WXWPARAM wParam, WXLPARAM lParam, bool isASCII)
|
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;
|
bool ctrlDown = FALSE;
|
||||||
|
|
||||||
int id;
|
int id;
|
||||||
|
Reference in New Issue
Block a user