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,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
|
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
|
||||||
@@ -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}}}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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