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

对话框与窗口

开发平台:

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 "GuiDocBarExtenEx.h"
  25. #include "GuiControlBar.h"
  26. #include "MenuBar.h"
  27. const int cxBorder2 = ::GetSystemMetrics(SM_CXBORDER)*2;
  28. const int cyBorder2 = ::GetSystemMetrics(SM_CYBORDER)*2;
  29. #ifdef _DEBUG
  30. #undef THIS_FILE
  31. static char THIS_FILE[]=__FILE__;
  32. #define new DEBUG_NEW
  33. #endif
  34. //////////////////////////////////////////////////////////////////////
  35. // Construction/Destruction
  36. //////////////////////////////////////////////////////////////////////
  37. IMPLEMENT_DYNCREATE(CGuiDocBarExtenEx,CDockBar)
  38. BEGIN_MESSAGE_MAP(CGuiDocBarExtenEx,CDockBar)
  39. //{{AFX_MSG_MAP(CGuiDocBarExtenEx)
  40. //}}AFX_MSG_MAP
  41. END_MESSAGE_MAP()
  42. CGuiDocBarExtenEx::CGuiDocBarExtenEx()
  43. {
  44. m_StyleDisplay=GUISTYLE_XP;
  45. }
  46. CGuiDocBarExtenEx::~CGuiDocBarExtenEx()
  47. {
  48. }
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CDockBarEx message handlers
  51. BOOL CGuiDocBarExtenEx::_IsMenuBar(int nPos, CPtrArray& arrBars)
  52. {
  53. if (nPos < arrBars.GetSize()) {
  54. CControlBar* pBar = (CControlBar*)arrBars[nPos];
  55. if (pBar && pBar->GetDlgCtrlID() == AFX_IDW_MENUBAR)
  56. return TRUE;
  57. else
  58. return FALSE;
  59. }
  60. else
  61. return FALSE;
  62. }
  63. void CGuiDocBarExtenEx::BarsDocking(CFrameWnd * pFrame, DWORD dwDockStyle) 
  64. {
  65. ASSERT_VALID(pFrame);
  66. // must be CBRS_ALIGN_XXX or CBRS_FLOAT_MULTI only
  67. ASSERT((dwDockStyle & ~(CBRS_ALIGN_ANY|CBRS_FLOAT_MULTI)) == 0);
  68. pFrame->EnableDocking(dwDockStyle);
  69. for (int i = 0; i < 4; i++) {
  70. if (dwDockBarMap[i][1] & dwDockStyle & CBRS_ALIGN_ANY) {
  71. CDockBar* pDock = (CDockBar*)pFrame->GetControlBar(dwDockBarMap[i][0]);
  72. if( pDock == 0 || ! pDock->IsKindOf(RUNTIME_CLASS(CGuiDocBarExtenEx)) ) {
  73. BOOL bNeedDelete = ! pDock->m_bAutoDelete;
  74. pDock->m_pDockSite->RemoveControlBar(pDock);
  75. pDock->m_pDockSite = 0;
  76. pDock->DestroyWindow();
  77. if( bNeedDelete )
  78. delete pDock;
  79. pDock = 0;
  80. }
  81. if( pDock == 0 ) {
  82. pDock = new CGuiDocBarExtenEx;
  83. ASSERT_VALID(pDock);
  84. if ((!pDock) || (!pDock->Create(pFrame,
  85. WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_CHILD|WS_VISIBLE |
  86. dwDockBarMap[i][1], dwDockBarMap[i][0]))) {
  87. AfxThrowResourceException();
  88. }
  89. }
  90. }
  91. }
  92. }
  93. CSize CGuiDocBarExtenEx::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
  94. {
  95. ASSERT_VALID(this);
  96. CSize sizeFixed = CControlBar::CalcFixedLayout(bStretch, bHorz);
  97. // get max size
  98. CSize sizeMax;
  99. if (!m_rectLayout.IsRectEmpty())
  100. {
  101. CRect rect = m_rectLayout;
  102. CalcInsideRect(rect, bHorz);
  103. sizeMax = rect.Size();
  104. }
  105. else
  106. {
  107. CRect rectFrame;
  108. CFrameWnd* pFrame = GetParentFrame();
  109. pFrame->GetClientRect(&rectFrame);
  110. sizeMax = rectFrame.Size();
  111. }
  112. // prepare for layout
  113. AFX_SIZEPARENTPARAMS layout;
  114. layout.hDWP = m_bLayoutQuery ?
  115. NULL : ::BeginDeferWindowPos(m_arrBars.GetSize());
  116. int cxBorder = 2, cyBorder = 2;
  117. CPoint pt(-cxBorder, -cyBorder);
  118. int nWidth = 0;
  119. BOOL bWrapped = FALSE;
  120. // layout all the control bars
  121. for (int nPos = 0; nPos < m_arrBars.GetSize(); nPos++)
  122. {
  123. CControlBar* pBar = GetDockedControlBar(nPos);
  124. if (HIWORD(pBar) != 0)
  125. if (pBar->IsKindOf(RUNTIME_CLASS(CGuiControlBar)))
  126. {
  127.      CGuiControlBar* pbar=(CGuiControlBar*)pBar;
  128. CPoint pt(GetMessagePos());
  129. //m_pDockSite->FloatControlBar(pBar,pt);
  130. // pbar->ReleaseCapture();
  131. //m_pDockContext->ToggleDocking();
  132. m_pDockSite->DockControlBar(pBar);
  133. continue;
  134. }
  135. void* pVoid = m_arrBars[nPos];
  136. if (pBar != NULL)
  137. {
  138. if(pBar->IsKindOf(RUNTIME_CLASS(CGuiToolBarWnd)) ||
  139. pBar->IsKindOf(RUNTIME_CLASS(CMenuBar)) )
  140. cxBorder = cyBorder = 0;
  141. else
  142. cxBorder = cyBorder = 2;
  143. if (pBar->IsVisible())
  144. {
  145. // get ideal rect for bar
  146. DWORD dwMode = 0;
  147. if ((pBar->m_dwStyle & CBRS_SIZE_DYNAMIC) &&
  148. (pBar->m_dwStyle & CBRS_FLOATING))
  149. dwMode |= LM_HORZ | LM_MRUWIDTH;
  150. else if (pBar->m_dwStyle & CBRS_ORIENT_HORZ)
  151. dwMode |= LM_HORZ | LM_HORZDOCK;
  152. else
  153. dwMode |=  LM_VERTDOCK;
  154. CSize sizeBar = pBar->CalcDynamicLayout(-1, dwMode);
  155. CRect rect(pt, sizeBar);
  156. // get current rect for bar
  157. CRect rectBar;
  158. pBar->GetWindowRect(&rectBar);
  159. ScreenToClient(&rectBar);
  160. if (bHorz)
  161. {
  162. // Offset Calculated Rect out to Actual
  163. if (rectBar.left > rect.left && !m_bFloating)
  164. rect.OffsetRect(rectBar.left - rect.left, 0);
  165. // If ControlBar goes off the right, then right justify
  166. if (rect.right > sizeMax.cx && !m_bFloating)
  167. {
  168. int x = rect.Width() - cxBorder;
  169. x = max(sizeMax.cx - x, pt.x);
  170. rect.OffsetRect(x - rect.left, 0);
  171. }
  172. // If ControlBar has been wrapped, then left justify
  173. if (bWrapped)
  174. {
  175. bWrapped = FALSE;
  176. rect.OffsetRect(-(rect.left + cxBorder), 0);
  177. }
  178. // If ControlBar is completely invisible, then wrap it
  179. else if ((rect.left >= (sizeMax.cx - cxBorder2) || _IsMenuBar(nPos, m_arrBars))
  180. && (nPos > 0) && (m_arrBars[nPos - 1] != NULL))
  181. {
  182. m_arrBars.InsertAt(nPos, (CObject*)NULL);
  183. pBar = NULL; pVoid = NULL;
  184. bWrapped = TRUE;
  185. }
  186. if (!bWrapped)
  187. {
  188. if (rect != rectBar)
  189. {
  190. if (!m_bLayoutQuery &&
  191. !(pBar->m_dwStyle & CBRS_FLOATING))
  192. {
  193. pBar->m_pDockContext->m_rectMRUDockPos = rect;
  194. }
  195. AfxRepositionWindow(&layout, pBar->m_hWnd, &rect);
  196. }
  197. pt.x = rect.left + sizeBar.cx - cxBorder;
  198. nWidth = max(nWidth, sizeBar.cy);
  199. }
  200. }
  201. else
  202. {
  203. // Offset Calculated Rect out to Actual
  204. if (rectBar.top > rect.top && !m_bFloating)
  205. rect.OffsetRect(0, rectBar.top - rect.top);
  206. // If ControlBar goes off the bottom, then bottom justify
  207. if (rect.bottom > sizeMax.cy && !m_bFloating)
  208. {
  209. int y = rect.Height() - cyBorder;
  210. y = max(sizeMax.cy - y, pt.y);
  211. rect.OffsetRect(0, y - rect.top);
  212. }
  213. // If ControlBar has been wrapped, then top justify
  214. if (bWrapped)
  215. {
  216. bWrapped = FALSE;
  217. rect.OffsetRect(0, -(rect.top + cyBorder));
  218. }
  219. // If ControlBar is completely invisible, then wrap it
  220. else if ((rect.left >= (sizeMax.cx - cxBorder2) || _IsMenuBar(nPos, m_arrBars))
  221. && (nPos > 0) && (m_arrBars[nPos - 1] != NULL))
  222. {
  223. m_arrBars.InsertAt(nPos, (CObject*)NULL);
  224. pBar = NULL; pVoid = NULL;
  225. bWrapped = TRUE;
  226. }
  227. if (!bWrapped)
  228. {
  229. if (rect != rectBar)
  230. {
  231. if (!m_bLayoutQuery &&
  232. !(pBar->m_dwStyle & CBRS_FLOATING))
  233. {
  234. pBar->m_pDockContext->m_rectMRUDockPos = rect;
  235. }
  236. AfxRepositionWindow(&layout, pBar->m_hWnd, &rect);
  237. }
  238. pt.y = rect.top + sizeBar.cy - cyBorder;
  239. nWidth = max(nWidth, sizeBar.cx);
  240. }
  241. }
  242. }
  243. if (!bWrapped)
  244. {
  245. // handle any delay/show hide for the bar
  246. pBar->RecalcDelayShow(&layout);
  247. }
  248. }
  249. if (pBar == NULL && pVoid == NULL && nWidth != 0)
  250. {
  251. // end of row because pBar == NULL
  252. if (bHorz)
  253. {
  254. pt.y += nWidth - cyBorder;
  255. sizeFixed.cx = max(sizeFixed.cx, pt.x);
  256. sizeFixed.cy = max(sizeFixed.cy, pt.y);
  257. pt.x = -cxBorder;
  258. }
  259. else
  260. {
  261. pt.x += nWidth - cxBorder;
  262. sizeFixed.cx = max(sizeFixed.cx, pt.x);
  263. sizeFixed.cy = max(sizeFixed.cy, pt.y);
  264. pt.y = -cyBorder;
  265. }
  266. nWidth = 0;
  267. }
  268. }
  269. if (!m_bLayoutQuery)
  270. {
  271. // move and resize all the windows at once!
  272. if (layout.hDWP == NULL || !::EndDeferWindowPos(layout.hDWP))
  273. TRACE0("Warning: DeferWindowPos failed - low system resources.n");
  274. }
  275. // adjust size for borders on the dock bar itself
  276. CRect rect;
  277. rect.SetRectEmpty();
  278. CalcInsideRect(rect, bHorz);
  279. if ((!bStretch || !bHorz) && sizeFixed.cx != 0)
  280. sizeFixed.cx += -rect.right + rect.left;
  281. if ((!bStretch || bHorz) && sizeFixed.cy != 0)
  282. sizeFixed.cy += -rect.bottom + rect.top;
  283. return sizeFixed;
  284. }
  285. /*CSize CGuiDocBarExtenEx::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
  286. {
  287. // LTRACE(_T("CMenuDockBar::CalcFixedLayoutn"));
  288. ASSERT_VALID(this);
  289. CSize sizeFixed = CControlBar::CalcFixedLayout(bStretch, bHorz);
  290. // get max size
  291. CSize sizeMax;
  292. if (!m_rectLayout.IsRectEmpty())
  293. sizeMax = m_rectLayout.Size();
  294. else
  295. {
  296. CRect rectFrame;
  297. CFrameWnd* pFrame = GetParentFrame();
  298. pFrame->GetClientRect(&rectFrame);
  299. sizeMax = rectFrame.Size();
  300. }
  301. // prepare for layout
  302. AFX_SIZEPARENTPARAMS layout;
  303. layout.hDWP = m_bLayoutQuery ?
  304. NULL : ::BeginDeferWindowPos(m_arrBars.GetSize());
  305. CPoint pt(-cxBorder2, -cyBorder2);
  306. int nWidth = 0;
  307. BOOL bWrapped = FALSE;
  308. // layout all the control bars
  309. for (int nPos = 0; nPos < m_arrBars.GetSize(); nPos++)
  310. {
  311. CControlBar* pBar = GetDockedControlBar(nPos);
  312. void* pVoid = m_arrBars[nPos];
  313. if (pBar != NULL)// pBar is valid
  314. {
  315. if (pBar->IsVisible())// visible
  316. {
  317. // get ideal rect for bar
  318. DWORD dwMode = 0;
  319. if ((pBar->m_dwStyle & CBRS_SIZE_DYNAMIC) &&
  320. (pBar->m_dwStyle & CBRS_FLOATING))
  321. dwMode |= LM_HORZ | LM_MRUWIDTH;
  322. else if (pBar->m_dwStyle & CBRS_ORIENT_HORZ)
  323. dwMode |= LM_HORZ | LM_HORZDOCK;
  324. else
  325. dwMode |=  LM_VERTDOCK;
  326. CSize sizeBar = pBar->CalcDynamicLayout(-1, dwMode);
  327. CRect rect(pt, sizeBar);
  328. // get current rect for bar
  329. CRect rectBar;
  330. pBar->GetWindowRect(&rectBar);
  331. ScreenToClient(&rectBar);
  332. if (bHorz)// horizontal
  333. {
  334. // Offset Calculated Rect out to Actual
  335. if (rectBar.left > rect.left && !m_bFloating)
  336. rect.OffsetRect(rectBar.left - rect.left, 0);
  337. // If ControlBar goes off the right, then right justify
  338. if (rect.right > sizeMax.cx && !m_bFloating)
  339. {
  340. int x = rect.Width() - cxBorder2;
  341. x = max(sizeMax.cx - x, pt.x);
  342. rect.OffsetRect(x - rect.left, 0);
  343. }
  344. // If ControlBar has been wrapped, then left justify
  345. if (bWrapped)
  346. {
  347. bWrapped = FALSE;
  348. rect.OffsetRect(-(rect.left + cxBorder2), 0);
  349. }
  350. // If ControlBar is completely invisible, then wrap it
  351. else if ((rect.left >= (sizeMax.cx - cxBorder2) || _IsMenuBar(nPos, m_arrBars))
  352. && (nPos > 0) && (m_arrBars[nPos - 1] != NULL))
  353. {
  354. m_arrBars.InsertAt(nPos, (CObject*)NULL);
  355. pBar = NULL; pVoid = NULL;
  356. bWrapped = TRUE;
  357. }
  358. if (!bWrapped)
  359. {
  360. if (rect != rectBar)
  361. {
  362. if (!m_bLayoutQuery &&
  363. !(pBar->m_dwStyle & CBRS_FLOATING))
  364. {
  365. pBar->m_pDockContext->m_rectMRUDockPos = rect;
  366. }
  367. AfxRepositionWindow(&layout, pBar->m_hWnd, &rect);
  368. }
  369. pt.x = rect.left + sizeBar.cx - cxBorder2;
  370. nWidth = max(nWidth, sizeBar.cy);
  371. }
  372. }
  373. else // vertical
  374. {
  375. // Offset Calculated Rect out to Actual
  376. if (rectBar.top > rect.top && !m_bFloating)
  377. rect.OffsetRect(0, rectBar.top - rect.top);
  378. // If ControlBar goes off the bottom, then bottom justify
  379. if (rect.bottom > sizeMax.cy && !m_bFloating)
  380. {
  381. int y = rect.Height() - cyBorder2;
  382. y = max(sizeMax.cy - y, pt.y);
  383. rect.OffsetRect(0, y - rect.top);
  384. }
  385. // If ControlBar has been wrapped, then top justify
  386. if (bWrapped)
  387. {
  388. bWrapped = FALSE;
  389. rect.OffsetRect(0, -(rect.top + cyBorder2));
  390. }
  391. // If ControlBar is completely invisible, then wrap it
  392. else if ((rect.top >= (sizeMax.cy - cyBorder2) || _IsMenuBar(nPos, m_arrBars))
  393. && (nPos > 0) && (m_arrBars[nPos - 1] != NULL))
  394. {
  395. m_arrBars.InsertAt(nPos, (CObject*)NULL);
  396. pBar = NULL; pVoid = NULL;
  397. bWrapped = TRUE;
  398. }
  399. if (!bWrapped)
  400. {
  401. if (rect != rectBar)
  402. {
  403. if (!m_bLayoutQuery &&
  404. !(pBar->m_dwStyle & CBRS_FLOATING))
  405. {
  406. pBar->m_pDockContext->m_rectMRUDockPos = rect;
  407. }
  408. AfxRepositionWindow(&layout, pBar->m_hWnd, &rect);
  409. }
  410. pt.y = rect.top + sizeBar.cy - cyBorder2;
  411. nWidth = max(nWidth, sizeBar.cx);
  412. }
  413. }// if vertical
  414. }// if visible
  415. if (!bWrapped)
  416. {
  417. // handle any delay/show hide for the bar
  418. pBar->RecalcDelayShow(&layout);
  419. }
  420. }// if pBar is valid
  421. if (pBar == NULL && pVoid == NULL && nWidth != 0)
  422. {
  423. // end of row because pBar == NULL
  424. if (bHorz)
  425. {
  426. pt.y += nWidth - cyBorder2;
  427. sizeFixed.cx = max(sizeFixed.cx, pt.x);
  428. sizeFixed.cy = max(sizeFixed.cy, pt.y);
  429. pt.x = -cxBorder2;
  430. }
  431. else
  432. {
  433. pt.x += nWidth - cxBorder2;
  434. sizeFixed.cx = max(sizeFixed.cx, pt.x);
  435. sizeFixed.cy = max(sizeFixed.cy, pt.y);
  436. pt.y = -cyBorder2;
  437. }
  438. nWidth = 0;
  439. }
  440. }// for
  441. if (!m_bLayoutQuery)
  442. {
  443. // move and resize all the windows at once!
  444. if (layout.hDWP == NULL || !::EndDeferWindowPos(layout.hDWP))
  445. TRACE0("Warning: DeferWindowPos failed - low system resources.n");
  446. }
  447. // adjust size for borders on the dock bar itself
  448. CRect rect;
  449. rect.SetRectEmpty();
  450. CalcInsideRect(rect, bHorz);
  451. if ((!bStretch || !bHorz) && sizeFixed.cx != 0)
  452. sizeFixed.cx += -rect.right + rect.left;
  453. if ((!bStretch || bHorz) && sizeFixed.cy != 0)
  454. sizeFixed.cy += -rect.bottom + rect.top;
  455. return sizeFixed;
  456. }*/
  457. void CGuiDocBarExtenEx::DoPaint(CDC* pDC)
  458. {
  459. CRect rect;
  460. GetClientRect(rect);
  461. CBrush cbr;
  462. cbr.CreateSolidBrush(GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style));
  463. pDC->FillRect(rect,&cbr);
  464. }