Fix IsEnabled() return value for wxMSW TLWs with native dialogs

IsEnabled() wrongly returned true even when the TLW was actually
disabled due to a native modal dialog using it as owner being currently
shown.

Fix this by trusting the actual HWND state, rather than our internal
m_isEnabled, except before the window is created.

Do it for TLWs only even if, in principle, we could check for
WS_DISABLED for the other windows too. However this would make
IsThisEnabled() inconsistent with the other platforms, where it returns
true when the window parent is disabled, but the window itself isn't,
which is currently also emulated by wxMSW, but wouldn't be the case if
we trusted WS_DISABLED presence. And while there might be other problems
due to lying about the actual window state in this function, it doesn't
seem to create any problems in practice, so for now leave the old logic
in place.

As a side effect, this makes wxWindowDisabler work correctly when a
message box is shown by another window when it's created, as it will now
correctly avoid re-enabling the message box parent in its dtor.

Closes https://github.com/wxWidgets/wxWidgets/pull/2117

See #11887.
This commit is contained in:
Vadim Zeitlin
2020-11-16 03:47:59 +01:00
parent b92d194ac4
commit b4338a30e1
3 changed files with 17 additions and 1 deletions

View File

@@ -24,6 +24,7 @@ public:
virtual bool Reparent(wxWindowBase* newParent) wxOVERRIDE;
virtual void InheritAttributes() wxOVERRIDE;
virtual bool IsThisEnabled() const wxOVERRIDE;
protected:
virtual bool DoClearShape() wxOVERRIDE;