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:
parent
21b529859e
commit
68304caffe
@ -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
|
||||
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
|
||||
@ -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.
|
||||
|
||||
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
|
||||
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
|
||||
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.
|
||||
|
||||
@ -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
|
||||
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).
|
||||
|
||||
@ -66,12 +71,6 @@ functions that take a wxKeyEvent argument.
|
||||
%\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}}}
|
||||
|
||||
@ -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
|
||||
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).
|
||||
|
||||
|
@ -419,6 +419,7 @@ protected:
|
||||
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;
|
||||
@ -446,7 +447,7 @@ protected:
|
||||
|
||||
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
|
||||
|
@ -297,6 +297,7 @@ void wxWindowMSW::Init()
|
||||
m_oldWndProc = 0;
|
||||
m_useCtl3D = FALSE;
|
||||
m_mouseInWindow = FALSE;
|
||||
m_lastKeydownProcessed = FALSE;
|
||||
|
||||
// wxWnd
|
||||
m_hMenu = 0;
|
||||
@ -2463,12 +2464,13 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam
|
||||
|
||||
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;
|
||||
|
||||
m_lastKeydownProcessed = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -2476,7 +2478,6 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam
|
||||
if ( wParam == VK_SHIFT || wParam == VK_CONTROL )
|
||||
{
|
||||
processed = TRUE;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@ -4035,6 +4036,14 @@ wxKeyEvent wxWindowMSW::CreateKeyEvent(wxEventType evType,
|
||||
// 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;
|
||||
|
Loading…
Reference in New Issue
Block a user