Fix skipping the event in wxEVT_TEXT_ENTER handler in wxMSW
Skipping the event is supposed to have the same effect as not handling the event at all, but in wxMSW wxTE_PROCESS_ENTER style must be specified for a wxEVT_TEXT_ENTER handler to be executed at all and if this style is used, then the default handling in MSWProcessMessage() which normally happens before calling the handler doesn't take place at all. Work around this by explicitly performing the default "Enter" key action if the event generated by it wasn't handled to make wxMSW behaviour more intuitive.
This commit is contained in:
parent
99a1526ee3
commit
4edae7238a
@ -2603,7 +2603,14 @@ void TestDefaultActionDialog::OnCatchListBoxDClick(wxCommandEvent& WXUNUSED(even
|
||||
|
||||
void TestDefaultActionDialog::OnTextEnter(wxCommandEvent& event)
|
||||
{
|
||||
wxLogMessage("Text \"%s\" entered.", event.GetString());
|
||||
const wxString& text = event.GetString();
|
||||
if ( text.empty() )
|
||||
{
|
||||
event.Skip();
|
||||
return;
|
||||
}
|
||||
|
||||
wxLogMessage("Text \"%s\" entered.", text);
|
||||
}
|
||||
|
||||
void MyFrame::OnTestDefaultActionDialog(wxCommandEvent& WXUNUSED(event))
|
||||
|
@ -2066,6 +2066,27 @@ wxTextCtrl::MSWHandleMessage(WXLRESULT *rc,
|
||||
{
|
||||
bool processed = wxTextCtrlBase::MSWHandleMessage(rc, nMsg, wParam, lParam);
|
||||
|
||||
// Handle the special case of "Enter" key: the user code needs to specify
|
||||
// wxTE_PROCESS_ENTER style to get it in the first place, but if this flag
|
||||
// is used, then even if the wxEVT_TEXT_ENTER handler skips the event, the
|
||||
// normal action of this key is not performed because IsDialogMessage() is
|
||||
// not called and, also, an annoying beep is generated by EDIT default
|
||||
// WndProc.
|
||||
//
|
||||
// Fix these problems by explicitly performing the default function of this
|
||||
// key (which would be done by MSWProcessMessage() if we didn't have
|
||||
// wxTE_PROCESS_ENTER) and preventing the default WndProc from getting it.
|
||||
if ( nMsg == WM_CHAR &&
|
||||
!processed &&
|
||||
HasFlag(wxTE_PROCESS_ENTER) &&
|
||||
wParam == VK_RETURN &&
|
||||
!wxIsAnyModifierDown() )
|
||||
{
|
||||
MSWClickButtonIfPossible(MSWGetDefaultButtonFor(this));
|
||||
|
||||
processed = true;
|
||||
}
|
||||
|
||||
switch ( nMsg )
|
||||
{
|
||||
case WM_GETDLGCODE:
|
||||
|
Loading…
Reference in New Issue
Block a user