|

楼主 |
发表于 2009-1-9 19:46:00
|
显示全部楼层
Re: 过程式编程的穷途末路之一
看一下我的代码(部分)。只是设置一下visible就要这么麻烦
void CCore::SetWndNodeVisible(WND_HANDLE hwnd,Bool node)
{
if(!hwnd)return;
if(!(*hwnd))return;
if( node == (*hwnd)->bNodeVisible ) return;
if( IsWndVisibleReally(hwnd) )
{
INST_ASSERT( (*hwnd)->bNodeVisible );
Array<WND_HANDLE> VisibleDescendants;
_EnumVisibleDescendants(hwnd,VisibleDescendants);
INST_ASSERT(False==node);
(*hwnd)->bNodeVisible = node;
INST_ASSERT( False == IsWndVisibleReally(hwnd) );
if( m_hMouseCapture == hwnd )
{
(*m_hMouseCapture)->LostMouseCapture.PostEvent( this, SMART_NEW(CWndEventArgs,(m_hMouseCapture)) );
m_hMouseCapture = null;
}
(*hwnd)->EnterFlag = MEF_UNINITED;
(*hwnd)->GotInvisible.PostEvent( this, SMART_NEW(CWndEventArgs,(hwnd)) );
for(Int32 i=0; i<VisibleDescendants.Count(); i++)
{
WND_HANDLE tmp = VisibleDescendants.Get(i);
INST_ASSERT(tmp);
INST_ASSERT( *tmp );
INST_ASSERT( False == IsWndVisibleReally(tmp) );
if( m_hMouseCapture == tmp )
{
(*m_hMouseCapture)->LostMouseCapture.PostEvent( this, SMART_NEW(CWndEventArgs,(m_hMouseCapture)) );
m_hMouseCapture = null;
}
(*tmp)->EnterFlag = MEF_UNINITED;
(*tmp)->GotInvisible.PostEvent( this, SMART_NEW(CWndEventArgs,(tmp)) );
}
}
else // False == IsWndVisibleReally(hwnd)
{
if( True == (*hwnd)->bNodeVisible )
{
INST_ASSERT(False==node);
(*hwnd)->bNodeVisible = node;
INST_ASSERT( False == IsWndVisibleReally(hwnd) );
return;
}
else // False==(*hwnd)->bNodeVisible
{
INST_ASSERT(True==node);
(*hwnd)->bNodeVisible = node;
if( False == IsWndVisibleReally(hwnd) ) return;
Array<WND_HANDLE> VisibleDescendants;
_EnumVisibleDescendants(hwnd,VisibleDescendants);
(*hwnd)->GotVisible.PostEvent( this, SMART_NEW(CWndEventArgs,(hwnd)) );
for(Int32 i=0; i<VisibleDescendants.Count(); i++)
{
WND_HANDLE tmp = VisibleDescendants.Get(i);
INST_ASSERT(tmp);
INST_ASSERT( *tmp );
INST_ASSERT( True == IsWndVisibleReally(tmp) );
(*tmp)->GotVisible.PostEvent( this, SMART_NEW(CWndEventArgs,(tmp)) );
}
}
}
}
void CCore::_EnumVisibleDescendants(WND_HANDLE parent,Array<WND_HANDLE> &out)const
{
INST_ASSERT(parent);
INST_ASSERT( *parent );
INST_ASSERT( IsWndVisibleReally(parent) );
for(Int32 i = 0; i < (*parent)->hChildren.Count(); i++)
{
WND_HANDLE tmp = (*parent)->hChildren.Get(i);
if( (*tmp)->bNodeVisible )
{
out.AddEnd(tmp);
_EnumVisibleDescendants(tmp,out);
}
}
}
|
|