GuiDocBarExten.cpp
上传用户:wlkj888
上传日期:2022-08-01
资源大小:806k
文件大小:9k
源码类别:

对话框与窗口

开发平台:

Visual C++

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