keyboard/focus handling improved a bit more:
1. wxFrame doesn't give focus to anything at all on activation 2. last control restored more often (some problems still persist) 3. buttons process enter 4. text controls with wxTE_PROCESS_TAB still leave TAB work as dialog navigation key if the event wasn't processed git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2842 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -246,6 +246,11 @@ void wxWindow::Init()
|
||||
// wxWnd
|
||||
m_hMenu = 0;
|
||||
|
||||
m_hWnd = 0;
|
||||
|
||||
// pass WM_GETDLGCODE to DefWindowProc()
|
||||
m_lDlgCode = 0;
|
||||
|
||||
m_xThumbSize = 0;
|
||||
m_yThumbSize = 0;
|
||||
m_backgroundTransparent = FALSE;
|
||||
@@ -325,11 +330,6 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
|
||||
DLGC_WANTTAB | DLGC_WANTMESSAGE;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// default behaviour
|
||||
m_lDlgCode = 0;
|
||||
}
|
||||
|
||||
MSWCreate(m_windowId, parent, wxCanvasClassName, this, NULL,
|
||||
pos.x, pos.y,
|
||||
@@ -1382,6 +1382,7 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
|
||||
if ( bProcess )
|
||||
{
|
||||
bool bCtrlDown = (::GetKeyState(VK_CONTROL) & 0x100) != 0;
|
||||
bool bShiftDown = (::GetKeyState(VK_SHIFT) & 0x100) != 0;
|
||||
|
||||
// WM_GETDLGCODE: ask the control if it wants the key for itself,
|
||||
// don't process it if it's the case (except for Ctrl-Tab/Enter
|
||||
@@ -1398,13 +1399,16 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
|
||||
switch ( msg->wParam )
|
||||
{
|
||||
case VK_TAB:
|
||||
if ( lDlgCode & DLGC_WANTTAB ) {
|
||||
// assume that nobody wants Shift-TAB for himself - if we
|
||||
// don't do it there is no easy way for a control to grab
|
||||
// TABs but still let Shift-TAB work as navugation key
|
||||
if ( (lDlgCode & DLGC_WANTTAB) && !bShiftDown ) {
|
||||
bProcess = FALSE;
|
||||
}
|
||||
else {
|
||||
// Ctrl-Tab cycles thru notebook pages
|
||||
bWindowChange = bCtrlDown;
|
||||
bForward = !(::GetKeyState(VK_SHIFT) & 0x100);
|
||||
bForward = !bShiftDown;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1431,6 +1435,11 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
|
||||
// it
|
||||
return FALSE;
|
||||
}
|
||||
else if ( lDlgCode & DLGC_BUTTON )
|
||||
{
|
||||
// buttons want process Enter themselevs
|
||||
bProcess = FALSE;
|
||||
}
|
||||
// else: but if it does not it makes sense to make it
|
||||
// work like a TAB - and that's what we do.
|
||||
// Note that Ctrl-Enter always works this way.
|
||||
@@ -2318,10 +2327,10 @@ bool wxWindow::HandleSetFocus(WXHWND WXUNUSED(hwnd))
|
||||
#endif // wxUSE_CARET
|
||||
|
||||
// panel wants to track the window which was the last to have focus in it
|
||||
wxWindow *parent = GetParent();
|
||||
if ( parent && parent->IsKindOf(CLASSINFO(wxPanel)) )
|
||||
wxPanel *panel = wxDynamicCast(GetParent(), wxPanel);
|
||||
if ( panel )
|
||||
{
|
||||
((wxPanel *)parent)->SetLastFocus(GetId());
|
||||
panel->SetLastFocus(this);
|
||||
}
|
||||
|
||||
wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId);
|
||||
|
Reference in New Issue
Block a user