From 507abc7b3af8d73e7caf05261d1f40b51775ae7a Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 28 Jul 2006 23:48:50 +0000 Subject: [PATCH] allow changing the page from keyboard in property sheet like controls even when the notebook doesn't have focus git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40355 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/toplevel.h | 3 +++ src/msw/toplevel.cpp | 42 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/include/wx/msw/toplevel.h b/include/wx/msw/toplevel.h index 64359f658d..cc6e916466 100644 --- a/include/wx/msw/toplevel.h +++ b/include/wx/msw/toplevel.h @@ -103,6 +103,9 @@ public: // choose the right parent to use with CreateWindow() virtual WXHWND MSWGetParent() const; + // return true if the message was preprocessed and shouldn't be dispatched + virtual bool MSWProcessMessage(WXMSG* pMsg); + // window proc for the frames WXLRESULT MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam); diff --git a/src/msw/toplevel.cpp b/src/msw/toplevel.cpp index bdd1e301c4..ac6b7b0840 100644 --- a/src/msw/toplevel.cpp +++ b/src/msw/toplevel.cpp @@ -331,6 +331,48 @@ bool wxTopLevelWindowMSW::HandleSettingChange(WXWPARAM wParam, WXLPARAM lParam) } #endif +bool wxTopLevelWindowMSW::MSWProcessMessage(WXMSG* pMsg) +{ + // MSW specific feature: if the dialog has only one notebook-like child + // window (actually it could be any window that returns true from its + // HasMultiplePages()), then [Shift-]Ctrl-Tab and Ctrl-PageUp/Down keys + // should iterate over its pages even if the focus is outside of the + // control because this is how the standard MSW properties dialogs behave + if ( pMsg->message == WM_KEYDOWN && wxIsCtrlDown() && + (pMsg->wParam == VK_TAB || + pMsg->wParam == VK_PRIOR || + pMsg->wParam == VK_NEXT) ) + { + // check if we have a unique notebook-like child + wxWindow *bookctrl = NULL; + for ( wxWindowList::const_iterator i = GetChildren().begin(), + end = GetChildren().end(); + i != end; + ++i ) + { + wxWindow * const window = *i; + if ( window->HasMultiplePages() ) + { + if ( bookctrl ) + { + // this is the second book-like control already so don't do + // anything as we don't know which one should have its page + // changed + bookctrl = NULL; + break; + } + + bookctrl = window; + } + } + + if ( bookctrl && bookctrl->wxWindowMSW::MSWProcessMessage(pMsg) ) + return true; + } + + return wxTopLevelWindowBase::MSWProcessMessage(pMsg); +} + WXLRESULT wxTopLevelWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) { WXLRESULT rc = 0; -- 2.47.2