ChildFrameList.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #pragma once
  2. #include "ChildFrm.h"
  3. class CChildFrameList
  4. {
  5. CDocument* m_pCurrentDoc;
  6. CFrameWnd* m_pCurrentFrame;
  7. public:
  8. CChildFrameList(CFrameWnd* pFrameWnd) {
  9. m_pCurrentFrame = pFrameWnd;
  10. m_pChildViewHead = NULL;
  11. };
  12. virtual ~CChildFrameList() {};
  13. typedef struct _TabView_ {
  14. // 窗口名称;
  15. TCHAR szName[MAX_PATH] = { 0 };
  16. // 窗口句柄;
  17. CWnd* pViewWnd = NULL;
  18. // 下一个窗口;
  19. _TabView_* pNextTab = NULL;
  20. }TABVIEW, * pTABVIEW;
  21. static void* m_pChildViewHead;
  22. public:
  23. void SetDoc(CDocument* pDoc) { m_pCurrentDoc = pDoc; };
  24. // 获取视图名称;
  25. TCHAR* GetViewName(const CWnd* pViewWnd) const
  26. {
  27. if (!pViewWnd || !m_pChildViewHead)
  28. return NULL;
  29. TABVIEW* pTabView = (TABVIEW*)m_pChildViewHead;
  30. do
  31. {
  32. if (pViewWnd == pTabView->pViewWnd)
  33. return pTabView->szName;
  34. pTabView = pTabView->pNextTab;
  35. } while (pTabView);
  36. return NULL;
  37. }
  38. // 获取视图窗口句柄;
  39. CWnd* GetViewWnd(const TCHAR* pViewName)
  40. {
  41. if (!pViewName || !m_pChildViewHead)
  42. return NULL;
  43. TABVIEW* pTabView = (TABVIEW*)m_pChildViewHead;
  44. do
  45. {
  46. // 注意如果是中文比较,该函数是否会有问题;
  47. if (_tcsicmp(pViewName, pTabView->szName) == 0)
  48. return pTabView->pViewWnd;
  49. pTabView = pTabView->pNextTab;
  50. } while (pTabView);
  51. return NULL;
  52. }
  53. // 添加新的视图窗口;
  54. void AppendView(const TCHAR* pszViewName, CRuntimeClass* pNewViewClass, UINT nIcon, UINT nID)
  55. {
  56. CChildFrame* pViewWnd = (CChildFrame*)GetViewWnd(pszViewName);
  57. // 已存在;
  58. if (pViewWnd) {
  59. pViewWnd->MDIActivate();
  60. return;
  61. }
  62. pViewWnd = new CChildFrame();
  63. if (pViewWnd)
  64. {
  65. TABVIEW* pNewView = new TABVIEW();
  66. if (pNewView == NULL) {
  67. delete pViewWnd;
  68. return;
  69. }
  70. // 视图窗口;
  71. CCreateContext context;
  72. context.m_pLastView = NULL;
  73. context.m_pCurrentFrame = m_pCurrentFrame;
  74. context.m_pCurrentDoc = m_pCurrentDoc;
  75. context.m_pNewViewClass = pNewViewClass;
  76. context.m_pNewDocTemplate = m_pCurrentDoc->GetDocTemplate();
  77. if (!pViewWnd->LoadFrame(nID, WS_CHILDWINDOW, m_pCurrentFrame, &context)) {
  78. delete pViewWnd;
  79. return;
  80. }
  81. pNewView->pViewWnd = (CWnd*)pViewWnd;
  82. memcpy(pNewView->szName, pszViewName, MAX_PATH);
  83. pNewView->pNextTab = (TABVIEW*)m_pChildViewHead;
  84. m_pChildViewHead = (void*)pNewView;
  85. pViewWnd->InitialUpdateFrame(NULL, true); //真正创建
  86. pViewWnd->ShowWindow(SW_MAXIMIZE);
  87. }
  88. }
  89. void CloseView(const TCHAR* pszViewName)
  90. {
  91. if (!pszViewName || !m_pChildViewHead)
  92. return;
  93. // 查找视图;
  94. TABVIEW* pLastTab = NULL, * pTabView = (TABVIEW*)m_pChildViewHead;
  95. do
  96. {
  97. if (_tcsicmp(pTabView->szName, pszViewName) == 0) {
  98. pTabView->pViewWnd->SendMessage(WM_CLOSE);
  99. if (pLastTab == NULL)
  100. m_pChildViewHead = pTabView->pNextTab;
  101. else
  102. pLastTab->pNextTab = pTabView->pNextTab;
  103. // 删除对象;
  104. delete pTabView; pTabView = NULL;
  105. break;
  106. }
  107. pLastTab = pTabView;
  108. pTabView = pTabView->pNextTab;
  109. } while (pTabView);
  110. }
  111. void CloseView(CWnd* pViewWnd)
  112. {
  113. if (!pViewWnd || !m_pChildViewHead)
  114. return;
  115. // 查找视图;
  116. TABVIEW* pLastTab = NULL, * pTabView = (TABVIEW*)m_pChildViewHead;
  117. do
  118. {
  119. if (pTabView->pViewWnd == pViewWnd) {
  120. pTabView->pViewWnd->SendMessage(WM_CLOSE);
  121. if (pLastTab == NULL)
  122. m_pChildViewHead = pTabView->pNextTab;
  123. else
  124. pLastTab->pNextTab = pTabView->pNextTab;
  125. // 删除对象;
  126. delete pTabView; pTabView = NULL;
  127. break;
  128. }
  129. pLastTab = pTabView;
  130. pTabView = pTabView->pNextTab;
  131. } while (pTabView);
  132. }
  133. void CloseAllView()
  134. {
  135. if (!m_pChildViewHead)
  136. return;
  137. TABVIEW* pTabView = (TABVIEW*)m_pChildViewHead;
  138. do
  139. {
  140. pTabView->pViewWnd->SendMessage(WM_CLOSE);
  141. m_pChildViewHead = pTabView->pNextTab;
  142. // 删除对象;
  143. delete pTabView; pTabView = NULL;
  144. pTabView = pTabView->pNextTab;
  145. } while (pTabView);
  146. }
  147. BOOL SwitchView(const TCHAR* pszViewName)
  148. {
  149. if (!pszViewName || !m_pChildViewHead)
  150. return FALSE;
  151. // 隐藏当前活动视图;
  152. CWnd* pActiveWnd = m_pCurrentFrame->GetActiveFrame();
  153. if (pActiveWnd)
  154. pActiveWnd->ShowWindow(SW_HIDE);
  155. // 是否已存在该视图;
  156. CChildFrame* pViewWnd = (CChildFrame*)GetViewWnd(pszViewName);
  157. // 已存在;
  158. if (pViewWnd) {
  159. pViewWnd->MDIActivate();
  160. return TRUE;
  161. }
  162. return FALSE;
  163. }
  164. };