UITabSplitterWnd.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:7k
源码类别:

图形图象

开发平台:

Visual C++

  1. //*******************************************************************************
  2. // COPYRIGHT NOTES
  3. // ---------------
  4. // You may use this source code, compile or redistribute it as part of your application 
  5. // for free. You cannot redistribute it as a part of a software development 
  6. // library without the agreement of the author. If the sources are 
  7. // distributed along with the application, you should leave the original 
  8. // copyright notes in the source code without any changes.
  9. // This code can be used WITHOUT ANY WARRANTIES at your own risk.
  10. // 
  11. // For the latest updates to this code, check this site:
  12. // http://www.masmex.com 
  13. // after Sept 2000
  14. // 
  15. // Copyright(C) 2000 Philip Oldaker <email: philip@masmex.com>
  16. //*******************************************************************************
  17. #include "stdafx.h"
  18. #include "UITabSplitterWnd.h"
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CTabSplitterWnd message handlers
  21. LPCTSTR CTabSplitterWnd::szSplitterSection = _T("Splitter");
  22. LPCTSTR CTabSplitterWnd::szPaneWidthCurrent = _T("PaneWidthCurrent");
  23. LPCTSTR CTabSplitterWnd::szPaneWidthMinimum = _T("PaneWidthMinimum");
  24. LPCTSTR CTabSplitterWnd::szPaneHeightCurrent = _T("PaneHeightCurrent");
  25. LPCTSTR CTabSplitterWnd::szPaneHeightMinimum = _T("PaneHeightMinimum");
  26. IMPLEMENT_DYNAMIC(CTabSplitterWnd, CSplitterWnd)
  27. BEGIN_MESSAGE_MAP(CTabSplitterWnd, CSplitterWnd)
  28. //{{AFX_MSG_MAP(CTabSplitterWnd)
  29. ON_WM_CLOSE()
  30. ON_WM_DESTROY()
  31. ON_WM_SETFOCUS()
  32. ON_WM_KILLFOCUS()
  33. ON_WM_MOUSEWHEEL()
  34. //}}AFX_MSG_MAP
  35. END_MESSAGE_MAP()
  36. CTabSplitterWnd::CTabSplitterWnd()
  37.  : m_strSection(szSplitterSection)
  38. {
  39. m_nCurCol = m_nCurRow = 0;
  40. m_cxCur = m_cyCur = 0;
  41. m_cxMin = m_cyMin = 0;
  42. }
  43. void CTabSplitterWnd::SetSection(LPCTSTR szSection)
  44. {
  45. m_strSection = szSplitterSection;
  46. m_strSection += _T("\");
  47. m_strSection += szSection;
  48. }
  49. CWnd *CTabSplitterWnd::GetActiveWnd()
  50. {
  51. int row, col;
  52. return GetActivePane(row,col);
  53. }
  54. void CTabSplitterWnd::ActivateNext(BOOL bPrev)
  55. {
  56. ASSERT_VALID(this);
  57. // find the coordinate of the current pane
  58. int row, col;
  59. if (GetActivePane(&row, &col) == NULL)
  60. {
  61. SetActivePane(0,0);
  62. return;
  63. }
  64. ASSERT(row >= 0 && row < m_nRows);
  65. ASSERT(col >= 0 && col < m_nCols);
  66. // determine next pane
  67. if (bPrev)
  68. {
  69. // prev
  70. if (--col < 0)
  71. {
  72. col = m_nCols - 1;
  73. if (--row < 0)
  74. row = m_nRows - 1;
  75. }
  76. }
  77. else
  78. {
  79. // next
  80. if (++col >= m_nCols)
  81. {
  82. col = 0;
  83. if (++row >= m_nRows)
  84. row = 0;
  85. }
  86. }
  87. // set newly active pane
  88. SetActivePane(row, col);
  89. }
  90. void CTabSplitterWnd::SaveSize()
  91. {
  92. #ifdef _DEBUG
  93. if (m_strSection == szSplitterSection)
  94. TRACE0("Warning: SetSection has not been called in IMSplitterWnd!n");
  95. #endif
  96. GetColumnInfo(0,m_cxCur,m_cxMin);
  97. if (m_cxCur)
  98. AfxGetApp()->WriteProfileInt(m_strSection,szPaneWidthCurrent,m_cxCur);
  99. if (m_cxMin)
  100. AfxGetApp()->WriteProfileInt(m_strSection,szPaneWidthMinimum,m_cxMin);
  101. GetRowInfo(0,m_cyCur,m_cyMin);
  102. if (m_cyCur)
  103. AfxGetApp()->WriteProfileInt(m_strSection,szPaneHeightCurrent,m_cyCur);
  104. if (m_cyMin)
  105. AfxGetApp()->WriteProfileInt(m_strSection,szPaneHeightMinimum,m_cyMin);
  106. }
  107. void CTabSplitterWnd::SetSize(int nCur,int nMin)
  108. {
  109. if (m_nRows > 1) 
  110. {
  111. m_cyCur = nCur;
  112. m_cyMin = nMin;
  113. }
  114. if (m_nCols > 1) 
  115. {
  116. m_cxCur = nCur;
  117. m_cxMin = nMin;
  118. }
  119. }
  120. void CTabSplitterWnd::Apply()
  121. {
  122. if (m_nRows > 1)
  123. {
  124. SetRowInfo(0,m_cyCur,m_cyMin);
  125. RecalcLayout();
  126. }
  127. else if (m_nCols > 1) 
  128. {
  129. SetColumnInfo(0,m_cxCur,m_cxMin);
  130. RecalcLayout();
  131. }
  132. else
  133. TRACE0("Applying splitter bar before creating it!n");
  134. }
  135. BOOL CTabSplitterWnd::CreateView(int row,int col,CRuntimeClass* pViewClass,SIZE sizeInit,CCreateContext* pContext)
  136. {
  137. if (m_nCols > 1) 
  138. {
  139. if (m_cxCur)
  140. sizeInit.cx = m_cxCur;
  141. else if (m_strSection != szSplitterSection)
  142. sizeInit.cx = AfxGetApp()->GetProfileInt(m_strSection,szPaneWidthCurrent,sizeInit.cx);
  143. m_cxCur = sizeInit.cx;
  144. }
  145. if (m_nRows > 1) 
  146. {
  147. if (m_cyCur)
  148. sizeInit.cy = m_cyCur;
  149. else if (m_strSection != szSplitterSection)
  150. sizeInit.cy = AfxGetApp()->GetProfileInt(m_strSection,szPaneHeightCurrent,sizeInit.cy);
  151. m_cyCur = sizeInit.cy;
  152. }
  153. return CSplitterWnd::CreateView(row,col,pViewClass,sizeInit,pContext);
  154. }
  155. void CTabSplitterWnd::StopTracking(BOOL bAccept)
  156. {
  157. // save old active view
  158. CWnd* pOldActiveView = GetActivePane();
  159. CSplitterWnd::StopTracking(bAccept);
  160. if (bAccept) 
  161. {
  162. if (pOldActiveView == GetActivePane())
  163. {
  164. if (pOldActiveView == NULL)
  165. {
  166. if (m_nCols > 1)
  167. SetActivePane(0, 1); 
  168. // pOldActiveView->SetFocus(); // make sure focus is restored
  169. if (m_nRows > 1)
  170. SetActivePane(0, 0); 
  171. }
  172. }
  173. SaveSize();
  174. }
  175. }
  176. /////////////////////////////////////////////////////////////////////////////
  177. // CTabSplitterWnd message handlers
  178. void CTabSplitterWnd::OnDestroy()
  179. {
  180. CSplitterWnd::OnDestroy();
  181. m_nCurRow = -1;
  182. m_nCurCol = -1;
  183. }
  184. void CTabSplitterWnd::OnClose() 
  185. {
  186. // TODO: Add your message handler code here and/or call default
  187. SaveSize();
  188. CSplitterWnd::OnClose();
  189. }
  190. void CTabSplitterWnd::OnSetFocus(CWnd* pOldWnd) 
  191. {
  192. CSplitterWnd::OnSetFocus(pOldWnd);
  193. // TODO: Add your message handler code here
  194. if (m_nCurRow >= 0 && m_nCurCol >= 0) 
  195. {
  196. SetActivePane(m_nCurRow,m_nCurCol);
  197. CWnd *pWnd = GetPane(m_nCurRow,m_nCurCol);
  198. pWnd->SetFocus();
  199. }
  200. }
  201. void CTabSplitterWnd::OnKillFocus(CWnd* pNewWnd) 
  202. {
  203. CSplitterWnd::OnKillFocus(pNewWnd);
  204. // TODO: Add your message handler code here
  205. GetActivePane(&m_nCurRow,&m_nCurCol);
  206. }
  207. // This currently only saves the first pane
  208. void CTabSplitterWnd::Serialize(CArchive& ar)
  209. {
  210. if (ar.IsStoring())
  211. {
  212. ar << m_cxCur;
  213. ar << m_cxMin;
  214. ar << m_cyCur;
  215. ar << m_cyMin;
  216. }
  217. else
  218. {
  219. ar >> m_cxCur;
  220. ar >> m_cxMin;
  221. ar >> m_cyCur;
  222. ar >> m_cyMin;
  223. }
  224. }
  225. // mouse wheel handled by the views
  226. BOOL CTabSplitterWnd::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
  227. {
  228. // TODO: Add your message handler code here and/or call default
  229. TRACE(_T("SplitterWnd mouse wheel messagen"));
  230. /* if (m_nCurRow >= 0 && m_nCurCol >= 0) 
  231. {
  232. SetActivePane(m_nCurRow,m_nCurCol);
  233. CWnd *pWnd = GetPane(m_nCurRow,m_nCurCol);
  234. }*/
  235. return TRUE;
  236. }
  237. BOOL CTabSplitterWnd::PreCreateWindow(CREATESTRUCT& cs) 
  238. {
  239. // TODO: Add your specialized code here and/or call the base class
  240. cs.lpszClass = AfxRegisterWndClass(
  241.   CS_DBLCLKS,                       
  242.   NULL,                             
  243.   NULL,                             
  244.   NULL); 
  245. ASSERT(cs.lpszClass);
  246. return CSplitterWnd::PreCreateWindow(cs);
  247. }