ChildFrameList.h 4.4 KB

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