Applied patch [ 1845819 ] wxMSW Top level window freeze fix for trunk

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50681 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2007-12-13 20:56:15 +00:00
parent e49d331c47
commit 0dd9b9e2be
3 changed files with 65 additions and 2 deletions

View File

@@ -75,6 +75,12 @@ public:
virtual bool SetTransparent(wxByte alpha); virtual bool SetTransparent(wxByte alpha);
virtual bool CanSetTransparent(); virtual bool CanSetTransparent();
//Top level windows have different freeze semantics on Windows
virtual void Freeze();
virtual void Thaw();
virtual void AddChild( wxWindowBase *child );
// implementation from now on // implementation from now on
// -------------------------- // --------------------------

View File

@@ -555,8 +555,7 @@ private:
bool HandleNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); bool HandleNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
// number of calls to Freeze() minus number of calls to Thaw()
unsigned int m_frozenness;
// current defer window position operation handle (may be NULL) // current defer window position operation handle (may be NULL)
WXHANDLE m_hDWP; WXHANDLE m_hDWP;
@@ -568,6 +567,10 @@ protected:
wxPoint m_pendingPosition; wxPoint m_pendingPosition;
wxSize m_pendingSize; wxSize m_pendingSize;
// number of calls to Freeze() minus number of calls to Thaw()
// protected so that wxTopLevelWindowMSW can access it
unsigned int m_frozenness;
private: private:
#ifdef __POCKETPC__ #ifdef __POCKETPC__
bool m_contextMenuEnabled; bool m_contextMenuEnabled;

View File

@@ -1170,6 +1170,60 @@ bool wxTopLevelWindowMSW::CanSetTransparent()
return (os_type == wxOS_WINDOWS_NT && ver_major >= 5); return (os_type == wxOS_WINDOWS_NT && ver_major >= 5);
} }
void wxTopLevelWindowMSW::Freeze()
{
if ( !m_frozenness++) {
if (IsShown()) {
for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
node;
node = node->GetNext() )
{
wxWindow *child = node->GetData();
if ( child->IsTopLevel() )
continue;
else
child->Freeze();
}
}
}
}
void wxTopLevelWindowMSW::Thaw()
{
wxASSERT_MSG( m_frozenness > 0, _T("Thaw() without matching Freeze()") );
if ( --m_frozenness == 0 )
{
if ( IsShown() ) {
for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
node;
node = node->GetNext() )
{
wxWindow *child = node->GetData();
if ( child->IsTopLevel() )
continue;
else
child->Thaw();
}
}
}
}
void wxTopLevelWindowMSW::AddChild(wxWindowBase *child )
{
//adding a child while frozen will assert when thawn,
// so freeze it
if (child && !child->IsTopLevel() && IsFrozen()) {
//need to match our current freeze level
for (unsigned int ii=0;ii< m_frozenness;ii++) {
child->Freeze();
}
}
wxTopLevelWindowBase::AddChild(child);
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxTopLevelWindow event handling // wxTopLevelWindow event handling
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------