www.pudn.com > mfcopentree.rar > MainFrm.cpp


// MainFrm.cpp : implementation of the CMainFrame class 
//武汉华中科技大学,2002,(C)版权所有 
//作者:金德才 联系方式:iskyflying@163.com 
//请不要将本软件的任何一部分用于商业用途 
//如果您觉得任何地方有用或者错误,请告诉作者,谢谢! 
//如果你想引用部分源程序,请注明作者信息 
//////////////////////////////////////// 
 
#include "stdafx.h" 
#include "Mfcopen.h" 
 
#include "MainFrm.h" 
#include "3DMath.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame 
 
IMPLEMENT_DYNCREATE(CMainFrame, CCJFrameWnd) 
 
BEGIN_MESSAGE_MAP(CMainFrame, CCJFrameWnd) 
	//{{AFX_MSG_MAP(CMainFrame) 
	ON_WM_CREATE() 
	ON_COMMAND(ID_VIEW_WORKDLGBAR, OnViewWorkdlgbar) 
	ON_UPDATE_COMMAND_UI(ID_VIEW_WORKDLGBAR, OnUpdateViewWorkdlgbar) 
	ON_WM_CLOSE() 
	ON_COMMAND(ID_VIEW_TOOLBAR, OnViewToolbar) 
	ON_COMMAND(ID_HELP_HTM, OnHelpHtm) 
	ON_COMMAND(ID_VIEW_OUTPUT, OnViewOutput) 
	ON_UPDATE_COMMAND_UI(ID_VIEW_OUTPUT, OnUpdateViewOutput) 
	ON_WM_TIMER() 
	ON_COMMAND(ID_VIEW_FULL, OnViewFull) 
	ON_WM_GETMINMAXINFO() 
	ON_COMMAND(ID_VIEW_RESTORE, OnViewRestore) 
	//}}AFX_MSG_MAP 
	ON_MESSAGE(WM_DISPPROG, DispProg) 
END_MESSAGE_MAP() 
 
static UINT indicators[] = 
{ 
	ID_SEPARATOR,           // status line indicator 
	ID_SEPARATOR, 
	ID_SEPARATOR, 
	ID_SEPARATOR 
}; 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame construction/destruction 
 
CMainFrame::CMainFrame() 
{ 
	// TODO: add member initialization code here 
	m_pProg = new CMyProgreeCtrl; 
	m_bFullScreen  = false; 
	m_bWorkDlgBarVisible = TRUE; 
	m_boutput = TRUE; 
	m_icon[0] = IDI_ICON1; 
	m_icon[1] = IDI_ICON2; 
	m_icon[2] = IDI_ICON3; 
	m_icon[3] = IDI_ICON4; 
	m_icon[4] = IDI_ICON5; 
} 
 
CMainFrame::~CMainFrame() 
{ 
	if(m_pProg) 
	{ 
		delete m_pProg; 
		m_pProg = 0; 
	} 
} 
 
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
	if (CCJFrameWnd::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	 
	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 
	} 
 
	if (!m_mytoolbar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP 
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || 
		!m_mytoolbar.LoadToolBar(IDR_TOOLBAR1)) 
	{ 
		TRACE0("Failed to create toolbar\n"); 
		return -1;      // fail to create 
	} 
	 
	m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT); 
 
	m_mytoolbar.ModifyStyle(0, TBSTYLE_FLAT); 
 
	if (!m_toolbar3.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP 
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || 
		!m_toolbar3.LoadToolBar(IDR_TOOLBAR2)) 
	{ 
		TRACE0("Failed to create toolbar\n"); 
		return -1;      // fail to create 
	} 
 
	m_toolbar3.ModifyStyle(0, TBSTYLE_FLAT); 
 
	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(!m_wndWorkDlgBar.Create(this,&m_cTree,CString("工作中心"),ID_COOL_BAR)) 
	{ 
		TRACE0("Failed to create CoolBar\n"); 
		return -1; 
	} 
 
	m_wndWorkDlgBar.SetWindowText("工作中心");	 
	// TODO: Delete these three lines if you don't want the toolbar to 
	//  be dockable 
	EnableDocking(CBRS_ALIGN_ANY); 
 
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); 
	m_mytoolbar.EnableDocking(CBRS_ALIGN_ANY); 
	m_toolbar3.EnableDocking(CBRS_ALIGN_ANY); 
	int cx = GetSystemMetrics(SM_CXMAXIMIZED); 
	int cy = GetSystemMetrics(SM_CYMAXIMIZED); 
	CRect r1, r2, r3; 
	r1.left = 10; 
	r1.right = cx/2+20; 
	r1.top = 80; 
	r1.bottom = 150; 
 
	r2.left = r1.right+50; 
	r2.right = r2.left+80+3; 
	r2.top = 80; 
	r2.bottom = 150; 
 
 
	r3.right = cx-10; 
	r3.left = r2.right-100; 
	r3.top = 80; 
	r3.bottom = 150; 
	DockControlBar(&m_mytoolbar, AFX_IDW_DOCKBAR_TOP, &r2); 
	DockControlBar(&m_wndToolBar, AFX_IDW_DOCKBAR_TOP, &r1); 
	DockControlBar(&m_toolbar3, AFX_IDW_DOCKBAR_TOP, &r3); 
	m_wndWorkDlgBar.EnableDocking(CBRS_ALIGN_LEFT); 
	DockControlBar(&m_wndWorkDlgBar, AFX_IDW_DOCKBAR_LEFT); 
 
	// create the output docking window. 
	{ 
		if( !m_wndOutput.Create(this, ID_VIEW_OUTPUT, 
			_T("信息窗口"), CSize(150, 150), CBRS_BOTTOM )) 
		{ 
			TRACE0("Failed to create dialog bar m_wndOutput\n"); 
			return -1;		// fail to create 
		} 
 
		m_wndOutput.EnableDockingOnSizeBar( CBRS_ALIGN_ANY ); 
		EnableDockingSizeBar( CBRS_ALIGN_ANY ); 
		DockSizeBar( &m_wndOutput ); 
 
		// set the popoup menu id. 
		m_wndOutput.SetMenuID( IDR_MAINFRAME, NULL, 1 ); 
	} 
	// CG: The following line was added by the Splash Screen component. 

	int ax = GetSystemMetrics(SM_CXFULLSCREEN); 
	m_wndStatusBar.SetPaneInfo(0, ID_SEPARATOR, SBPS_NOBORDERS, ax/2); 
	m_wndStatusBar.SetPaneInfo(1, ID_SEPARATOR, SBPS_NORMAL, ax/4); 
	m_wndStatusBar.SetPaneText(1, "武汉--华中科技大学材料学院2002推出", true); 
	m_wndStatusBar.SetPaneInfo(2, ID_SEPARATOR, SBPS_NORMAL, ax/8); 
	m_wndStatusBar.SetPaneInfo(3, ID_SEPARATOR, SBPS_NORMAL, ax/8); 
	 
	SetTimer(2, 300, NULL); 
 
	return 0; 
} 
 
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	if( !CCJFrameWnd::PreCreateWindow(cs) ) 
		return FALSE; 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
	cs.style |= WS_MAXIMIZE; 
 
	return TRUE; 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame diagnostics 
 
#ifdef _DEBUG 
void CMainFrame::AssertValid() const 
{ 
	CCJFrameWnd::AssertValid(); 
} 
 
void CMainFrame::Dump(CDumpContext& dc) const 
{ 
	CCJFrameWnd::Dump(dc); 
} 
 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame message handlers 
 
 
void CMainFrame::OnViewWorkdlgbar()  
{ 
	m_bWorkDlgBarVisible=!m_bWorkDlgBarVisible; 
	ShowControlBar(&m_wndWorkDlgBar,m_bWorkDlgBarVisible,FALSE);	 
} 
 
void CMainFrame::OnUpdateViewWorkdlgbar(CCmdUI* pCmdUI)  
{ 
	if(m_wndWorkDlgBar.IsWindowVisible()) 
	{   
		pCmdUI->SetCheck(1); 
		m_bWorkDlgBarVisible=true; 
	} 
	else 
    { 
		pCmdUI->SetCheck(0); 
		m_bWorkDlgBarVisible=false; 
	} 
} 
 
void CMainFrame::OnClose()  
{ 
	// TODO: Add your message handler code here and/or call default 
	CMfcopenDoc *pdoc = (CMfcopenDoc *)(CMainFrame::GetActiveDocument()); 
	if(!(pdoc->m_bfileopen)&&!(pdoc->m_banimalfileopen)) 
	{ 
		PostQuitMessage(0); 
	} 
	else 
	{ 
		int tt = MessageBox("您想保存已修改的数据吗?", "停一停", MB_YESNOCANCEL); 
		if(tt == IDYES) 
		{ 
			pdoc->OnSaveAnimal(); 
			PostQuitMessage(0); 
		} 
		else if(tt == IDCANCEL) 
			return; 
		else 
		{ 
			PostQuitMessage(0); 
		} 
	} 
 
	CCJFrameWnd::OnClose(); 
} 
 
void CMainFrame::OnViewToolbar()  
{ 
	// TODO: Add your command handler code here 
	m_btoolbarvisible = !m_btoolbarvisible; 
	ShowControlBar(&m_wndToolBar,m_btoolbarvisible,FALSE); 
	ShowControlBar(&m_mytoolbar, m_btoolbarvisible,FALSE); 
	ShowControlBar(&m_toolbar3, m_btoolbarvisible,FALSE); 
} 
 
void CMainFrame::OnHelpHtm()  
{ 
	// TODO: Add your command handler code here 
	char helpfile[128]; 
	::GetCurrentDirectory(128, helpfile); 
	for(int i=0; i<128; i++) 
	{ 
		if(helpfile[i] == '\\') 
			helpfile[i] = '/'; 
		else if(helpfile[i] == 0) 
		{ 
			helpfile[i] = '/'; 
			helpfile[i+1] = 'h'; 
			helpfile[i+2] = 'e'; 
			helpfile[i+3] = 'l'; 
			helpfile[i+4] = 'p'; 
			helpfile[i+5] = '.'; 
			helpfile[i+6] = 'c'; 
			helpfile[i+7] = 'h'; 
			helpfile[i+8] = 'm'; 
			helpfile[i+9] = 0; 
			break; 
		} 
		else 
		{} 
	} 
	HtmlHelp(NULL, helpfile, HH_DISPLAY_TOPIC, 0);	 
} 
 
 
void CMainFrame::OnViewOutput()  
{ 
	// TODO: Add your command handler code here 
	m_boutput = !m_boutput; 
	ShowControlBar(&m_wndOutput,m_boutput,FALSE); 
} 
 
void CMainFrame::OnUpdateViewOutput(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_boutput == TRUE); 
} 
 
void CMainFrame::OnTimer(UINT nIDEvent)  
{ 
	// TODO: Add your message handler code here and/or call default 
	static i = 0; 
 
	HICON hIcon=AfxGetApp()->LoadIcon(m_icon[(i < 5) ? i++ : i=0]); 
	ASSERT(hIcon); 
	SendMessage(WM_SETICON,TRUE,(LPARAM)hIcon); 
 
	CCJFrameWnd::OnTimer(nIDEvent); 
} 
 
 
void CMainFrame::OnViewFull()  
{ 
	// TODO: Add your command handler code here 
 
	//隐藏一切工具条及浮动对话框 
    ShowControlBar(&m_mytoolbar,FALSE,FALSE); 
	ShowControlBar(&m_wndWorkDlgBar,FALSE,FALSE); 
	ShowControlBar(&m_wndToolBar,FALSE,FALSE); 
	ShowControlBar(&m_wndStatusBar,FALSE,FALSE); 
 
	GetWindowPlacement(&m_OldWndpl); 
    CRect windowRect,clientRect; 
	GetWindowRect(&windowRect); 
	RepositionBars(0,0xffff,AFX_IDW_PANE_FIRST,reposQuery,&clientRect); 
	ClientToScreen(&clientRect); 
	//获取屏幕的分辨率 
	int nFullWidth  = GetSystemMetrics(SM_CXSCREEN); 
    int nFullHeight = GetSystemMetrics(SM_CYSCREEN); 
    m_FullScreenRect.left   = windowRect.left-clientRect.left; 
	m_FullScreenRect.top    = windowRect.top-clientRect.top; 
	m_FullScreenRect.right  = windowRect.right-clientRect.right+nFullWidth; 
	m_FullScreenRect.bottom = windowRect.bottom-clientRect.bottom+nFullHeight; 
	m_bFullScreen=true; 
	//进入全屏显示 
	WINDOWPLACEMENT wndpl; 
	wndpl.length  = sizeof(WINDOWPLACEMENT); 
	wndpl.flags   = 0; 
	wndpl.showCmd = SW_SHOWNORMAL; 
	wndpl.rcNormalPosition = m_FullScreenRect; 
	SetWindowPlacement(&wndpl); 
 
} 
 
void CMainFrame::OnViewRestore()  
{ 
	// TODO: Add your command handler code here 
	if(m_bFullScreen) 
	{ 
		m_bFullScreen=false; 
		ShowWindow(SW_HIDE); 
		SetWindowPlacement(&m_OldWndpl); 
		 
		ShowControlBar(&m_wndToolBar,TRUE,FALSE); 
		ShowControlBar(&m_wndStatusBar,TRUE,FALSE); 
	    ShowControlBar(&m_wndWorkDlgBar,m_bWorkDlgBarVisible,FALSE); 
	    ShowControlBar(&m_mytoolbar,m_btoolbarvisible,FALSE); 
	}	 
} 
 
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)  
{ 
	// TODO: Add your message handler code here and/or call default 
    if(m_bFullScreen) 
	{ 
		lpMMI->ptMaxSize.x=m_FullScreenRect.Width(); 
		lpMMI->ptMaxSize.y=m_FullScreenRect.Height(); 
		lpMMI->ptMaxPosition.x=m_FullScreenRect.left; 
		lpMMI->ptMaxPosition.y=m_FullScreenRect.top; 
		//最大的 Track尺寸也要改,否则也会影响 
		lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width(); 
		lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height(); 
	}	 
	CCJFrameWnd::OnGetMinMaxInfo(lpMMI); 
} 
 
void CMainFrame::DispProg(WPARAM wa, LPARAM la) 
{ 
	if(m_pProg->GetSafeHwnd()==FALSE) 
	{ 
		CRect rc; 
		m_wndStatusBar.GetWindowRect(&rc); 
		ScreenToClient(&rc); 
		rc.right /= 4; 
		m_pProg->Create(PBS_SMOOTH|WS_CHILD|WS_VISIBLE, rc, this, IDD_PROGRESS); 
		m_pProg->SetRange(0, 10000); 
		m_pProg->SetPos(0); 
		m_pProg->ShowWindow(TRUE); 
	} 
	else 
	{	 
		if(wa==0) 
		{ 
			m_pProg->m_nprog = 10000; 
			m_pProg->Invalidate(FALSE); 
			m_pProg->UpdateWindow(); 
			return; 
		} 
		int i = HIWORD(wa); 
		int tt = LOWORD(wa); 
		if(la == 0) 
			return; 
		if(tt/la >= 1) 
		{ 
			m_pProg->m_nprog = 1000*i; 
			m_pProg->Invalidate(TRUE); 
			m_pProg->UpdateWindow(); 
			return; 
		} 
		int pro = 1000*(i-1)+1000*tt/la; 
		m_pProg->m_nprog = pro; 
		m_pProg->Invalidate(TRUE); 
		m_pProg->UpdateWindow(); 
	} 
}