MainFrm.cpp
上传用户:netltd
上传日期:2013-02-12
资源大小:7234k
文件大小:26k
源码类别:

绘图程序

开发平台:

Visual C++

  1. // MainFrm.cpp : implementation of the CMainFrame class
  2. #include "stdafx.h"
  3. #include "MainFrm.h"
  4. #include "MiniCADDoc.h"
  5. #include "MiniCADView.h"
  6. #include "MyNewDlg.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CMainFrame
  14. IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
  15. BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
  16. ON_COMMAND_EX(ID_VIEW_MYOPTIONBAR, OnBarCheck)
  17. ON_UPDATE_COMMAND_UI(ID_VIEW_MYOPTIONBAR, OnUpdateControlBarMenu)
  18. ON_COMMAND_EX(ID_VIEW_MYWORKBAR, OnBarCheck)
  19. ON_UPDATE_COMMAND_UI(ID_VIEW_MYWORKBAR, OnUpdateControlBarMenu)
  20. //{{AFX_MSG_MAP(CMainFrame)
  21. ON_WM_CREATE()
  22. ON_COMMAND(ID_VIEW_MYDRAWTOOLBAR, OnViewMydrawtoolbar)
  23. ON_UPDATE_COMMAND_UI(ID_VIEW_MYDRAWTOOLBAR, OnUpdateViewMydrawtoolbar)
  24. ON_COMMAND(ID_FILE_NEWF, OnFileNewF)
  25. ON_COMMAND(ID_FILE_OPENF, OnFileOpenF)
  26. ON_COMMAND(ID_FILE_NEWP, OnFileNewP)
  27. ON_COMMAND(ID_FILE_OPENP, OnFileOpenP)
  28. ON_COMMAND(ID_FILE_NEWFTOP, OnFileNewFToP)
  29. ON_UPDATE_COMMAND_UI(ID_FILE_NEWFTOP, OnUpdateFileNewFToP)
  30. ON_NOTIFY(TCN_SELCHANGE, IDC_TAB, OnSelchangeTab)
  31. ON_NOTIFY(NM_CLICK, IDC_TREE, OnClickTree)
  32. ON_NOTIFY(NM_DBLCLK, IDC_TREE, OnDblclkTree)
  33. ON_NOTIFY(NM_RCLICK, IDC_TREE, OnRclickTree)
  34. ON_COMMAND(ID_VIEW_FULL, OnViewFull)
  35. ON_UPDATE_COMMAND_UI(ID_VIEW_FULL, OnUpdateViewFull)
  36. ON_WM_GETMINMAXINFO()
  37. ON_COMMAND(ID_FILE_OPENFTOP, OnFileOpenFToP)
  38. ON_UPDATE_COMMAND_UI(ID_FILE_OPENFTOP, OnUpdateFileOpenFToP)
  39. ON_COMMAND(ID_FILE_SAVEP, OnFileSaveP)
  40. ON_WM_CLOSE()
  41. ON_COMMAND(ID_FILE_CLOSEP, OnFileCloseP)
  42. ON_COMMAND(ID_FILE_CLOSEF, OnFileCloseF)
  43. ON_COMMAND(ID_FILE_SAVEF, OnFileSaveF)
  44. ON_COMMAND(ID_FILE_SAVEF_AS, OnFileSaveFAs)
  45. ON_COMMAND(ID_FILE_SAVEALL, OnFileSaveall)
  46. //}}AFX_MSG_MAP
  47. ON_UPDATE_COMMAND_UI_RANGE(ID_FILE_FILELIST, ID_FILE_FILELIST + RECENTFILELIST_NUM - 1, OnUpdateFileFilelist)
  48. ON_COMMAND_RANGE(ID_FILE_PROJECTLIST, ID_FILE_PROJECTLIST + 3, OnFileProjectlist)
  49. ON_UPDATE_COMMAND_UI_RANGE(ID_FILE_PROJECTLIST, ID_FILE_PROJECTLIST + RECENTFILELIST_NUM - 1, OnUpdateFileProjectlist)
  50. // Global help commands
  51. ON_COMMAND(ID_HELP_FINDER, CMDIFrameWnd::OnHelpFinder)
  52. ON_COMMAND(ID_HELP, CMDIFrameWnd::OnHelp)
  53. ON_COMMAND(ID_CONTEXT_HELP, CMDIFrameWnd::OnContextHelp)
  54. ON_COMMAND(ID_DEFAULT_HELP, CMDIFrameWnd::OnHelpFinder)
  55. END_MESSAGE_MAP()
  56. static UINT indicators[] =
  57. {
  58. ID_SEPARATOR, // status line indicator
  59. ID_SEPARATOR,
  60. ID_SEPARATOR,
  61. ID_INDICATOR_CAPS,
  62. ID_INDICATOR_NUM,
  63. ID_INDICATOR_SCRL,
  64. };
  65. /////////////////////////////////////////////////////////////////////////////
  66. // CMainFrame construction/destruction
  67. CMainFrame::CMainFrame()
  68. {
  69. pApp = (CMiniCADApp*)AfxGetApp();
  70. m_pWndFullScreen = NULL;
  71. }
  72. CMainFrame::~CMainFrame()
  73. {
  74. }
  75. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  76. {
  77. if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
  78. return -1;
  79. if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  80. | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  81. !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  82. {
  83. TRACE0("Failed to create toolbarn");
  84. return -1;      
  85. }
  86. m_wndToolBar.SetWindowText (_T("标准工具条"));
  87. m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  88. EnableDocking(CBRS_ALIGN_ANY);
  89. DockControlBar(&m_wndToolBar);
  90. if (!m_wndStatusBar.Create(this) ||
  91. !m_wndStatusBar.SetIndicators(indicators,
  92.   sizeof(indicators)/sizeof(UINT)))
  93. {
  94. TRACE0("Failed to create status barn");
  95. return -1;      
  96. }
  97.     m_wndStatusBar.SetPaneInfo(1, 0, SBPS_NORMAL, 100);
  98. m_wndStatusBar.SetPaneInfo(2, 0, SBPS_NORMAL, 100);
  99. if (!m_MyWorkBar.Create(_T("工作区"), this, CSize(170, 150), TRUE, ID_VIEW_MYWORKBAR))
  100. {
  101. TRACE0("Failed to create myworkbarn");
  102.     return -1;      
  103. }
  104.     m_MyWorkBar.SetBarStyle(m_MyWorkBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | 
  105.                         CBRS_SIZE_DYNAMIC);
  106. m_MyWorkBar.EnableDocking(CBRS_ALIGN_LEFT | CBRS_ALIGN_RIGHT); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_MyWorkBar, AFX_IDW_DOCKBAR_LEFT);
  107.    
  108.     //创建位于左侧的绘图工具条
  109. if (!m_MyDrawToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_LEFT
  110.     | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  111.     !m_MyDrawToolBar.LoadToolBar(IDR_MYDRAWTOOLBAR))
  112. {
  113.     TRACE0("Failed to create toolbarn");
  114. return -1;     
  115. }
  116.     //设置绘图工具条标题
  117. m_MyDrawToolBar.SetWindowText (_T("绘图工具条"));
  118. //允许工具条浮动
  119. m_MyDrawToolBar.EnableDocking(CBRS_ALIGN_LEFT | CBRS_ALIGN_RIGHT);
  120. EnableDocking(CBRS_ALIGN_ANY);
  121. DockControlBar(&m_MyDrawToolBar);
  122. //创建位于左侧的修改工具条
  123. if (!m_MyModifyToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_LEFT
  124.     | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  125.     !m_MyModifyToolBar.LoadToolBar(IDR_MYMODIFYTOOLBAR))
  126. {
  127.     TRACE0("Failed to create toolbarn");
  128. return -1;     
  129. }
  130.     //设置修改工具条标题
  131. m_MyModifyToolBar.SetWindowText (_T("修改工具条"));
  132. //允许工具条浮动
  133. m_MyModifyToolBar.EnableDocking(CBRS_ALIGN_LEFT | CBRS_ALIGN_RIGHT);
  134. EnableDocking(CBRS_ALIGN_ANY);
  135. DockControlBar(&m_MyModifyToolBar);
  136. if (!m_MyOptionBar.Create(this, IDD_MYOPTIONBAR, ID_VIEW_MYOPTIONBAR)) { TRACE0("Failed to create dialog bar m_MyOptionBarn"); return -1; }     m_MyOptionBar.EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_MyOptionBar);
  137. //初始化选项条
  138. m_MyOptionBar.Initialize();
  139. return 0;
  140. }
  141. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  142. {
  143. if( !CMDIFrameWnd::PreCreateWindow(cs) )
  144. return FALSE;
  145. cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE
  146. | WS_THICKFRAME | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_MAXIMIZE;
  147. cs.style &= ~FWS_ADDTOTITLE;
  148.     return TRUE;
  149. }
  150. /////////////////////////////////////////////////////////////////////////////
  151. // CMainFrame diagnostics
  152. #ifdef _DEBUG
  153. void CMainFrame::AssertValid() const
  154. {
  155. CMDIFrameWnd::AssertValid();
  156. }
  157. void CMainFrame::Dump(CDumpContext& dc) const
  158. {
  159. CMDIFrameWnd::Dump(dc);
  160. }
  161. #endif //_DEBUG
  162. /////////////////////////////////////////////////////////////////////////////
  163. // CMainFrame message handlers
  164. void CMainFrame::OnViewMydrawtoolbar(UINT nID) 
  165. {
  166. BOOL bVisible=m_MyDrawToolBar.GetStyle() & WS_VISIBLE ;
  167. //显示或隐藏绘图工具条
  168. ShowControlBar(&m_MyDrawToolBar, !bVisible, FALSE);
  169. RecalcLayout();
  170. return ;
  171. }
  172. void CMainFrame::OnUpdateViewMydrawtoolbar(CCmdUI* pCmdUI) 
  173. {
  174. //设置绘图工具条显示、隐藏标志
  175. pCmdUI->SetCheck((m_MyDrawToolBar.GetStyle() & WS_VISIBLE) != 0);
  176. }
  177. //////////////////////////////////////////////////////////////////////////////////////////////
  178. void CMainFrame::OnFileNewF() 
  179. {
  180. CMyNewSheet m_NewSheet(_T("新建"), this, 0);
  181. m_NewSheet.DoModal();
  182. }
  183. void CMainFrame::OnFileOpenF() 
  184. {
  185. if(pApp->CADInfo.IsEmpty == TRUE)
  186. {
  187. //pApp->CADInfo.KindofNew = NEW_NONE;
  188. //pApp->CADInfo.IsEmpty = FALSE;
  189. }
  190. }
  191. void CMainFrame::OnFileSaveF() 
  192. {
  193. if(pApp->CADInfo.IsEmpty == TRUE)
  194. return;
  195. CChildFrame* pChildWnd = (CChildFrame*)this->MDIGetActive();
  196.     CMiniCADDoc* pDoc = (CMiniCADDoc*)pChildWnd->GetActiveDocument();
  197. pDoc->SaveDocument();
  198. }
  199. void CMainFrame::OnFileSaveFAs() 
  200. {
  201. if(pApp->CADInfo.IsEmpty == TRUE)
  202. return;
  203. CString Filter="图纸文件(*.xsy)|*.xsy|所有文件(*.*)|*.*||";
  204. CString PathName;
  205. CChildFrame* pChildWnd = (CChildFrame*)this->MDIGetActive();
  206.     CMiniCADDoc* pDoc = (CMiniCADDoc*)pChildWnd->GetActiveDocument();
  207. CFileDialog SaveFileDlg(FALSE, 0, pDoc->FileInfo.FileName, 
  208.                     OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|OFN_LONGNAMES, (LPCTSTR)Filter);
  209.     SaveFileDlg.m_ofn.lpstrTitle=_T("另存为");
  210.     if(SaveFileDlg.DoModal() != IDOK)
  211. return;
  212. //更改文档的文件名及路径
  213.     PathName = SaveFileDlg.GetPathName();   //取得文件名(包含路径)
  214. pDoc->FileInfo.FileName = SaveFileDlg.GetFileName(); //取得文件名  
  215.     pDoc->FileInfo.FilePath = PathName.Left(PathName.GetLength() 
  216.                                    - pDoc->FileInfo.FileName.GetLength() - 1);
  217. if(pApp->CADInfo.KindofNew == NEW_PROJECT)
  218. {
  219. pApp->ProjectInfo.FileInfo[pDoc->DocumentIndex].FileName = pDoc->FileInfo.FileName;
  220. pApp->ProjectInfo.FileInfo[pDoc->DocumentIndex].FilePath = pDoc->FileInfo.FilePath;
  221. }
  222. pDoc->SaveDocument();
  223. }
  224. //保存全部文档
  225. void CMainFrame::OnFileSaveall() 
  226. {
  227. CMultiDocTemplate* pDocTemplate;
  228.     CMiniCADDoc* pDoc;
  229. POSITION DocTemplatePosition;
  230. POSITION DocPosition;
  231. //获取文档模板
  232. DocTemplatePosition = pApp->GetFirstDocTemplatePosition();
  233. pDocTemplate = (CMultiDocTemplate*)pApp->GetNextDocTemplate(DocTemplatePosition);
  234.     ASSERT(pDocTemplate != NULL);
  235. DocPosition = pDocTemplate->GetFirstDocPosition();
  236. while(DocPosition != NULL)
  237. {
  238. pDoc = (CMiniCADDoc*)pDocTemplate->GetNextDoc(DocPosition);
  239. pDoc->SaveDocument();
  240. }
  241. }
  242. ////////////////////////////////////////////////////////////////////////////////////////////
  243. void CMainFrame::OnFileNewP() 
  244. {
  245. //如果已存在新建的项目、图纸或元件
  246. if(pApp->CADInfo.IsEmpty == FALSE)
  247. {
  248. if(MessageBox("已有项目存在,是否继续?", "提示", 
  249.           MB_OKCANCEL | MB_ICONWARNING) == 2)
  250.   return;
  251. else
  252. {
  253. //关闭当前项目
  254.             OnFileCloseP(); 
  255. }
  256. }
  257. //显示“新建”属性框
  258. CMyNewProjectDlg m_NewProjectDlg;
  259. if(m_NewProjectDlg.NewProject(&pApp->ProjectInfo) == FALSE)
  260. return;
  261. pApp->CADInfo.IsEmpty = FALSE;
  262. pApp->CADInfo.KindofNew = NEW_PROJECT;
  263. CTreeCtrl* pTree = (CTreeCtrl*)m_MyWorkBar.GetDlgItem(IDC_TREE);
  264. pTree->InsertItem((LPCTSTR)pApp->ProjectInfo.Name, 0, 0, TVI_ROOT, TVI_SORT);
  265. pTree->ShowWindow(TRUE);
  266. //更改最近项目列表
  267.     pApp->pRecentProjectList->Add((LPCTSTR)(pApp->ProjectInfo.FilePath +  "\" 
  268.                           + pApp->ProjectInfo.FileName));
  269. pApp->pRecentProjectList->WriteList();
  270. //刚刚创建新项目,自动显示“增加图纸”对话框
  271. OnFileNewFToP(); 
  272. }
  273. void CMainFrame::OnFileOpenP() 
  274. {
  275. //如果已存在新建的项目、图纸或元件
  276. if(pApp->CADInfo.IsEmpty == FALSE)
  277. {
  278. if(MessageBox("已有项目存在,是否继续?", "提示", 
  279.           MB_OKCANCEL | MB_ICONWARNING) == 2)
  280.   return;
  281. else
  282. {
  283. //关闭当前项目
  284.             OnFileCloseP(); 
  285. }
  286.   }
  287.     CString Filter="项目文件(*.prj)|*.prj|所有文件(*.*)|*.*||";
  288. CString PathName;
  289.     //实例化一个CFileDialog类
  290.     CFileDialog OpenProjectDlg(TRUE,0,0,OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|OFN_LONGNAMES,(LPCTSTR)Filter);
  291.     OpenProjectDlg.m_ofn.lpstrTitle=_T("打开项目文件");
  292.     if(OpenProjectDlg.DoModal() != IDOK)
  293. return;
  294.     PathName = OpenProjectDlg.GetPathName();   //取得文件名(包含路径)
  295. if(!OpenProject(PathName))
  296. return;
  297. pApp->CADInfo.IsEmpty = FALSE;
  298. pApp->CADInfo.KindofNew = NEW_PROJECT; 
  299. pApp->ProjectInfo.FileName = OpenProjectDlg.GetFileName(); //取得文件名  
  300.     pApp->ProjectInfo.FilePath = PathName.Left(PathName.GetLength() 
  301.                                    - pApp->ProjectInfo.FileName.GetLength() - 1);
  302.     pApp->CADInfo.ProjectPath = pApp->ProjectInfo.FilePath;
  303. //更改最近项目列表
  304. pApp->pRecentProjectList->Add((LPCTSTR)(pApp->ProjectInfo.FilePath +  "\" 
  305.                           + pApp->ProjectInfo.FileName));
  306. pApp->pRecentProjectList->WriteList();
  307. }
  308. void CMainFrame::OnFileNewFToP() 
  309. {
  310.     if(pApp->CADInfo.KindofNew != NEW_PROJECT)
  311. return;
  312.     CMyAddFileDlg MyAddFileDlg;
  313. //如果增加图纸成功
  314. //通过CMiniCADApp的成员变量NewFileInfo来传递新建文档参数
  315. if(MyAddFileDlg.AddFile(&pApp->NewFileInfo))
  316. {
  317. pApp->OnFileNew();//该函数会调用CDocument::OnNewDocument()
  318.     
  319.       CChildFrame* pChildWnd = (CChildFrame*)this->MDIGetActive();
  320. CMiniCADDoc* pDoc = (CMiniCADDoc*)pChildWnd->GetActiveDocument();
  321. pApp->ProjectInfo.FileNum++;
  322. pDoc->DocumentIndex = pApp->ProjectInfo.FileNum - 1;
  323.         pApp->ProjectInfo.FileInfo[pDoc->DocumentIndex] = pDoc->FileInfo;
  324. CMiniCADView* pView = (CMiniCADView*)pChildWnd->GetActiveView();
  325. pView->Invalidate(FALSE);
  326. HTREEITEM RootItem;
  327. HTREEITEM ChildItem; 
  328. CTreeCtrl* pTree = (CTreeCtrl*)m_MyWorkBar.GetDlgItem(IDC_TREE);
  329. RootItem = pTree->GetRootItem();
  330. ChildItem = pTree->InsertItem((LPCTSTR)pApp->ProjectInfo.FileInfo[pDoc->DocumentIndex].Name,
  331.    1, 1, RootItem);
  332. pTree->SetItemData(ChildItem, (DWORD)(pDoc->DocumentIndex));
  333. pTree->Expand(RootItem, TVE_EXPAND);
  334. }
  335. }
  336. void CMainFrame::OnUpdateFileNewFToP(CCmdUI* pCmdUI) 
  337. {
  338. //使能“增加图纸-新建”菜单命令
  339. if(pApp->CADInfo.IsEmpty == FALSE && pApp->CADInfo.KindofNew == NEW_PROJECT)
  340. pCmdUI->Enable(TRUE);
  341. else
  342. pCmdUI->Enable(FALSE);
  343. }
  344. void CMainFrame::OnFileOpenFToP() 
  345. {
  346. if(pApp->CADInfo.KindofNew == NEW_PROJECT)
  347. {
  348. pApp->OnFileOpen();
  349. CChildFrame* pChildWnd = (CChildFrame*)this->MDIGetActive();
  350. CMiniCADDoc* pDoc = (CMiniCADDoc*)pChildWnd->GetActiveDocument();
  351.         
  352. pApp->ProjectInfo.FileNum++;
  353. pDoc->DocumentIndex = pApp->ProjectInfo.FileNum -1; 
  354. pApp->ProjectInfo.FileInfo[pDoc->DocumentIndex] = pDoc->FileInfo;
  355. HTREEITEM RootItem;
  356. HTREEITEM ChildItem;
  357. CTreeCtrl* pTree = (CTreeCtrl*)m_MyWorkBar.GetDlgItem(IDC_TREE);
  358. RootItem = pTree->GetRootItem();
  359. ChildItem = pTree->InsertItem((LPCTSTR)pApp->ProjectInfo.FileInfo[pDoc->DocumentIndex].Name,
  360.    1, 1, RootItem);
  361. pTree->SetItemData(ChildItem, (DWORD)(pDoc->DocumentIndex));
  362. pTree->Expand(RootItem, TVE_EXPAND);
  363. }
  364. }
  365. void CMainFrame::OnUpdateFileOpenFToP(CCmdUI* pCmdUI) 
  366. {
  367. if(pApp->CADInfo.IsEmpty == FALSE && pApp->CADInfo.KindofNew == NEW_PROJECT)
  368. pCmdUI->Enable(TRUE);
  369. else
  370. pCmdUI->Enable(FALSE);
  371. }
  372. void CMainFrame::OnFileSaveP() 
  373. {
  374. int num;
  375. CFile fp;
  376. CString PathName;
  377. PathName = pApp->ProjectInfo.FilePath + "\" + pApp->ProjectInfo.FileName;
  378. //打开一个文件,如果该文件不存在就创建一个,如果已存在就将文件长度变为0
  379. fp.Open(PathName, CFile::modeCreate | CFile::modeWrite); 
  380. if(fp == 0)
  381. {
  382. MessageBox("打开项目文件错误",
  383. "错误", MB_OK | MB_ICONERROR);
  384. return;
  385. }
  386.     
  387. CArchive ar(&fp, CArchive::store);
  388.     ar << pApp->ProjectInfo.Name << pApp->ProjectInfo.FileNum;
  389. for(num = 0; num < pApp->ProjectInfo.FileNum; num++)
  390. pApp->ProjectInfo.FileInfo[num].Serialize(ar);
  391. //必须先关闭ar,再关闭fp
  392. ar.Close();
  393. fp.Close();
  394. }
  395. void CMainFrame::OnFileCloseP() 
  396. {
  397. if(MessageBox("关闭前是否保存全部文件?", "提示", MB_OKCANCEL 
  398.    | MB_ICONWARNING) == 1)
  399.    OnFileSaveall();//保存全部图纸
  400. if(MessageBox("关闭前是否保存项目?", "提示", MB_OKCANCEL 
  401.    | MB_ICONWARNING) == 1)
  402.    OnFileSaveP();//保存当前项目
  403. CMultiDocTemplate* pDocTemplate;
  404.     CMiniCADDoc* pDoc;
  405. POSITION DocTemplatePosition;
  406. POSITION DocPosition;
  407. pApp->CADInfo.IsEmpty = TRUE;
  408. pApp->CADInfo.KindofNew = NEW_NONE;
  409. CTreeCtrl* pTree = (CTreeCtrl*)m_MyWorkBar.GetDlgItem(IDC_TREE);
  410. pTree->DeleteAllItems();
  411. pTree->ShowWindow(FALSE);
  412. //获取文档模板
  413. DocTemplatePosition = pApp->GetFirstDocTemplatePosition();
  414. pDocTemplate = (CMultiDocTemplate*)pApp->GetNextDocTemplate(DocTemplatePosition);
  415. DocPosition = pDocTemplate->GetFirstDocPosition();
  416. for(;;)
  417. {
  418. if(DocPosition == NULL)
  419. return;
  420. //获取文档
  421. pDoc = (CMiniCADDoc*)pDocTemplate->GetNextDoc(DocPosition);
  422. ASSERT(pDoc != NULL); 
  423. pDoc->OnCloseDocument();
  424. }
  425. }
  426. ////////////////////////////////////////////////////////////////////////
  427. void CMainFrame::OnFileCloseF() 
  428. {
  429. }
  430. //////////////////////////////////////////////////////////////////////////////////////////////
  431. void CMainFrame::OnSelchangeTab(NMHDR* pNMHDR, LRESULT* pResult) 
  432. {
  433. CTabCtrl* m_Tab =(CTabCtrl*)m_MyWorkBar.GetDlgItem(IDC_TAB);
  434. switch(m_Tab->GetCurSel())
  435. {
  436. case 0:
  437. {
  438. //隐藏列表框
  439. CListCtrl* pList = (CListCtrl*)m_MyWorkBar.GetDlgItem(IDC_LIST);
  440.        pList->ShowWindow(FALSE);
  441. //当有项目存在时才显示树形框
  442. if(pApp->CADInfo.KindofNew == NEW_PROJECT)
  443. {
  444. CTreeCtrl* pTree = (CTreeCtrl*)m_MyWorkBar.GetDlgItem(IDC_TREE);
  445. pTree->ShowWindow(TRUE);
  446.             }
  447. }
  448. break;
  449. case 1:
  450. {
  451. //显示列表框
  452. CTreeCtrl* pTree = (CTreeCtrl*)m_MyWorkBar.GetDlgItem(IDC_TREE);
  453. pTree->ShowWindow(FALSE);
  454. CListCtrl* pList =
  455. (CListCtrl*)m_MyWorkBar.GetDlgItem(IDC_LIST);
  456. pList->ShowWindow(TRUE);
  457. }
  458. break;
  459. }
  460. *pResult = 0;
  461. }
  462. void CMainFrame::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult) 
  463. {
  464. // TODO: Add your control notification handler code here
  465. *pResult = 0;
  466. }
  467. void CMainFrame::OnDblclkTree(NMHDR* pNMHDR, LRESULT* pResult) 
  468. {
  469. CString PathName;
  470. int index;
  471. CMultiDocTemplate* pDocTemplate;
  472.     CMiniCADDoc* pDoc;
  473. CMiniCADView* pView;
  474. CChildFrame* pChildFrame;
  475. POSITION DocTemplatePosition;
  476. POSITION DocPosition;
  477. POSITION ViewPosition;
  478. CTreeCtrl* pTree = (CTreeCtrl*)m_MyWorkBar.GetDlgItem(IDC_TREE);
  479. HTREEITEM ChildItem = pTree->GetSelectedItem();
  480. if(ChildItem == pTree->GetRootItem())
  481. return;
  482. index = (int)pTree->GetItemData(ChildItem);
  483.     //获取文档模板
  484. DocTemplatePosition = pApp->GetFirstDocTemplatePosition();
  485. pDocTemplate = (CMultiDocTemplate*)pApp->GetNextDocTemplate(DocTemplatePosition);
  486. DocPosition = pDocTemplate->GetFirstDocPosition();
  487. for(;;)
  488. {
  489. if(DocPosition == NULL)
  490. {
  491. //如果DocPosition == NULL,说明文档没有打开
  492. //注意如果文件不存在,在CScrollView创建时会出错,现在
  493. //还不知道预先处理错误的方法
  494. PathName = pApp->ProjectInfo.FileInfo[index].FilePath + "\" + pApp->ProjectInfo.FileInfo[index].FileName;
  495. //给要激活的文档序号赋值
  496. ASSERT(AfxGetApp()->OpenDocumentFile(PathName) != NULL);
  497. CChildFrame* pChildWnd = (CChildFrame*)this->MDIGetActive();
  498. CMiniCADDoc* pDoc = (CMiniCADDoc*)pChildWnd->GetActiveDocument();
  499. pDoc->DocumentIndex = index;
  500.         
  501. *pResult = 0;
  502. return;
  503. }
  504. //获取文档
  505. pDoc = (CMiniCADDoc*)pDocTemplate->GetNextDoc(DocPosition);
  506. if(pDoc->DocumentIndex == index)
  507. break;
  508. }
  509. //获取文档的视图
  510. ViewPosition = pDoc->GetFirstViewPosition();
  511. pView = (CMiniCADView*)pDoc->GetNextView(ViewPosition);
  512. //激活子窗口
  513.     pChildFrame = (CChildFrame*)pView->GetParentFrame();
  514. pChildFrame->MDIActivate( );
  515.       
  516. *pResult = 0;
  517. }
  518. void CMainFrame::OnRclickTree(NMHDR* pNMHDR, LRESULT* pResult) 
  519. {
  520. *pResult = 0;
  521. }
  522. //////////////////////////////////////////////////////////////////////////////////////////////
  523. void CMainFrame::OnViewFull() 
  524. {
  525. if (m_pWndFullScreen != NULL)
  526. {
  527. LockWindowUpdate();
  528. m_pWndFullScreen->LockWindowUpdate();
  529. m_pWndFullScreen->ShowControlBar(&m_pWndFullScreen->m_MyCommandBar, TRUE, FALSE);
  530. ShowControlBar(&m_wndToolBar, TRUE, FALSE);
  531. ShowControlBar(&m_wndStatusBar, TRUE, FALSE);
  532. ShowControlBar(&m_MyOptionBar, TRUE, FALSE);
  533. ShowControlBar(&m_MyDrawToolBar, TRUE, FALSE);
  534. ShowControlBar(&m_MyModifyToolBar, TRUE, FALSE);
  535. ShowControlBar(&m_MyWorkBar, TRUE, FALSE);
  536.         
  537. //恢复原来状态
  538. SetWindowPlacement(&m_MainOldPlace);
  539. m_pWndFullScreen->SetWindowPlacement(&m_ChildOldPlace);
  540. UnlockWindowUpdate();
  541. m_pWndFullScreen->UnlockWindowUpdate();
  542. m_pWndFullScreen = NULL;
  543. }
  544. else
  545. {
  546. m_pWndFullScreen = (CChildFrame*)MDIGetActive();
  547. if(m_pWndFullScreen == NULL)
  548. return;
  549. LockWindowUpdate();
  550. m_pWndFullScreen->LockWindowUpdate();
  551. //隐藏各种工具条,注意应先使用LockWindowUpdate()禁止更新屏幕
  552. //这样可以加快全屏显示的速度
  553.         m_pWndFullScreen->ShowControlBar(&m_pWndFullScreen->m_MyCommandBar, FALSE, FALSE);
  554. ShowControlBar(&m_wndToolBar, FALSE, FALSE);
  555. ShowControlBar(&m_wndStatusBar,FALSE, FALSE);
  556. ShowControlBar(&m_MyOptionBar, FALSE, FALSE);
  557. ShowControlBar(&m_MyDrawToolBar, FALSE, FALSE);
  558. ShowControlBar(&m_MyModifyToolBar, FALSE, FALSE);
  559. ShowControlBar(&m_MyWorkBar, FALSE, FALSE);
  560. m_pWndFullScreen->GetWindowPlacement(&m_ChildOldPlace);
  561. GetWindowPlacement(&m_MainOldPlace);
  562. CRect rectDesktop, rectDesired;
  563. //获取全屏显示所需的客户区
  564. if (!::SystemParametersInfo(SPI_GETWORKAREA, 0, &rectDesktop, 0))
  565.   ::GetWindowRect(::GetDesktopWindow(), &rectDesktop);
  566. else
  567. {
  568. rectDesktop.right = ::GetSystemMetrics(SM_CXSCREEN);
  569. rectDesktop.bottom = ::GetSystemMetrics(SM_CYSCREEN);
  570. rectDesktop.right -= rectDesktop.left;
  571. rectDesktop.bottom -= rectDesktop.top;
  572. rectDesktop.left = rectDesktop.left;
  573. rectDesktop.top = rectDesktop.top;
  574. }
  575. rectDesired = rectDesktop;
  576. //根据客户区获取框架的尺寸
  577.     ::AdjustWindowRect(&rectDesktop, GetStyle(), TRUE);
  578. rectDesktop.bottom += ::GetSystemMetrics(SM_CYBORDER); // See "Ask Dr. GUI #10"
  579. m_FullScreenPlace = rectDesktop;
  580. WINDOWPLACEMENT wpNew = m_MainOldPlace;
  581. wpNew.showCmd =  SW_SHOWNORMAL;
  582. wpNew.rcNormalPosition = rectDesktop;
  583. //设置主框架新的状态和位置
  584. SetWindowPlacement(&wpNew);
  585. wpNew.rcNormalPosition = rectDesired;
  586. ::AdjustWindowRect(&(wpNew.rcNormalPosition), m_pWndFullScreen->GetStyle(), FALSE);
  587. //设置子框架新的状态和位置
  588. m_pWndFullScreen->SetWindowPlacement(&wpNew);
  589. UnlockWindowUpdate();
  590. m_pWndFullScreen->UnlockWindowUpdate();
  591. }
  592. }
  593. void CMainFrame::OnUpdateViewFull(CCmdUI* pCmdUI) 
  594. {
  595. if(MDIGetActive() == NULL)
  596. {
  597. pCmdUI->Enable(FALSE);
  598. return;
  599. }
  600. else
  601. {
  602. pCmdUI->Enable(TRUE);
  603. pCmdUI->SetCheck(m_pWndFullScreen != NULL);
  604. }
  605. }
  606. void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
  607. {
  608. // TODO: Add your message handler code here and/or call default
  609. if (m_pWndFullScreen != NULL)
  610. {
  611. //全屏显示时重新设置主框架最大化时的尺寸
  612. lpMMI->ptMaxSize.y = m_FullScreenPlace.Height();
  613.   lpMMI->ptMaxTrackSize.y = m_FullScreenPlace.Height();
  614. lpMMI->ptMaxSize.x = m_FullScreenPlace.Width();
  615. lpMMI->ptMaxTrackSize.x = m_FullScreenPlace.Width();
  616. }
  617. else
  618. CMDIFrameWnd::OnGetMinMaxInfo(lpMMI);  
  619. }
  620. BOOL CMainFrame::GetFullScreenSize(CWnd* pWnd, POINT& pt) 
  621. {
  622. if (m_pWndFullScreen != NULL && pWnd->m_hWnd == m_pWndFullScreen->m_hWnd)
  623. {
  624. pt.x = m_FullScreenPlace.Width();
  625. pt.y = m_FullScreenPlace.Height();
  626. }
  627. return (m_pWndFullScreen != NULL);
  628. }
  629. /////////////////////////////////////////////////////////////////////////////////////////////
  630. //实现“最近项目”的菜单功能
  631. void CMainFrame::OnFileProjectlist(UINT nID)
  632. {   
  633. UINT index;
  634. CString PathName;
  635. index = nID - ID_FILE_PROJECTLIST;
  636. PathName = (*(pApp->pRecentProjectList))[index];
  637. //如果已存在新建的项目、图纸或元件
  638. if(pApp->CADInfo.IsEmpty == FALSE)
  639. {
  640. //如果PathName是当前打开的项目,则返回
  641. if(PathName == pApp->ProjectInfo.FilePath + "\" + pApp->ProjectInfo.FileName)
  642. return;
  643. if(MessageBox("已有项目存在,是否继续?", "提示", 
  644.           MB_OKCANCEL | MB_ICONWARNING) == 2)
  645.   return;
  646. else
  647. {
  648. //关闭当前项目
  649.             OnFileCloseP(); 
  650. }
  651.   }
  652. if(!OpenProject(PathName))
  653. return;
  654. pApp->CADInfo.IsEmpty = FALSE;
  655. pApp->CADInfo.KindofNew = NEW_PROJECT; 
  656. //获取项目文件名
  657. pApp->ProjectInfo.FileName = PathName.Right(PathName.GetLength() - PathName.ReverseFind('\') 
  658.                                     - 1);
  659. //获取项目文件路径
  660.     pApp->ProjectInfo.FilePath = PathName.Left(PathName.ReverseFind('\'));
  661.     pApp->CADInfo.ProjectPath = pApp->ProjectInfo.FilePath;
  662. //更改最近项目列表
  663. pApp->pRecentProjectList->Add((LPCTSTR)(pApp->ProjectInfo.FilePath +  "\" 
  664.                           + pApp->ProjectInfo.FileName));
  665. pApp->pRecentProjectList->WriteList();
  666. }
  667. void CMainFrame::OnUpdateFileProjectlist(CCmdUI* pCmdUI) 
  668. {
  669. if(pCmdUI->m_nID == ID_FILE_PROJECTLIST)
  670. {
  671. pApp->pRecentProjectList->CRecentFileListEx::UpdateMenu(pCmdUI);
  672. }
  673. pCmdUI->Enable(TRUE);
  674. }
  675. void CMainFrame::OnFileFilelist(UINT nID)
  676. {
  677. }
  678. void CMainFrame::OnUpdateFileFilelist(CCmdUI* pCmdUI) 
  679. {
  680. if(pCmdUI->m_nID == ID_FILE_FILELIST)
  681. {
  682. //注意此时应该用基类CRecentFileList的UpdateMenu(CCmdUI* pCmdUI)
  683. //这是由CMenu的特点决定的,“最近文件”菜单项是第二个Popup菜单项,
  684. //其子菜单的pCmdUI->mIndex为0,pCmdUI->pMenu指向子菜单
  685. pApp->pRecentFileList->UpdateMenu(pCmdUI);
  686. }
  687. pCmdUI->Enable(TRUE);
  688. }
  689. void CMainFrame::OnClose() 
  690. {
  691. if(pApp->CADInfo.KindofNew == NEW_PROJECT)
  692. {
  693. //如果按下“确定”(按下“取消”返回值为2)
  694. if(MessageBox("退出前是否保存全部文件?", "提示", MB_OKCANCEL 
  695.    | MB_ICONWARNING) == 1)
  696.    OnFileSaveall();
  697. if(MessageBox("退出前是否保存项目?", "提示", MB_OKCANCEL 
  698.    | MB_ICONWARNING) == 1)
  699.    OnFileSaveP();
  700. }
  701. CMDIFrameWnd::OnClose();
  702. }
  703. BOOL CMainFrame::OpenProject(CString PathName)
  704. {
  705. HTREEITEM RootItem;
  706. HTREEITEM ChildItem;
  707. int filenum;
  708. int index;
  709. CFile fp;
  710. fp.Open(PathName, CFile::modeCreate | CFile::modeNoTruncate 
  711.     | CFile::modeRead); 
  712. if(fp == 0)
  713. {
  714. MessageBox("打开项目文件错误",
  715. "错误", MB_OK | MB_ICONERROR);
  716. return FALSE;
  717. }
  718.    
  719. CArchive ar(&fp, CArchive::load);
  720.     ar >> pApp->ProjectInfo.Name >> filenum;
  721. for(index = 0; index < filenum; index++)
  722. pApp->ProjectInfo.FileInfo[index].Serialize(ar);
  723. //显示树形控件,插入根项
  724. CTreeCtrl* pTree = (CTreeCtrl*)m_MyWorkBar.GetDlgItem(IDC_TREE);
  725. pTree->InsertItem((LPCTSTR)pApp->ProjectInfo.Name, 0, 0, TVI_ROOT, TVI_SORT);
  726. pTree->ShowWindow(TRUE);
  727. //项目文档数置0,如果打开文档成功,项目文档数中增加1
  728. pApp->ProjectInfo.FileNum = 0;
  729. for(index = 0; index < filenum; index++)
  730. {
  731. //注意如果文件不存在,在CScrollView创建时会出错,现在
  732. //还不知道预先处理错误的方法
  733. PathName = pApp->ProjectInfo.FileInfo[index].FilePath + "\" + pApp->ProjectInfo.FileInfo[index].FileName;
  734. ASSERT(pApp->OpenDocumentFile(PathName) != NULL);
  735. CChildFrame* pChildWnd = (CChildFrame*)this->MDIGetActive();
  736. CMiniCADDoc* pDoc = (CMiniCADDoc*)pChildWnd->GetActiveDocument();
  737. pApp->ProjectInfo.FileNum++;
  738. pDoc->DocumentIndex = pApp->ProjectInfo.FileNum - 1;
  739.         pApp->ProjectInfo.FileInfo[pDoc->DocumentIndex] = pDoc->FileInfo;
  740. CTreeCtrl* pTree = (CTreeCtrl*)m_MyWorkBar.GetDlgItem(IDC_TREE);
  741. RootItem = pTree->GetRootItem();
  742. ChildItem = pTree->InsertItem((LPCTSTR)pApp->ProjectInfo.FileInfo[pDoc->DocumentIndex].Name,
  743.    1, 1, RootItem);
  744. pTree->SetItemData(ChildItem, (DWORD)(pDoc->DocumentIndex));
  745. pTree->Expand(RootItem, TVE_EXPAND);
  746. }
  747.     //关闭文件
  748. fp.Close();
  749. return TRUE;
  750. }