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
|
||||
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,6 +17,11 @@ 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
|
||||
@@ -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}}}
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user