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, 50), 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. // TODO: Add your command handler code here
  228. CMultiDocTemplate* pDocTemplate;
  229.     CMiniCADDoc* pDoc;
  230. POSITION DocTemplatePosition;
  231. POSITION DocPosition;
  232. //获取文档模板
  233. DocTemplatePosition = pApp->GetFirstDocTemplatePosition();
  234. pDocTemplate = (CMultiDocTemplate*)pApp->GetNextDocTemplate(DocTemplatePosition);
  235.     ASSERT(pDocTemplate != NULL);
  236. DocPosition = pDocTemplate->GetFirstDocPosition();
  237. while(DocPosition != NULL)
  238. {
  239. pDoc = (CMiniCADDoc*)pDocTemplate->GetNextDoc(DocPosition);
  240. pDoc->SaveDocument();
  241. }
  242. }
  243. ////////////////////////////////////////////////////////////////////////////////////////////
  244. void CMainFrame::OnFileNewP() 
  245. {
  246. // TODO: Add your command handler code here
  247. //如果已存在新建的项目、图纸或元件
  248. if(pApp->CADInfo.IsEmpty == FALSE)
  249. {
  250. if(MessageBox("已有项目存在,是否继续?", "提示", 
  251.           MB_OKCANCEL | MB_ICONWARNING) == 2)
  252.   return;
  253. else
  254. {
  255. //关闭当前项目
  256.             OnFileCloseP(); 
  257. }
  258. }
  259. //显示“新建”属性框
  260. CMyNewProjectDlg m_NewProjectDlg;
  261. if(m_NewProjectDlg.NewProject(&pApp->ProjectInfo) == FALSE)
  262. return;
  263. pApp->CADInfo.IsEmpty = FALSE;
  264. pApp->CADInfo.KindofNew = NEW_PROJECT;
  265. CTreeCtrl* pTree = (CTreeCtrl*)m_MyWorkBar.GetDlgItem(IDC_TREE);
  266. pTree->InsertItem((LPCTSTR)pApp->ProjectInfo.Name, 0, 0, TVI_ROOT, TVI_SORT);
  267. pTree->ShowWindow(TRUE);
  268. //更改最近项目列表
  269.     pApp->pRecentProjectList->Add((LPCTSTR)(pApp->ProjectInfo.FilePath +  "\" 
  270.                           + pApp->ProjectInfo.FileName));
  271. pApp->pRecentProjectList->WriteList();
  272. //刚刚创建新项目,自动显示“增加图纸”对话框
  273. OnFileNewFToP(); 
  274. }
  275. void CMainFrame::OnFileOpenP() 
  276. {
  277. //如果已存在新建的项目、图纸或元件
  278. if(pApp->CADInfo.IsEmpty == FALSE)
  279. {
  280. if(MessageBox("已有项目存在,是否继续?", "提示", 
  281.           MB_OKCANCEL | MB_ICONWARNING) == 2)
  282.   return;
  283. else
  284. {
  285. //关闭当前项目
  286.             OnFileCloseP(); 
  287. }
  288.   }
  289.     CString Filter="项目文件(*.prj)|*.prj|所有文件(*.*)|*.*||";
  290. CString PathName;
  291.     //实例化一个CFileDialog类
  292.     CFileDialog OpenProjectDlg(TRUE,0,0,OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|OFN_LONGNAMES,(LPCTSTR)Filter);
  293.     OpenProjectDlg.m_ofn.lpstrTitle=_T("打开项目文件");
  294.     if(OpenProjectDlg.DoModal() != IDOK)
  295. return;
  296.     PathName = OpenProjectDlg.GetPathName();   //取得文件名(包含路径)
  297. if(!OpenProject(PathName))
  298. return;
  299. pApp->CADInfo.IsEmpty = FALSE;
  300. pApp->CADInfo.KindofNew = NEW_PROJECT; 
  301. pApp->ProjectInfo.FileName = OpenProjectDlg.GetFileName(); //取得文件名  
  302.     pApp->ProjectInfo.FilePath = PathName.Left(PathName.GetLength() 
  303.                                    - pApp->ProjectInfo.FileName.GetLength() - 1);
  304.     pApp->CADInfo.ProjectPath = pApp->ProjectInfo.FilePath;
  305. //更改最近项目列表
  306. pApp->pRecentProjectList->Add((LPCTSTR)(pApp->ProjectInfo.FilePath +  "\" 
  307.                           + pApp->ProjectInfo.FileName));
  308. pApp->pRecentProjectList->WriteList();
  309. }
  310. void CMainFrame::OnFileNewFToP() 
  311. {
  312.     if(pApp->CADInfo.KindofNew != NEW_PROJECT)
  313. return;
  314.     CMyAddFileDlg MyAddFileDlg;
  315. //如果增加图纸成功
  316. //通过CMiniCADApp的成员变量NewFileInfo来传递新建文档参数
  317. if(MyAddFileDlg.AddFile(&pApp->NewFileInfo))
  318. {
  319. pApp->OnFileNew();//该函数会调用CDocument::OnNewDocument()
  320.     
  321.       CChildFrame* pChildWnd = (CChildFrame*)this->MDIGetActive();
  322. CMiniCADDoc* pDoc = (CMiniCADDoc*)pChildWnd->GetActiveDocument();
  323. pApp->ProjectInfo.FileNum++;
  324. pDoc->DocumentIndex = pApp->ProjectInfo.FileNum - 1;
  325.         pApp->ProjectInfo.FileInfo[pDoc->DocumentIndex] = pDoc->FileInfo;
  326. CMiniCADView* pView = (CMiniCADView*)pChildWnd->GetActiveView();
  327. pView->Invalidate(FALSE);
  328. HTREEITEM RootItem;
  329. HTREEITEM ChildItem; 
  330. CTreeCtrl* pTree = (CTreeCtrl*)m_MyWorkBar.GetDlgItem(IDC_TREE);
  331. RootItem = pTree->GetRootItem();
  332. ChildItem = pTree->InsertItem((LPCTSTR)pApp->ProjectInfo.FileInfo[pDoc->DocumentIndex].Name,
  333.    1, 1, RootItem);
  334. pTree->SetItemData(ChildItem, (DWORD)(pDoc->DocumentIndex));
  335. pTree->Expand(RootItem, TVE_EXPAND);
  336. }
  337. }
  338. void CMainFrame::OnUpdateFileNewFToP(CCmdUI* pCmdUI) 
  339. {
  340. // TODO: Add your command update UI handler code here
  341. //使能“增加图纸-新建”菜单命令
  342. if(pApp->CADInfo.IsEmpty == FALSE && pApp->CADInfo.KindofNew == NEW_PROJECT)
  343. pCmdUI->Enable(TRUE);
  344. else
  345. pCmdUI->Enable(FALSE);
  346. }
  347. void CMainFrame::OnFileOpenFToP() 
  348. {
  349. // TODO: Add your command handler code here
  350. if(pApp->CADInfo.KindofNew == NEW_PROJECT)
  351. {
  352. pApp->OnFileOpen();
  353. CChildFrame* pChildWnd = (CChildFrame*)this->MDIGetActive();
  354. CMiniCADDoc* pDoc = (CMiniCADDoc*)pChildWnd->GetActiveDocument();
  355.         
  356. pApp->ProjectInfo.FileNum++;
  357. pDoc->DocumentIndex = pApp->ProjectInfo.FileNum -1; 
  358. pApp->ProjectInfo.FileInfo[pDoc->DocumentIndex] = pDoc->FileInfo;
  359. HTREEITEM RootItem;
  360. HTREEITEM ChildItem;
  361. CTreeCtrl* pTree = (CTreeCtrl*)m_MyWorkBar.GetDlgItem(IDC_TREE);
  362. RootItem = pTree->GetRootItem();
  363. ChildItem = pTree->InsertItem((LPCTSTR)pApp->ProjectInfo.FileInfo[pDoc->DocumentIndex].Name,
  364.    1, 1, RootItem);
  365. pTree->SetItemData(ChildItem, (DWORD)(pDoc->DocumentIndex));
  366. pTree->Expand(RootItem, TVE_EXPAND);
  367. }
  368. }
  369. void CMainFrame::OnUpdateFileOpenFToP(CCmdUI* pCmdUI) 
  370. {
  371. if(pApp->CADInfo.IsEmpty == FALSE && pApp->CADInfo.KindofNew == NEW_PROJECT)
  372. pCmdUI->Enable(TRUE);
  373. else
  374. pCmdUI->Enable(FALSE);
  375. }
  376. void CMainFrame::OnFileSaveP() 
  377. {
  378. int num;
  379. CFile fp;
  380. CString PathName;
  381. PathName = pApp->ProjectInfo.FilePath + "\" + pApp->ProjectInfo.FileName;
  382. //打开一个文件,如果该文件不存在就创建一个,如果已存在就将文件长度变为0
  383. fp.Open(PathName, CFile::modeCreate | CFile::modeWrite); 
  384. if(fp == 0)
  385. {
  386. MessageBox("打开项目文件错误",
  387. "错误", MB_OK | MB_ICONERROR);
  388. return;
  389. }
  390.     
  391. CArchive ar(&fp, CArchive::store);
  392.     ar << pApp->ProjectInfo.Name << pApp->ProjectInfo.FileNum;
  393. for(num = 0; num < pApp->ProjectInfo.FileNum; num++)
  394. pApp->ProjectInfo.FileInfo[num].Serialize(ar);
  395. //必须先关闭ar,再关闭fp
  396. ar.Close();
  397. fp.Close();
  398. }
  399. void CMainFrame::OnFileCloseP() 
  400. {
  401. if(MessageBox("关闭前是否保存全部文件?", "提示", MB_OKCANCEL 
  402.    | MB_ICONWARNING) == 1)
  403.    OnFileSaveall();//保存全部图纸
  404. if(MessageBox("关闭前是否保存项目?", "提示", MB_OKCANCEL 
  405.    | MB_ICONWARNING) == 1)
  406.    OnFileSaveP();//保存当前项目
  407. CMultiDocTemplate* pDocTemplate;
  408.     CMiniCADDoc* pDoc;
  409. POSITION DocTemplatePosition;
  410. POSITION DocPosition;
  411. pApp->CADInfo.IsEmpty = TRUE;
  412. pApp->CADInfo.KindofNew = NEW_NONE;
  413. CTreeCtrl* pTree = (CTreeCtrl*)m_MyWorkBar.GetDlgItem(IDC_TREE);
  414. pTree->DeleteAllItems();
  415. pTree->ShowWindow(FALSE);
  416. //获取文档模板
  417. DocTemplatePosition = pApp->GetFirstDocTemplatePosition();
  418. pDocTemplate = (CMultiDocTemplate*)pApp->GetNextDocTemplate(DocTemplatePosition);
  419. DocPosition = pDocTemplate->GetFirstDocPosition();
  420. for(;;)
  421. {
  422. if(DocPosition == NULL)
  423. return;
  424. //获取文档
  425. pDoc = (CMiniCADDoc*)pDocTemplate->GetNextDoc(DocPosition);
  426. ASSERT(pDoc != NULL); 
  427. pDoc->OnCloseDocument();
  428. }
  429. }
  430. ////////////////////////////////////////////////////////////////////////
  431. void CMainFrame::OnFileCloseF() 
  432. {
  433. }
  434. //////////////////////////////////////////////////////////////////////////////////////////////
  435. void CMainFrame::OnSelchangeTab(NMHDR* pNMHDR, LRESULT* pResult) 
  436. {
  437. CTabCtrl* m_Tab =(CTabCtrl*)m_MyWorkBar.GetDlgItem(IDC_TAB);
  438. switch(m_Tab->GetCurSel())
  439. {
  440. case 0:
  441. {
  442. //隐藏列表框
  443. CListCtrl* pList = (CListCtrl*)m_MyWorkBar.GetDlgItem(IDC_LIST);
  444.        pList->ShowWindow(FALSE);
  445. //当有项目存在时才显示树形框
  446. if(pApp->CADInfo.KindofNew == NEW_PROJECT)
  447. {
  448. CTreeCtrl* pTree = (CTreeCtrl*)m_MyWorkBar.GetDlgItem(IDC_TREE);
  449. pTree->ShowWindow(TRUE);
  450.             }
  451. }
  452. break;
  453. case 1:
  454. {
  455. //显示列表框
  456. CTreeCtrl* pTree = (CTreeCtrl*)m_MyWorkBar.GetDlgItem(IDC_TREE);
  457. pTree->ShowWindow(FALSE);
  458. CListCtrl* pList =
  459. (CListCtrl*)m_MyWorkBar.GetDlgItem(IDC_LIST);
  460. pList->ShowWindow(TRUE);
  461. }
  462. break;
  463. }
  464. *pResult = 0;
  465. }
  466. void CMainFrame::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult) 
  467. {
  468. // TODO: Add your control notification handler code here
  469. *pResult = 0;
  470. }
  471. void CMainFrame::OnDblclkTree(NMHDR* pNMHDR, LRESULT* pResult) 
  472. {
  473. CString PathName;
  474. int index;
  475. CMultiDocTemplate* pDocTemplate;
  476.     CMiniCADDoc* pDoc;
  477. CMiniCADView* pView;
  478. CChildFrame* pChildFrame;
  479. POSITION DocTemplatePosition;
  480. POSITION DocPosition;
  481. POSITION ViewPosition;
  482. CTreeCtrl* pTree = (CTreeCtrl*)m_MyWorkBar.GetDlgItem(IDC_TREE);
  483. HTREEITEM ChildItem = pTree->GetSelectedItem();
  484. if(ChildItem == pTree->GetRootItem())
  485. return;
  486. index = (int)pTree->GetItemData(ChildItem);
  487.     //获取文档模板
  488. DocTemplatePosition = pApp->GetFirstDocTemplatePosition();
  489. pDocTemplate = (CMultiDocTemplate*)pApp->GetNextDocTemplate(DocTemplatePosition);
  490. DocPosition = pDocTemplate->GetFirstDocPosition();
  491. for(;;)
  492. {
  493. if(DocPosition == NULL)
  494. {
  495. //如果DocPosition == NULL,说明文档没有打开
  496. //注意如果文件不存在,在CScrollView创建时会出错,现在
  497. //还不知道预先处理错误的方法
  498. PathName = pApp->ProjectInfo.FileInfo[index].FilePath + "\" + pApp->ProjectInfo.FileInfo[index].FileName;
  499. //给要激活的文档序号赋值
  500. ASSERT(AfxGetApp()->OpenDocumentFile(PathName) != NULL);
  501. CChildFrame* pChildWnd = (CChildFrame*)this->MDIGetActive();
  502. CMiniCADDoc* pDoc = (CMiniCADDoc*)pChildWnd->GetActiveDocument();
  503. pDoc->DocumentIndex = index;
  504.         
  505. *pResult = 0;
  506. return;
  507. }
  508. //获取文档
  509. pDoc = (CMiniCADDoc*)pDocTemplate->GetNextDoc(DocPosition);
  510. if(pDoc->DocumentIndex == index)
  511. break;
  512. }
  513. //获取文档的视图
  514. ViewPosition = pDoc->GetFirstViewPosition();
  515. pView = (CMiniCADView*)pDoc->GetNextView(ViewPosition);
  516. //激活子窗口
  517.     pChildFrame = (CChildFrame*)pView->GetParentFrame();
  518. pChildFrame->MDIActivate( );
  519.       
  520. *pResult = 0;
  521. }
  522. void CMainFrame::OnRclickTree(NMHDR* pNMHDR, LRESULT* pResult) 
  523. {
  524. *pResult = 0;
  525. }
  526. //////////////////////////////////////////////////////////////////////////////////////////////
  527. void CMainFrame::OnViewFull() 
  528. {
  529. if (m_pWndFullScreen != NULL)
  530. {
  531. LockWindowUpdate();
  532. m_pWndFullScreen->LockWindowUpdate();
  533. m_pWndFullScreen->ShowControlBar(&m_pWndFullScreen->m_MyCommandBar, TRUE, FALSE);
  534. ShowControlBar(&m_wndToolBar, TRUE, FALSE);
  535. ShowControlBar(&m_wndStatusBar, TRUE, FALSE);
  536. ShowControlBar(&m_MyOptionBar, TRUE, FALSE);
  537. ShowControlBar(&m_MyDrawToolBar, TRUE, FALSE);
  538. ShowControlBar(&m_MyModifyToolBar, TRUE, FALSE);
  539. ShowControlBar(&m_MyWorkBar, TRUE, FALSE);
  540.         
  541. //恢复原来状态
  542. SetWindowPlacement(&m_MainOldPlace);
  543. m_pWndFullScreen->SetWindowPlacement(&m_ChildOldPlace);
  544. UnlockWindowUpdate();
  545. m_pWndFullScreen->UnlockWindowUpdate();
  546. m_pWndFullScreen = NULL;
  547. }
  548. else
  549. {
  550. m_pWndFullScreen = (CChildFrame*)MDIGetActive();
  551. if(m_pWndFullScreen == NULL)
  552. return;
  553. LockWindowUpdate();
  554. m_pWndFullScreen->LockWindowUpdate();
  555. //隐藏各种工具条,注意应先使用LockWindowUpdate()禁止更新屏幕
  556. //这样可以加快全屏显示的速度
  557.         m_pWndFullScreen->ShowControlBar(&m_pWndFullScreen->m_MyCommandBar, FALSE, FALSE);
  558. ShowControlBar(&m_wndToolBar, FALSE, FALSE);
  559. ShowControlBar(&m_wndStatusBar,FALSE, FALSE);
  560. ShowControlBar(&m_MyOptionBar, FALSE, FALSE);
  561. ShowControlBar(&m_MyDrawToolBar, FALSE, FALSE);
  562. ShowControlBar(&m_MyModifyToolBar, FALSE, FALSE);
  563. ShowControlBar(&m_MyWorkBar, FALSE, FALSE);
  564. m_pWndFullScreen->GetWindowPlacement(&m_ChildOldPlace);
  565. GetWindowPlacement(&m_MainOldPlace);
  566. CRect rectDesktop, rectDesired;
  567. //获取全屏显示所需的客户区
  568. if (!::SystemParametersInfo(SPI_GETWORKAREA, 0, &rectDesktop, 0))
  569.   ::GetWindowRect(::GetDesktopWindow(), &rectDesktop);
  570. else
  571. {
  572. rectDesktop.right = ::GetSystemMetrics(SM_CXSCREEN);
  573. rectDesktop.bottom = ::GetSystemMetrics(SM_CYSCREEN);
  574. rectDesktop.right -= rectDesktop.left;
  575. rectDesktop.bottom -= rectDesktop.top;
  576. rectDesktop.left = rectDesktop.left;
  577. rectDesktop.top = rectDesktop.top;
  578. }
  579. rectDesired = rectDesktop;
  580. //根据客户区获取框架的尺寸
  581.     ::AdjustWindowRect(&rectDesktop, GetStyle(), TRUE);
  582. rectDesktop.bottom += ::GetSystemMetrics(SM_CYBORDER); // See "Ask Dr. GUI #10"
  583. m_FullScreenPlace = rectDesktop;
  584. WINDOWPLACEMENT wpNew = m_MainOldPlace;
  585. wpNew.showCmd =  SW_SHOWNORMAL;
  586. wpNew.rcNormalPosition = rectDesktop;
  587. //设置主框架新的状态和位置
  588. SetWindowPlacement(&wpNew);
  589. wpNew.rcNormalPosition = rectDesired;
  590. ::AdjustWindowRect(&(wpNew.rcNormalPosition), m_pWndFullScreen->GetStyle(), FALSE);
  591. //设置子框架新的状态和位置
  592. m_pWndFullScreen->SetWindowPlacement(&wpNew);
  593. UnlockWindowUpdate();
  594. m_pWndFullScreen->UnlockWindowUpdate();
  595. }
  596. }
  597. void CMainFrame::OnUpdateViewFull(CCmdUI* pCmdUI) 
  598. {
  599. if(MDIGetActive() == NULL)
  600. {
  601. pCmdUI->Enable(FALSE);
  602. return;
  603. }
  604. else
  605. {
  606. pCmdUI->Enable(TRUE);
  607. pCmdUI->SetCheck(m_pWndFullScreen != NULL);
  608. }
  609. }
  610. void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
  611. {
  612. // TODO: Add your message handler code here and/or call default
  613. if (m_pWndFullScreen != NULL)
  614. {
  615. //全屏显示时重新设置主框架最大化时的尺寸
  616. lpMMI->ptMaxSize.y = m_FullScreenPlace.Height();
  617.   lpMMI->ptMaxTrackSize.y = m_FullScreenPlace.Height();
  618. lpMMI->ptMaxSize.x = m_FullScreenPlace.Width();
  619. lpMMI->ptMaxTrackSize.x = m_FullScreenPlace.Width();
  620. }
  621. else
  622. CMDIFrameWnd::OnGetMinMaxInfo(lpMMI);  
  623. }
  624. BOOL CMainFrame::GetFullScreenSize(CWnd* pWnd, POINT& pt) 
  625. {
  626. if (m_pWndFullScreen != NULL && pWnd->m_hWnd == m_pWndFullScreen->m_hWnd)
  627. {
  628. pt.x = m_FullScreenPlace.Width();
  629. pt.y = m_FullScreenPlace.Height();
  630. }
  631. return (m_pWndFullScreen != NULL);
  632. }
  633. /////////////////////////////////////////////////////////////////////////////////////////////
  634. //实现“最近项目”的菜单功能
  635. void CMainFrame::OnFileProjectlist(UINT nID)
  636. {   
  637. UINT index;
  638. CString PathName;
  639. index = nID - ID_FILE_PROJECTLIST;
  640. PathName = (*(pApp->pRecentProjectList))[index];
  641. //如果已存在新建的项目、图纸或元件
  642. if(pApp->CADInfo.IsEmpty == FALSE)
  643. {
  644. //如果PathName是当前打开的项目,则返回
  645. if(PathName == pApp->ProjectInfo.FilePath + "\" + pApp->ProjectInfo.FileName)
  646. return;
  647. if(MessageBox("已有项目存在,是否继续?", "提示", 
  648.           MB_OKCANCEL | MB_ICONWARNING) == 2)
  649.   return;
  650. else
  651. {
  652. //关闭当前项目
  653.             OnFileCloseP(); 
  654. }
  655.   }
  656. if(!OpenProject(PathName))
  657. return;
  658. pApp->CADInfo.IsEmpty = FALSE;
  659. pApp->CADInfo.KindofNew = NEW_PROJECT; 
  660. //获取项目文件名
  661. pApp->ProjectInfo.FileName = PathName.Right(PathName.GetLength() - PathName.ReverseFind('\') 
  662.                                     - 1);
  663. //获取项目文件路径
  664.     pApp->ProjectInfo.FilePath = PathName.Left(PathName.ReverseFind('\'));
  665.     pApp->CADInfo.ProjectPath = pApp->ProjectInfo.FilePath;
  666. //更改最近项目列表
  667. pApp->pRecentProjectList->Add((LPCTSTR)(pApp->ProjectInfo.FilePath +  "\" 
  668.                           + pApp->ProjectInfo.FileName));
  669. pApp->pRecentProjectList->WriteList();
  670. }
  671. void CMainFrame::OnUpdateFileProjectlist(CCmdUI* pCmdUI) 
  672. {
  673. if(pCmdUI->m_nID == ID_FILE_PROJECTLIST)
  674. {
  675. pApp->pRecentProjectList->CRecentFileListEx::UpdateMenu(pCmdUI);
  676. }
  677. pCmdUI->Enable(TRUE);
  678. }
  679. void CMainFrame::OnFileFilelist(UINT nID)
  680. {
  681. }
  682. void CMainFrame::OnUpdateFileFilelist(CCmdUI* pCmdUI) 
  683. {
  684. if(pCmdUI->m_nID == ID_FILE_FILELIST)
  685. {
  686. //注意此时应该用基类CRecentFileList的UpdateMenu(CCmdUI* pCmdUI)
  687. //这是由CMenu的特点决定的,“最近文件”菜单项是第二个Popup菜单项,
  688. //其子菜单的pCmdUI->mIndex为0,pCmdUI->pMenu指向子菜单
  689. pApp->pRecentFileList->UpdateMenu(pCmdUI);
  690. }
  691. pCmdUI->Enable(TRUE);
  692. }
  693. void CMainFrame::OnClose() 
  694. {
  695. if(pApp->CADInfo.KindofNew == NEW_PROJECT)
  696. {
  697. //如果按下“确定”(按下“取消”返回值为2)
  698. if(MessageBox("退出前是否保存全部文件?", "提示", MB_OKCANCEL 
  699.    | MB_ICONWARNING) == 1)
  700.    OnFileSaveall();
  701. if(MessageBox("退出前是否保存项目?", "提示", MB_OKCANCEL 
  702.    | MB_ICONWARNING) == 1)
  703.    OnFileSaveP();
  704. }
  705. CMDIFrameWnd::OnClose();
  706. }
  707. BOOL CMainFrame::OpenProject(CString PathName)
  708. {
  709. HTREEITEM RootItem;
  710. HTREEITEM ChildItem;
  711. int filenum;
  712. int index;
  713. CFile fp;
  714. fp.Open(PathName, CFile::modeCreate | CFile::modeNoTruncate 
  715.     | CFile::modeRead); 
  716. if(fp == 0)
  717. {
  718. MessageBox("打开项目文件错误",
  719. "错误", MB_OK | MB_ICONERROR);
  720. return FALSE;
  721. }
  722.    
  723. CArchive ar(&fp, CArchive::load);
  724.     ar >> pApp->ProjectInfo.Name >> filenum;
  725. for(index = 0; index < filenum; index++)
  726. pApp->ProjectInfo.FileInfo[index].Serialize(ar);
  727. //显示树形控件,插入根项
  728. CTreeCtrl* pTree = (CTreeCtrl*)m_MyWorkBar.GetDlgItem(IDC_TREE);
  729. pTree->InsertItem((LPCTSTR)pApp->ProjectInfo.Name, 0, 0, TVI_ROOT, TVI_SORT);
  730. pTree->ShowWindow(TRUE);
  731. //项目文档数置0,如果打开文档成功,项目文档数中增加1
  732. pApp->ProjectInfo.FileNum = 0;
  733. for(index = 0; index < filenum; index++)
  734. {
  735. //注意如果文件不存在,在CScrollView创建时会出错,现在
  736. //还不知道预先处理错误的方法
  737. PathName = pApp->ProjectInfo.FileInfo[index].FilePath + "\" + pApp->ProjectInfo.FileInfo[index].FileName;
  738. ASSERT(pApp->OpenDocumentFile(PathName) != NULL);
  739. CChildFrame* pChildWnd = (CChildFrame*)this->MDIGetActive();
  740. CMiniCADDoc* pDoc = (CMiniCADDoc*)pChildWnd->GetActiveDocument();
  741. pApp->ProjectInfo.FileNum++;
  742. pDoc->DocumentIndex = pApp->ProjectInfo.FileNum - 1;
  743.         pApp->ProjectInfo.FileInfo[pDoc->DocumentIndex] = pDoc->FileInfo;
  744. CTreeCtrl* pTree = (CTreeCtrl*)m_MyWorkBar.GetDlgItem(IDC_TREE);
  745. RootItem = pTree->GetRootItem();
  746. ChildItem = pTree->InsertItem((LPCTSTR)pApp->ProjectInfo.FileInfo[pDoc->DocumentIndex].Name,
  747.    1, 1, RootItem);
  748. pTree->SetItemData(ChildItem, (DWORD)(pDoc->DocumentIndex));
  749. pTree->Expand(RootItem, TVE_EXPAND);
  750. }
  751.     //关闭文件
  752. fp.Close();
  753. return TRUE;
  754. }