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();
}
}