www.pudn.com > WinGOS.rar > PWnd.cpp


#include "gos.h" 
#include "pwnd.h" 
 
 
BOOL CPWnd::Create(DWORD nStyle,LPCRECT pRect,CPWnd* pParent,int nID) 
{ 
	m_pActiveControl=NULL; 
	m_pChild=NULL; 
	nStyle|=WS_PARENT; 
	return CWnd::Create(nStyle,pRect,pParent,nID); 
} 
BOOL CPWnd::Create(LPCTSTR pszText,DWORD nStyle,LPCRECT pRect,CPWnd* pParent,int nID) 
{ 
	m_pActiveControl=NULL; 
	m_pChild=NULL; 
	nStyle|=WS_PARENT; 
	return CWnd::Create(pszText,nStyle,pRect,pParent,nID); 
} 
CWnd* CPWnd::GetDlgItem(int nID) 
{ 
	PWND pWnd,pChild=m_pChild; 
	if(pChild) 
	{ 
		pWnd=pChild; 
		do 
		{ 
			if(pWnd->m_nCtrlID==nID) 
				return pWnd; 
			pWnd=pWnd->m_pNext; 
		}while(pWnd!=pChild); 
	} 
	return NULL; 
} 
 
void CPWnd::SetActiveControl(CWnd* pWnd,int nMode) 
{ 
	PWND pAC,pChild=m_pChild; 
	if(!pChild) 
		return; 
	pAC=m_pActiveControl; 
 
	switch(DWORD(pWnd)) 
	{ 
	case 0: 
		break; 
	case PW_ACTIVECTRL: 
		if(pAC) 
		{ 
			pWnd=pAC; 
			break; 
		} 
	case PW_FIRSTCHILD: 
		pWnd=pChild; 
		pChild=pChild->m_pPrev; 
		while(pWnd->GetStyle()&WS_NOFOCUS) 
		{ 
			if(pWnd==pChild) 
			{ 
				pWnd=NULL; 
				break; 
			} 
			pWnd=pWnd->m_pNext; 
		} 
		break; 
	case PW_LASTCHILD: 
		pWnd=pChild->m_pPrev; 
		while(pWnd->GetStyle()&WS_NOFOCUS) 
		{ 
			if(pWnd==pChild) 
			{ 
				pWnd=NULL; 
				break; 
			} 
			pWnd=pWnd->m_pPrev; 
		} 
		break; 
	default: 
		ASSERT(pWnd->GetParent()==this); 
		break; 
	} 
	if(pAC==pWnd) 
	{ 
		if(pWnd && !(pWnd->GetStyle()&WS_FOCUSED)) 
		{ 
			pWnd->AddStyle(WS_FOCUSED); 
			pWnd->MsgProc(WM_SETFOCUS,nMode,0); 
			if((nMode&PW_FOCUSCHAINSET) && (pWnd->GetStyle()&WS_PARENT)) 
				PPWND(pWnd)->SetActiveControl(HWND_ACTIVECTRL,nMode); 
			MsgProc(WM_ACTIVECONTROL,WPARAM(pWnd),LPARAM(pWnd)); 
		} 
	} 
	else 
	{ 
		if(pAC && pAC->GetStyle()&WS_FOCUSED) 
		{ 
			if((nMode&PW_FOCUSCHAINKILL) && (pAC->GetStyle()&WS_PARENT)) 
				PPWND(pAC)->SetActiveControl(NULL,nMode); 
			pAC->RemoveStyle(WS_FOCUSED); 
			pAC->MsgProc(WM_KILLFOCUS,nMode,0); 
		} 
		if(pWnd) 
		{ 
			m_pActiveControl=pWnd; 
			pWnd->AddStyle(WS_FOCUSED); 
			pWnd->MsgProc(WM_SETFOCUS,nMode,0); 
			if((nMode&PW_FOCUSCHAINSET) && (pWnd->GetStyle()&WS_PARENT)) 
				PPWND(pWnd)->SetActiveControl(HWND_ACTIVECTRL,nMode); 
		} 
		MsgProc(WM_ACTIVECONTROL,WPARAM(pAC),LPARAM(pWnd)); 
	} 
} 
 
LRESULT CPWnd::MsgProc(UINT message, WPARAM wParam, LPARAM lParam) 
{ 
	switch(message) 
	{ 
	case WM_ADDCONTROL: 
		OnAddControl(PWND(wParam)); 
		break; 
	case WM_REMOVECONTROL: 
		OnRemoveControl(PWND(wParam)); 
		break; 
	case WM_DESTROY: 
		OnDestroy(); 
		break; 
	default: 
		wParam=CWnd::MsgProc(message,wParam,lParam); 
	} 
	return wParam; 
} 
 
void CPWnd::OnAddControl(CWnd* pWnd) 
{ 
	ASSERT(!pWnd->GetParent()); 
	if(m_pChild) 
	{ 
		pWnd->m_pPrev=m_pChild->m_pPrev; 
		pWnd->m_pNext=m_pChild; 
		pWnd->m_pPrev->m_pNext=pWnd; 
		pWnd->m_pNext->m_pPrev=pWnd; 
	} 
	else 
	{ 
		pWnd->m_pNext=pWnd; 
		pWnd->m_pPrev=pWnd; 
		m_pChild=pWnd; 
	} 
	pWnd->m_pParent=this; 
} 
 
void CPWnd::OnRemoveControl(CWnd* pWnd) 
{ 
	ASSERT(pWnd->m_pParent==this); 
	DEBUG_ONLY(pWnd->m_pParent=NULL); 
	if(m_pNext==pWnd) 
		m_pChild=NULL; 
	else 
	{ 
		pWnd->m_pNext->m_pPrev=pWnd->m_pPrev; 
		pWnd->m_pPrev->m_pNext=pWnd->m_pNext; 
		if(m_pChild==pWnd) 
			m_pChild=pWnd->m_pNext; 
	} 
	if(pWnd==m_pActiveControl) 
	{ 
		if(m_pChild) 
			SetActiveControl(m_pChild,TRUE); 
		else 
			m_pActiveControl=NULL; 
	} 
} 
 
void CPWnd::OnDestroy() 
{ 
	CWnd::OnDestroy(); 
	if(m_pChild) 
	{ 
		CWnd *pWnd,*pChild; 
		pChild=m_pChild; 
		pWnd=pChild->m_pPrev; 
		for(;;) 
		{ 
			DEBUG_ONLY(pWnd->m_pParent=NULL); 
			pWnd->DestroyWindow(); 
			if(pWnd==pChild) 
				break; 
			pWnd=pWnd->m_pPrev; 
		} 
		DEBUG_ONLY(m_pChild=NULL); 
		DEBUG_ONLY(m_pActiveControl=NULL); 
		 
	} 
}