GuiDocBarExten.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:8k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. //-----------------------------------------------------------------------//
  2. // This is a part of the GuiLib MFC Extention.  //
  3. // Autor  :  Francisco Campos  //
  4. // (C) 2002 Francisco Campos <www.beyondata.com> All rights reserved     //
  5. // This code is provided "as is", with absolutely no warranty expressed  //
  6. // or implied. Any use is at your own risk.  //
  7. // You must obtain the author's consent before you can include this code //
  8. // in a software library.  //
  9. // If the source code in  this file is used in any application  //
  10. // then acknowledgement must be made to the author of this program  //
  11. // fcampos@tutopia.com  //
  12. //-----------------------------------------------------------------------//
  13. #include "stdafx.h"
  14. #include "GuiToolBarWnd.h"
  15. #include "GuiDocBarExten.h"
  16. #include "MenuBar.h"
  17. #ifdef _DEBUG
  18. #undef THIS_FILE
  19. static char THIS_FILE[]=__FILE__;
  20. #define new DEBUG_NEW
  21. #endif
  22. //////////////////////////////////////////////////////////////////////
  23. // Construction/Destruction
  24. //////////////////////////////////////////////////////////////////////
  25. IMPLEMENT_DYNCREATE(CGuiDocBarExten,CDockBar)
  26. BEGIN_MESSAGE_MAP(CGuiDocBarExten,CDockBar)
  27. //{{AFX_MSG_MAP(CGuiDocBarExten)
  28. //}}AFX_MSG_MAP
  29. END_MESSAGE_MAP()
  30. CGuiDocBarExten::CGuiDocBarExten()
  31. {
  32. }
  33. CGuiDocBarExten::~CGuiDocBarExten()
  34. {
  35. }
  36. /////////////////////////////////////////////////////////////////////////////
  37. // CDockBarEx message handlers
  38. void CGuiDocBarExten::BarsDocking(CFrameWnd * pFrame, DWORD dwDockStyle) 
  39. {
  40. ASSERT_VALID(pFrame);
  41. // must be CBRS_ALIGN_XXX or CBRS_FLOAT_MULTI only
  42. ASSERT((dwDockStyle & ~(CBRS_ALIGN_ANY|CBRS_FLOAT_MULTI)) == 0);
  43. pFrame->EnableDocking(dwDockStyle);
  44. for (int i = 0; i < 4; i++) {
  45. if (dwDockBarMap[i][1] & dwDockStyle & CBRS_ALIGN_ANY) {
  46. CDockBar* pDock = (CDockBar*)pFrame->GetControlBar(dwDockBarMap[i][0]);
  47. if( pDock == 0 || ! pDock->IsKindOf(RUNTIME_CLASS(CGuiDocBarExten)) ) {
  48. BOOL bNeedDelete = ! pDock->m_bAutoDelete;
  49. pDock->m_pDockSite->RemoveControlBar(pDock);
  50. pDock->m_pDockSite = 0;
  51. pDock->DestroyWindow();
  52. if( bNeedDelete )
  53. delete pDock;
  54. pDock = 0;
  55. }
  56. if( pDock == 0 ) {
  57. pDock = new CGuiDocBarExten;
  58. ASSERT_VALID(pDock);
  59. if ((!pDock) || (!pDock->Create(pFrame,
  60. WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_CHILD|WS_VISIBLE |
  61. dwDockBarMap[i][1], dwDockBarMap[i][0]))) {
  62. AfxThrowResourceException();
  63. }
  64. }
  65. }
  66. }
  67. }
  68. CSize CGuiDocBarExten::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
  69. {
  70. ASSERT_VALID(this);
  71. CSize sizeFixed = CControlBar::CalcFixedLayout(bStretch, bHorz);
  72. // get max size
  73. CSize sizeMax;
  74. if (!m_rectLayout.IsRectEmpty())
  75. {
  76. CRect rect = m_rectLayout;
  77. CalcInsideRect(rect, bHorz);
  78. sizeMax = rect.Size();
  79. }
  80. else
  81. {
  82. CRect rectFrame;
  83. CFrameWnd* pFrame = GetParentFrame();
  84. pFrame->GetClientRect(&rectFrame);
  85. sizeMax = rectFrame.Size();
  86. }
  87. // prepare for layout
  88. AFX_SIZEPARENTPARAMS layout;
  89. layout.hDWP = m_bLayoutQuery ?
  90. NULL : ::BeginDeferWindowPos(m_arrBars.GetSize());
  91. int cxBorder = 2, cyBorder = 2;
  92. CPoint pt(-cxBorder, -cyBorder);
  93. int nWidth = 0;
  94. BOOL bWrapped = FALSE;
  95. // layout all the control bars
  96. for (int nPos = 0; nPos < m_arrBars.GetSize(); nPos++)
  97. {
  98. CControlBar* pBar = GetDockedControlBar(nPos);
  99. void* pVoid = m_arrBars[nPos];
  100. if (pBar != NULL)
  101. {
  102. if(pBar->IsKindOf(RUNTIME_CLASS(CGuiToolBarWnd)) ||
  103. pBar->IsKindOf(RUNTIME_CLASS(CMenuBar)) )
  104. cxBorder = cyBorder = 0;
  105. else
  106. cxBorder = cyBorder = 2;
  107. if (pBar->IsVisible())
  108. {
  109. // get ideal rect for bar
  110. DWORD dwMode = 0;
  111. if ((pBar->m_dwStyle & CBRS_SIZE_DYNAMIC) &&
  112. (pBar->m_dwStyle & CBRS_FLOATING))
  113. dwMode |= LM_HORZ | LM_MRUWIDTH;
  114. else if (pBar->m_dwStyle & CBRS_ORIENT_HORZ)
  115. dwMode |= LM_HORZ | LM_HORZDOCK;
  116. else
  117. dwMode |=  LM_VERTDOCK;
  118. CSize sizeBar = pBar->CalcDynamicLayout(-1, dwMode);
  119. CRect rect(pt, sizeBar);
  120. // get current rect for bar
  121. CRect rectBar;
  122. pBar->GetWindowRect(&rectBar);
  123. ScreenToClient(&rectBar);
  124. if (bHorz)
  125. {
  126. // Offset Calculated Rect out to Actual
  127. if (rectBar.left > rect.left && !m_bFloating)
  128. rect.OffsetRect(rectBar.left - rect.left, 0);
  129. // If ControlBar goes off the right, then right justify
  130. if (rect.right > sizeMax.cx && !m_bFloating)
  131. {
  132. int x = rect.Width() - cxBorder;
  133. x = max(sizeMax.cx - x, pt.x);
  134. rect.OffsetRect(x - rect.left, 0);
  135. }
  136. // If ControlBar has been wrapped, then left justify
  137. if (bWrapped)
  138. {
  139. bWrapped = FALSE;
  140. rect.OffsetRect(-(rect.left + cxBorder), 0);
  141. }
  142. // If ControlBar is completely invisible, then wrap it
  143. else if ((rect.left >= (sizeMax.cx - cxBorder)) &&
  144. (nPos > 0) && (m_arrBars[nPos - 1] != NULL))
  145. {
  146. m_arrBars.InsertAt(nPos, (CObject*)NULL);
  147. pBar = NULL; pVoid = NULL;
  148. bWrapped = TRUE;
  149. }
  150. if (!bWrapped)
  151. {
  152. if (rect != rectBar)
  153. {
  154. if (!m_bLayoutQuery &&
  155. !(pBar->m_dwStyle & CBRS_FLOATING))
  156. {
  157. pBar->m_pDockContext->m_rectMRUDockPos = rect;
  158. }
  159. AfxRepositionWindow(&layout, pBar->m_hWnd, &rect);
  160. }
  161. pt.x = rect.left + sizeBar.cx - cxBorder;
  162. nWidth = max(nWidth, sizeBar.cy);
  163. }
  164. }
  165. else
  166. {
  167. // Offset Calculated Rect out to Actual
  168. if (rectBar.top > rect.top && !m_bFloating)
  169. rect.OffsetRect(0, rectBar.top - rect.top);
  170. // If ControlBar goes off the bottom, then bottom justify
  171. if (rect.bottom > sizeMax.cy && !m_bFloating)
  172. {
  173. int y = rect.Height() - cyBorder;
  174. y = max(sizeMax.cy - y, pt.y);
  175. rect.OffsetRect(0, y - rect.top);
  176. }
  177. // If ControlBar has been wrapped, then top justify
  178. if (bWrapped)
  179. {
  180. bWrapped = FALSE;
  181. rect.OffsetRect(0, -(rect.top + cyBorder));
  182. }
  183. // If ControlBar is completely invisible, then wrap it
  184. else if ((rect.top >= (sizeMax.cy - cyBorder)) &&
  185. (nPos > 0) && (m_arrBars[nPos - 1] != NULL))
  186. {
  187. m_arrBars.InsertAt(nPos, (CObject*)NULL);
  188. pBar = NULL; pVoid = NULL;
  189. bWrapped = TRUE;
  190. }
  191. if (!bWrapped)
  192. {
  193. if (rect != rectBar)
  194. {
  195. if (!m_bLayoutQuery &&
  196. !(pBar->m_dwStyle & CBRS_FLOATING))
  197. {
  198. pBar->m_pDockContext->m_rectMRUDockPos = rect;
  199. }
  200. AfxRepositionWindow(&layout, pBar->m_hWnd, &rect);
  201. }
  202. pt.y = rect.top + sizeBar.cy - cyBorder;
  203. nWidth = max(nWidth, sizeBar.cx);
  204. }
  205. }
  206. }
  207. if (!bWrapped)
  208. {
  209. // handle any delay/show hide for the bar
  210. pBar->RecalcDelayShow(&layout);
  211. }
  212. }
  213. if (pBar == NULL && pVoid == NULL && nWidth != 0)
  214. {
  215. // end of row because pBar == NULL
  216. if (bHorz)
  217. {
  218. pt.y += nWidth - cyBorder;
  219. sizeFixed.cx = max(sizeFixed.cx, pt.x);
  220. sizeFixed.cy = max(sizeFixed.cy, pt.y);
  221. pt.x = -cxBorder;
  222. }
  223. else
  224. {
  225. pt.x += nWidth - cxBorder;
  226. sizeFixed.cx = max(sizeFixed.cx, pt.x);
  227. sizeFixed.cy = max(sizeFixed.cy, pt.y);
  228. pt.y = -cyBorder;
  229. }
  230. nWidth = 0;
  231. }
  232. }
  233. if (!m_bLayoutQuery)
  234. {
  235. // move and resize all the windows at once!
  236. if (layout.hDWP == NULL || !::EndDeferWindowPos(layout.hDWP))
  237. {
  238. TRACE0("Warning: DeferWindowPos failed - low system resources.n");
  239. }
  240. }
  241. // adjust size for borders on the dock bar itself
  242. CRect rect;
  243. rect.SetRectEmpty();
  244. CalcInsideRect(rect, bHorz);
  245. if ((!bStretch || !bHorz) && sizeFixed.cx != 0)
  246. sizeFixed.cx += -rect.right + rect.left;
  247. if ((!bStretch || bHorz) && sizeFixed.cy != 0)
  248. sizeFixed.cy += -rect.bottom + rect.top;
  249. return sizeFixed;
  250. }