|  | @@ -2,39 +2,39 @@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #include "ChildFrm.h"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +typedef struct _TabView_ {
 | 
	
		
			
				|  |  | +	// 窗口名称;
 | 
	
		
			
				|  |  | +	TCHAR szName[MAX_PATH] = { 0 };
 | 
	
		
			
				|  |  | +	// 窗口句柄;
 | 
	
		
			
				|  |  | +	CWnd* pViewWnd = NULL;
 | 
	
		
			
				|  |  | +	// 下一个窗口;
 | 
	
		
			
				|  |  | +	_TabView_* pNextTab = NULL;
 | 
	
		
			
				|  |  | +}TABVIEW, * pTABVIEW;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  class CChildFrameList
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -	CDocument* m_pCurrentDoc;
 | 
	
		
			
				|  |  | -	CFrameWnd* m_pCurrentFrame;
 | 
	
		
			
				|  |  | +	// Template创建的Doc;
 | 
	
		
			
				|  |  | +	static CDocument* m_pCurrentDoc;
 | 
	
		
			
				|  |  | +	// MainFrame对象;
 | 
	
		
			
				|  |  | +	static CFrameWnd* m_pCurrentFrame;
 | 
	
		
			
				|  |  |  public:
 | 
	
		
			
				|  |  | -	CChildFrameList(CFrameWnd* pFrameWnd) {
 | 
	
		
			
				|  |  | -		m_pCurrentFrame = pFrameWnd;
 | 
	
		
			
				|  |  | -		m_pChildViewHead = NULL;
 | 
	
		
			
				|  |  | -	};
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +	CChildFrameList() { };
 | 
	
		
			
				|  |  |  	virtual ~CChildFrameList() {};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	typedef struct _TabView_ {
 | 
	
		
			
				|  |  | -		// 窗口名称;
 | 
	
		
			
				|  |  | -		TCHAR szName[MAX_PATH] = { 0 };
 | 
	
		
			
				|  |  | -		// 窗口句柄;
 | 
	
		
			
				|  |  | -		CWnd* pViewWnd = NULL;
 | 
	
		
			
				|  |  | -		// 下一个窗口;
 | 
	
		
			
				|  |  | -		_TabView_* pNextTab = NULL;
 | 
	
		
			
				|  |  | -	}TABVIEW, * pTABVIEW;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	static void* m_pChildViewHead;
 | 
	
		
			
				|  |  | +	// 队列头指针;
 | 
	
		
			
				|  |  | +	static TABVIEW* m_pChildViewHead;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  public:
 | 
	
		
			
				|  |  | -	void SetDoc(CDocument* pDoc) { m_pCurrentDoc = pDoc; };
 | 
	
		
			
				|  |  | +	// 初始化;
 | 
	
		
			
				|  |  | +	inline static void Init(CFrameWnd* pCurrentFrame, CDocument* pDoc) { m_pCurrentFrame = pCurrentFrame;m_pCurrentDoc = pDoc; };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	// 获取视图名称;
 | 
	
		
			
				|  |  | -	TCHAR* GetViewName(const CWnd* pViewWnd) const
 | 
	
		
			
				|  |  | +	static TCHAR* GetViewName(const CWnd* pViewWnd)
 | 
	
		
			
				|  |  |  	{
 | 
	
		
			
				|  |  |  		if (!pViewWnd || !m_pChildViewHead)
 | 
	
		
			
				|  |  |  			return NULL;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		TABVIEW* pTabView = (TABVIEW*)m_pChildViewHead;
 | 
	
		
			
				|  |  | +		TABVIEW* pTabView = m_pChildViewHead;
 | 
	
		
			
				|  |  |  		do
 | 
	
		
			
				|  |  |  		{
 | 
	
		
			
				|  |  |  			if (pViewWnd == pTabView->pViewWnd)
 | 
	
	
		
			
				|  | @@ -46,12 +46,12 @@ public:
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	// 获取视图窗口句柄;
 | 
	
		
			
				|  |  | -	CWnd* GetViewWnd(const TCHAR* pViewName)
 | 
	
		
			
				|  |  | +	static CWnd* GetViewWnd(const TCHAR* pViewName)
 | 
	
		
			
				|  |  |  	{
 | 
	
		
			
				|  |  |  		if (!pViewName || !m_pChildViewHead)
 | 
	
		
			
				|  |  |  			return NULL;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		TABVIEW* pTabView = (TABVIEW*)m_pChildViewHead;
 | 
	
		
			
				|  |  | +		TABVIEW* pTabView = m_pChildViewHead;
 | 
	
		
			
				|  |  |  		do
 | 
	
		
			
				|  |  |  		{
 | 
	
		
			
				|  |  |  			// 注意如果是中文比较,该函数是否会有问题;
 | 
	
	
		
			
				|  | @@ -64,7 +64,7 @@ public:
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	// 添加新的视图窗口;
 | 
	
		
			
				|  |  | -	void AppendView(const TCHAR* pszViewName, CRuntimeClass* pNewViewClass, UINT nIcon, UINT nID)
 | 
	
		
			
				|  |  | +	static void AppendView(const TCHAR* pszViewName, CRuntimeClass* pNewViewClass, UINT nIcon, UINT nID)
 | 
	
		
			
				|  |  |  	{
 | 
	
		
			
				|  |  |  		CChildFrame* pViewWnd = (CChildFrame*)GetViewWnd(pszViewName);
 | 
	
		
			
				|  |  |  		// 已存在;
 | 
	
	
		
			
				|  | @@ -90,7 +90,7 @@ public:
 | 
	
		
			
				|  |  |  			context.m_pNewViewClass = pNewViewClass;
 | 
	
		
			
				|  |  |  			context.m_pNewDocTemplate = m_pCurrentDoc->GetDocTemplate();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -			if (!pViewWnd->LoadFrame(nID, WS_CHILDWINDOW, m_pCurrentFrame, &context)) {
 | 
	
		
			
				|  |  | +			if (!pViewWnd->LoadFrame(nID, WS_MAXIMIZEBOX | WS_CHILDWINDOW, m_pCurrentFrame, &context)) {
 | 
	
		
			
				|  |  |  				delete pViewWnd;
 | 
	
		
			
				|  |  |  				return;
 | 
	
		
			
				|  |  |  			}
 | 
	
	
		
			
				|  | @@ -98,19 +98,20 @@ public:
 | 
	
		
			
				|  |  |  			pNewView->pViewWnd = (CWnd*)pViewWnd;
 | 
	
		
			
				|  |  |  			memcpy(pNewView->szName, pszViewName, MAX_PATH);
 | 
	
		
			
				|  |  |  			pNewView->pNextTab = (TABVIEW*)m_pChildViewHead;
 | 
	
		
			
				|  |  | -			m_pChildViewHead = (void*)pNewView;
 | 
	
		
			
				|  |  | +			m_pChildViewHead = pNewView;
 | 
	
		
			
				|  |  |  			pViewWnd->InitialUpdateFrame(NULL, true);  //真正创建
 | 
	
		
			
				|  |  | -			pViewWnd->ShowWindow(SW_MAXIMIZE);
 | 
	
		
			
				|  |  | +			//pViewWnd->ShowWindow(SW_MAXIMIZE);
 | 
	
		
			
				|  |  | +			//pViewWnd->MDIMaximize();
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	void CloseView(const TCHAR* pszViewName)
 | 
	
		
			
				|  |  | +	static void CloseView(const TCHAR* pszViewName)
 | 
	
		
			
				|  |  |  	{
 | 
	
		
			
				|  |  |  		if (!pszViewName || !m_pChildViewHead)
 | 
	
		
			
				|  |  |  			return;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		// 查找视图;
 | 
	
		
			
				|  |  | -		TABVIEW* pLastTab = NULL, * pTabView = (TABVIEW*)m_pChildViewHead;
 | 
	
		
			
				|  |  | +		TABVIEW* pLastTab = NULL, * pTabView = m_pChildViewHead;
 | 
	
		
			
				|  |  |  		do
 | 
	
		
			
				|  |  |  		{
 | 
	
		
			
				|  |  |  			if (_tcsicmp(pTabView->szName, pszViewName) == 0) {
 | 
	
	
		
			
				|  | @@ -128,13 +129,13 @@ public:
 | 
	
		
			
				|  |  |  		} while (pTabView);
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	void CloseView(CWnd* pViewWnd)
 | 
	
		
			
				|  |  | +	static void CloseView(CWnd* pViewWnd)
 | 
	
		
			
				|  |  |  	{
 | 
	
		
			
				|  |  |  		if (!pViewWnd || !m_pChildViewHead)
 | 
	
		
			
				|  |  |  			return;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		// 查找视图;
 | 
	
		
			
				|  |  | -		TABVIEW* pLastTab = NULL, * pTabView = (TABVIEW*)m_pChildViewHead;
 | 
	
		
			
				|  |  | +		TABVIEW* pLastTab = NULL, * pTabView = m_pChildViewHead;
 | 
	
		
			
				|  |  |  		do
 | 
	
		
			
				|  |  |  		{
 | 
	
		
			
				|  |  |  			if (pTabView->pViewWnd == pViewWnd) {
 | 
	
	
		
			
				|  | @@ -153,36 +154,38 @@ public:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	void CloseAllView()
 | 
	
		
			
				|  |  | +	static void CloseAllView()
 | 
	
		
			
				|  |  |  	{
 | 
	
		
			
				|  |  |  		if (!m_pChildViewHead)
 | 
	
		
			
				|  |  |  			return;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		TABVIEW* pTabView = (TABVIEW*)m_pChildViewHead;
 | 
	
		
			
				|  |  | +		TABVIEW* pLastTab = NULL, * pTabView = m_pChildViewHead;
 | 
	
		
			
				|  |  |  		do
 | 
	
		
			
				|  |  |  		{
 | 
	
		
			
				|  |  | +			pLastTab = pTabView;
 | 
	
		
			
				|  |  |  			pTabView->pViewWnd->SendMessage(WM_CLOSE);
 | 
	
		
			
				|  |  |  			m_pChildViewHead = pTabView->pNextTab;
 | 
	
		
			
				|  |  | -			// 删除对象;
 | 
	
		
			
				|  |  | -			delete pTabView; pTabView = NULL;
 | 
	
		
			
				|  |  |  			pTabView = pTabView->pNextTab;
 | 
	
		
			
				|  |  | +			// 删除对象;
 | 
	
		
			
				|  |  | +			delete pLastTab; pLastTab = NULL;
 | 
	
		
			
				|  |  |  		} while (pTabView);
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	BOOL SwitchView(const TCHAR* pszViewName)
 | 
	
		
			
				|  |  | +	static BOOL SwitchView(const TCHAR* pszViewName)
 | 
	
		
			
				|  |  |  	{
 | 
	
		
			
				|  |  |  		if (!pszViewName || !m_pChildViewHead)
 | 
	
		
			
				|  |  |  			return FALSE;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		// 隐藏当前活动视图;
 | 
	
		
			
				|  |  |  		CWnd* pActiveWnd = m_pCurrentFrame->GetActiveFrame();
 | 
	
		
			
				|  |  | -		if (pActiveWnd)
 | 
	
		
			
				|  |  | -			pActiveWnd->ShowWindow(SW_HIDE);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  		// 是否已存在该视图;
 | 
	
		
			
				|  |  |  		CChildFrame* pViewWnd = (CChildFrame*)GetViewWnd(pszViewName);
 | 
	
		
			
				|  |  |  		// 已存在;
 | 
	
		
			
				|  |  | -		if (pViewWnd) {
 | 
	
		
			
				|  |  | +		if (pViewWnd && pActiveWnd != pViewWnd) {
 | 
	
		
			
				|  |  | +			// 隐藏上一个活动视图;
 | 
	
		
			
				|  |  | +			if (pActiveWnd)
 | 
	
		
			
				|  |  | +				pActiveWnd->ShowWindow(SW_HIDE);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			pViewWnd->ShowWindow(SW_MAXIMIZE);
 | 
	
		
			
				|  |  |  			pViewWnd->MDIActivate();
 | 
	
		
			
				|  |  |  			return TRUE;
 | 
	
		
			
				|  |  |  		}
 |