mainfrm.cpp

来自「深入浅出Visual C++入门进阶与应用实例 随书光盘 作者 何志丹」· C++ 代码 · 共 261 行

CPP
261
字号
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "community.h"

#include "MainFrm.h"
#include "EditArticle.h"

#include "EditArticleChildFrame.h"
#include "ExportToHtmlChildFrame.h"
#include "ExportChildFrame.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_WM_INITMENU()
	ON_MESSAGE(WM_USER_CLASSTREE_ITEMCHANGED,OnClassTreeItemChanged)
	ON_COMMAND(ID_VIEW_EDIT_ARTICLE, OnEditArticleView)
	ON_COMMAND(ID_VIEW_EXPORT, OnViewExport)
	ON_COMMAND(ID_VIEW_MAIN_TOOLBAR, OnViewMainToolbar)
	ON_COMMAND(ID_VIEW_EXPORT_HTML, OnViewExportHtml)
	ON_UPDATE_COMMAND_UI(ID_VIEW_MAIN_TOOLBAR, OnUpdateViewMainToolbar)
	ON_UPDATE_COMMAND_UI(ID_VIEW_EDIT_ARTICLE, OnUpdateViewEditArticle)
	ON_UPDATE_COMMAND_UI(ID_VIEW_EXPORT, OnUpdateViewExport)
	ON_UPDATE_COMMAND_UI(ID_VIEW_EXPORT_HTML, OnUpdateViewExportHtml)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	m_bShowMainToolBar = true ;
}

CMainFrame::~CMainFrame()
{	
}

int CMainFrame::CreateControlBar()
{	

	if(NULL == m_wndToolBar.GetSafeHwnd())
	{//避免重复创建
		if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
			| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
			!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
		{
			TRACE0("Failed to create toolbar\n");
			return -1;      // fail to create
		}
		DeleteUnUseToolbarButton(m_wndToolBar);
		m_wndToolBar.EnableDocking(CBRS_ALIGN_TOP);
	}

	if(NULL == m_wndStatusBar.GetSafeHwnd())
	{//避免重复创建
		if (!m_wndStatusBar.Create(this) ||
			!m_wndStatusBar.SetIndicators(indicators,
			sizeof(indicators)/sizeof(UINT)))
		{
			TRACE0("Failed to create status bar\n");
			return -1;      // fail to create
		}
	}
	
	if(NULL == m_wndReBar.GetSafeHwnd())
		m_wndReBar.Create(this);	

	//由于树状控件需要文档类的数据,所以不能在OnCreate中创建,那时文档类还没有生成	
	CMDIChildWnd * pMDIActive = MDIGetActive();//获得当前激活的子窗口
	if(NULL == pMDIActive)
	{
		ASSERT(false) ;
		return -1;
	}
	CArticleDoc * pDoc = (CArticleDoc*)pMDIActive->GetActiveDocument() ;
	if(NULL == pDoc)
	{
		ASSERT(false);
		return -1;
	}
	if( NULL == m_wndTreeBar.GetSafeHwnd())
	{
		m_wndTreeBar.SetMainData(&pDoc->m_mainData);
		m_wndTreeBar.Create(this,WS_CHILD|WS_VISIBLE|CBRS_LEFT|CBRS_GRIPPER);
		m_wndTreeBar.EnableDocking (CBRS_ALIGN_LEFT);
		EnableDocking(CBRS_ALIGN_ANY);		
		
		DWORD dwAddStyle = (RBBS_FIXEDBMP | RBBS_GRIPPERALWAYS | RBBS_CHILDEDGE);
		if (!m_wndReBar.AddBar(&m_wndToolBar, 0, 0, dwAddStyle))
		{
			TRACE0("Failed to create rebar\n");
			return -1;      // fail to create
		}
	}

	return 0 ;
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;	

//	CreateControlBar();

	return 0;
}



void CMainFrame::OnClassTreeItemChanged(WPARAM wParam, LPARAM lParam)
{
	CMDIChildWnd * pMDIActive = MDIGetActive();//得到当前满打激活的子窗口
	if(NULL == pMDIActive)
		return ;		
	CArticleDoc * pDoc = (CArticleDoc *)pMDIActive->GetActiveDocument() ;//获得当前满打激活的文档
	ASSERT(NULL != pDoc);

	UINT uID = (UINT)wParam ;
	pDoc->m_mainData.SetCurTreeNode(uID);
	pDoc->UpdateAllViews(NULL);
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CMDIFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CMDIFrameWnd::Dump(dc);
}


#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers

void CMainFrame::OnViewMainToolbar() 
{
	m_bShowMainToolBar = !m_bShowMainToolBar ;

	CReBarCtrl& reBar= m_wndReBar.GetReBarCtrl( ) ;
	reBar.ShowBand(0,m_bShowMainToolBar);
}

void CMainFrame::OnUpdateViewMainToolbar(CCmdUI* pCmdUI) 
{	
	pCmdUI->SetCheck(m_bShowMainToolBar);	
}


void CMainFrame::OnEditArticleView() 
{
	ShowTemplate(theApp.m_pArticleDocTem,RUNTIME_CLASS(CEditArticleChildFrame));		
}

void CMainFrame::OnViewExport() 
{
	ShowTemplate(theApp.m_pExportDocTem,RUNTIME_CLASS(CExportChildFrame));
}

bool CMainFrame::ShowTemplate(CMultiDocTemplate *pTemplate, CRuntimeClass *pChildFrameClass)
{
	CMDIChildWnd * pMDIActive = MDIGetActive();//获得当前激活的子窗口
	if(NULL == pMDIActive)
	{
		pTemplate->OpenDocumentFile(NULL);
		CreateControlBar() ;
		return true ;
	}
	CDocument * pDoc = pMDIActive->GetActiveDocument() ;
	if(NULL == pDoc)
	{
		ASSERT(false);
		return false;
	}	
	
	CView * pView = NULL ;
	for(POSITION pos = pDoc->GetFirstViewPosition() ; NULL != pos ; )
	{
		pView = pDoc->GetNextView(pos);
		CWnd * pChildFrm = pView->GetParent();//得子框架
		if( NULL != pChildFrm && pChildFrm->IsKindOf(RUNTIME_CLASS(CSplitterWnd)))
			pChildFrm = pChildFrm->GetParent();

		if(NULL != pChildFrm)
		{
			if( pChildFrm->IsKindOf(pChildFrameClass) )
			{
				pChildFrm->DestroyWindow();	
				return true ;
			}
		}
		else
			ASSERT(false);	
	}	

	CMDIChildWnd * pNewFrame = (CMDIChildWnd *)pTemplate->CreateNewFrame(pDoc,NULL);
	pTemplate->InitialUpdateFrame(pNewFrame,pDoc);	
	return true ;
}



void CMainFrame::OnUpdateViewExport(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(CSetting::GetChildFrameStateInfo(CHILDFRAME_TYPE_EXPORT));		
}

void CMainFrame::OnUpdateViewEditArticle(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(CSetting::GetChildFrameStateInfo(CHILDFRAME_TYPE_EDITARTICEL));		
}

void CMainFrame::OnInitMenu(CMenu* pMenu) 
{
	DeleteUnUseMenuItem(pMenu);

	CMDIFrameWnd::OnInitMenu(pMenu);   	
}



void CMainFrame::OnViewExportHtml() 
{
	ShowTemplate(theApp.m_pExportHtmlDocTem,RUNTIME_CLASS(CExportToHtmlChildFrame));	
}

void CMainFrame::OnUpdateViewExportHtml(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(CSetting::GetChildFrameStateInfo(CHILDFRAME_TYPE_EXPORT_HTML));	
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?