NGenericDockBar.cpp
上传用户:whjcdz88
上传日期:2007-01-02
资源大小:350k
文件大小:7k
源码类别:

工具条

开发平台:

Visual C++

  1. // NGenericDockBar.cpp: implementation of the CNGenericDockBar class.
  2. //
  3. /*
  4. Copyright (C) 1998 Tony Hoyle (tmh@netfusion.co.uk)
  5. This program is free software; you can redistribute it and/or modify it under the terms
  6. of the GNU General Public License as published by the Free Software Foundation; either
  7. version 2 of the License, or (at your option) any later version.
  8. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
  9. without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. See the GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License along with this program;
  12. if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  13. */
  14. //////////////////////////////////////////////////////////////////////
  15. #include "stdafx.h"
  16. #include "NGenericDockBar.h"
  17. #include "NGenericToolBar.h"
  18. #include "NGenericMenu.h"
  19. #include "afxpriv.h"
  20. #ifdef _DEBUG
  21. #undef THIS_FILE
  22. static char THIS_FILE[]=__FILE__;
  23. #define new DEBUG_NEW
  24. #endif
  25. IMPLEMENT_DYNCREATE(CNGenericDockBar,CDockBar)
  26. BEGIN_MESSAGE_MAP(CNGenericDockBar,CDockBar)
  27. //{{AFX_MSG_MAP(CNGenericDockBar)
  28. //}}AFX_MSG_MAP
  29. END_MESSAGE_MAP()
  30. //////////////////////////////////////////////////////////////////////
  31. // Construction/Destruction
  32. //////////////////////////////////////////////////////////////////////
  33. CNGenericDockBar::CNGenericDockBar()
  34. {
  35. }
  36. CNGenericDockBar::~CNGenericDockBar()
  37. {
  38. }
  39. CSize CNGenericDockBar::CalcFixedLayout( BOOL bStretch, BOOL bHorz )
  40. {
  41. ASSERT_VALID(this);
  42. CSize sizeFixed = CControlBar::CalcFixedLayout(bStretch, bHorz);
  43. // get max size
  44. CSize sizeMax;
  45. if (!m_rectLayout.IsRectEmpty())
  46. sizeMax = m_rectLayout.Size();
  47. else
  48. {
  49. CRect rectFrame;
  50. CFrameWnd* pFrame = GetParentFrame();
  51. pFrame->GetClientRect(&rectFrame);
  52. sizeMax = rectFrame.Size();
  53. }
  54. const int NormalcxBorder2=GetSystemMetrics(SM_CYBORDER)*2;
  55. const int NormalcyBorder2=2;
  56. const int AltcxBorder2=0;
  57. const int AltcyBorder2=0;
  58. int cxBorder2=0;
  59. int cyBorder2=0;
  60. // prepare for layout
  61. AFX_SIZEPARENTPARAMS layout;
  62. layout.hDWP = m_bLayoutQuery ?
  63. NULL : ::BeginDeferWindowPos(m_arrBars.GetSize());
  64. CPoint pt(-cxBorder2, -NormalcyBorder2);
  65. int nWidth = 0;
  66. BOOL bWrapped = FALSE;
  67. // layout all the control bars
  68. for (int nPos = 0; nPos < m_arrBars.GetSize(); nPos++)
  69. {
  70. CControlBar* pBar = GetDockedControlBar(nPos);
  71. void* pVoid = m_arrBars[nPos];
  72. if (pBar != NULL)
  73. {
  74. if (pBar->IsVisible())
  75. {
  76. if(pBar->IsKindOf(RUNTIME_CLASS(CNGenericToolBar)))
  77. {
  78. cxBorder2=AltcxBorder2;
  79. cyBorder2=AltcyBorder2;
  80. }
  81. else
  82. {
  83. cxBorder2=NormalcxBorder2;
  84. cyBorder2=NormalcyBorder2;
  85. }
  86. // get ideal rect for bar
  87. DWORD dwMode = 0;
  88. if ((pBar->m_dwStyle & CBRS_SIZE_DYNAMIC) &&
  89. (pBar->m_dwStyle & CBRS_FLOATING))
  90. dwMode |= LM_HORZ | LM_MRUWIDTH;
  91. else if (pBar->m_dwStyle & CBRS_ORIENT_HORZ)
  92. dwMode |= LM_HORZ | LM_HORZDOCK;
  93. else
  94. dwMode |=  LM_VERTDOCK;
  95. CSize sizeBar = pBar->CalcDynamicLayout(-1, dwMode);
  96. CRect rect(pt, sizeBar);
  97. // get current rect for bar
  98. CRect rectBar;
  99. pBar->GetWindowRect(&rectBar);
  100. ScreenToClient(&rectBar);
  101. if (bHorz)
  102. {
  103. // Offset Calculated Rect out to Actual
  104. if (rectBar.left > rect.left && !m_bFloating)
  105. rect.OffsetRect(rectBar.left - rect.left, 0);
  106. // If ControlBar goes off the right, then right justify
  107. if (rect.right > sizeMax.cx && !m_bFloating)
  108. {
  109. int x = rect.Width() - cxBorder2;
  110. x = max(sizeMax.cx - x, pt.x);
  111. rect.OffsetRect(x - rect.left, 0);
  112. }
  113. // If ControlBar has been wrapped, then left justify
  114. if (bWrapped)
  115. {
  116. bWrapped = FALSE;
  117. rect.OffsetRect(-(rect.left + cxBorder2), 0);
  118. }
  119. // If ControlBar is completely invisible, then wrap it
  120. else if ((rect.left >= (sizeMax.cx - cxBorder2)) &&
  121. (nPos > 0) && (m_arrBars[nPos - 1] != NULL))
  122. {
  123. m_arrBars.InsertAt(nPos, (CObject*)NULL);
  124. pBar = NULL; pVoid = NULL;
  125. bWrapped = TRUE;
  126. }
  127. if (!bWrapped)
  128. {
  129. if (rect != rectBar)
  130. {
  131. if (!m_bLayoutQuery &&
  132. !(pBar->m_dwStyle & CBRS_FLOATING))
  133. {
  134. pBar->m_pDockContext->m_rectMRUDockPos = rect;
  135. }
  136. AfxRepositionWindow(&layout, pBar->m_hWnd, &rect);
  137. }
  138. pt.x = rect.left + sizeBar.cx - cxBorder2;
  139. nWidth = max(nWidth, sizeBar.cy);
  140. }
  141. }
  142. else
  143. {
  144. // Offset Calculated Rect out to Actual
  145. if (rectBar.top > rect.top && !m_bFloating)
  146. rect.OffsetRect(0, rectBar.top - rect.top);
  147. // If ControlBar goes off the bottom, then bottom justify
  148. if (rect.bottom > sizeMax.cy && !m_bFloating)
  149. {
  150. int y = rect.Height() - cyBorder2;
  151. y = max(sizeMax.cy - y, pt.y);
  152. rect.OffsetRect(0, y - rect.top);
  153. }
  154. // If ControlBar has been wrapped, then top justify
  155. if (bWrapped)
  156. {
  157. bWrapped = FALSE;
  158. rect.OffsetRect(0, -(rect.top + cyBorder2));
  159. }
  160. // If ControlBar is completely invisible, then wrap it
  161. else if ((rect.top >= (sizeMax.cy - cyBorder2)) &&
  162. (nPos > 0) && (m_arrBars[nPos - 1] != NULL))
  163. {
  164. m_arrBars.InsertAt(nPos, (CObject*)NULL);
  165. pBar = NULL; pVoid = NULL;
  166. bWrapped = TRUE;
  167. }
  168. if (!bWrapped)
  169. {
  170. if (rect != rectBar)
  171. {
  172. if (!m_bLayoutQuery &&
  173. !(pBar->m_dwStyle & CBRS_FLOATING))
  174. {
  175. pBar->m_pDockContext->m_rectMRUDockPos = rect;
  176. }
  177. AfxRepositionWindow(&layout, pBar->m_hWnd, &rect);
  178. }
  179. pt.y = rect.top + sizeBar.cy - cyBorder2;
  180. nWidth = max(nWidth, sizeBar.cx);
  181. }
  182. }
  183. }
  184. if (!bWrapped)
  185. {
  186. // handle any delay/show hide for the bar
  187. pBar->RecalcDelayShow(&layout);
  188. }
  189. }
  190. if (pBar == NULL && pVoid == NULL && nWidth != 0)
  191. {
  192. // end of row because pBar == NULL
  193. if (bHorz)
  194. {
  195. pt.y += nWidth - cyBorder2;
  196. sizeFixed.cx = max(sizeFixed.cx, pt.x);
  197. sizeFixed.cy = max(sizeFixed.cy, pt.y);
  198. pt.x = -cxBorder2;
  199. }
  200. else
  201. {
  202. pt.x += nWidth - cxBorder2;
  203. sizeFixed.cx = max(sizeFixed.cx, pt.x);
  204. sizeFixed.cy = max(sizeFixed.cy, pt.y);
  205. pt.y = -cyBorder2;
  206. }
  207. nWidth = 0;
  208. }
  209. }
  210. if (!m_bLayoutQuery)
  211. {
  212. // move and resize all the windows at once!
  213. if (layout.hDWP == NULL || !::EndDeferWindowPos(layout.hDWP))
  214. TRACE0("Warning: DeferWindowPos failed - low system resources.n");
  215. }
  216. // adjust size for borders on the dock bar itself
  217. CRect rect;
  218. rect.SetRectEmpty();
  219. CalcInsideRect(rect, bHorz);
  220. if ((!bStretch || !bHorz) && sizeFixed.cx != 0)
  221. sizeFixed.cx += -rect.right + rect.left;
  222. if ((!bStretch || bHorz) && sizeFixed.cy != 0)
  223. sizeFixed.cy += -rect.bottom + rect.top;
  224. return sizeFixed;
  225. }