No changes, just update a comment about default buttons in wxMSW.

Remove the TODO from it because it's not really obvious if using the proposed
approach is such a good idea.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72669 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2012-10-13 22:54:09 +00:00
parent 403750325d
commit b0134e31e6

View File

@@ -192,16 +192,25 @@ wxSize wxButtonBase::GetDefaultSize()
// ----------------------------------------------------------------------------
/*
The comment below and all this code is probably due to not using WM_NEXTDLGCTL
message when changing focus (but just SetFocus() which is not enough), see
http://blogs.msdn.com/oldnewthing/archive/2004/08/02/205624.aspx for the
full explanation.
In normal Windows programs there is no need to handle default button
manually because this is taken care by the system provided you use
WM_NEXTDLGCTL and not just SetFocus() to switch focus betweeh the controls
(see http://blogs.msdn.com/oldnewthing/archive/2004/08/02/205624.aspx for
the full explanation why just calling SetFocus() is not enough).
TODO: Do use WM_NEXTDLGCTL and get rid of all this code.
However this only works if the window is a dialog, i.e. uses DefDlgProc(),
but not with plain windows using DefWindowProc() and we do want to have
default buttons inside frames as well, so we're forced to reimplement all
this logic ourselves. It would be great to avoid having to do this but using
DefDlgProc() for all the windows would almost certainly result in more
problems, we'd need to carefully filter messages and pass some of them to
DefWindowProc() and some of them to DefDlgProc() which looks dangerous (what
if the handling of some message changes in some Windows version?), so doing
this ourselves is probably a lesser evil.
Read the rest to learn everything you ever wanted to know about the default
buttons but were afraid to ask.
"Everything you ever wanted to know about the default buttons" or "Why do we
have to do all this?"
In MSW the default button should be activated when the user presses Enter
and the current control doesn't process Enter itself somehow. This is
@@ -223,14 +232,6 @@ wxSize wxButtonBase::GetDefaultSize()
to it. When the button loses focus, it unsets the temporary default and so
the default item will be the permanent default -- that is the default button
if any had been set or none otherwise, which is just what we want.
NB: all this is quite complicated by now and the worst is that normally
it shouldn't be necessary at all as for the normal Windows programs
DefWindowProc() and IsDialogMessage() take care of all this
automatically -- however in wxWidgets programs this doesn't work for
nested hierarchies (i.e. a notebook inside a notebook) for unknown
reason and so we have to reproduce all this code ourselves. It would be
very nice if we could avoid doing it.
*/
// set this button as the (permanently) default one in its panel