OAMSIZEDOCKBAR.CPP
上传用户:lvjun8202
上传日期:2013-04-30
资源大小:797k
文件大小:17k
源码类别:

SNMP编程

开发平台:

C/C++

  1. // OAMSizeDockBar.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "OAMSizeDockBar.h"
  5. #include "OAMControlBar.h"
  6. #include "resource.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. extern DWORD dwSizeBarMap[4][2];
  13. /////////////////////////////////////////////////////////////////////////////
  14. // COAMSizeDockBar
  15. COAMSizeDockBar::COAMSizeDockBar()
  16. {
  17. m_iTrackBorderSize = 4;
  18. m_cxLeftBorder = 0;
  19. m_cyTopBorder = 0;
  20. m_cxRightBorder = 0;
  21. m_cyBottomBorder = 0;
  22. m_iActualSize = 100;
  23. m_iSafeSpace = 25;
  24. m_bOkToDrag = FALSE;
  25. m_bDragging = FALSE;
  26. m_bAutoDelete = TRUE;
  27. m_clrBtnHilite = ::GetSysColor(COLOR_BTNHILIGHT);
  28. m_clrBtnShadow = ::GetSysColor(COLOR_BTNSHADOW);
  29. m_clrBtnFace = ::GetSysColor(COLOR_BTNFACE);
  30. }
  31. COAMSizeDockBar::~COAMSizeDockBar()
  32. {
  33. // TODO: add destruction code here.
  34. }
  35. IMPLEMENT_DYNAMIC(COAMSizeDockBar, CDockBar)
  36. BEGIN_MESSAGE_MAP(COAMSizeDockBar, CDockBar)
  37. //{{AFX_MSG_MAP(COAMSizeDockBar)
  38. ON_WM_NCPAINT()
  39. ON_WM_NCCALCSIZE()
  40. ON_WM_SETCURSOR()
  41. ON_WM_NCHITTEST()
  42. ON_WM_NCLBUTTONDOWN()
  43. ON_WM_LBUTTONUP()
  44. ON_WM_MOUSEMOVE()
  45. ON_WM_SYSCOLORCHANGE()
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. /////////////////////////////////////////////////////////////////////////////
  49. // COAMSizeDockBar overrides
  50. CSize COAMSizeDockBar::CalcDynamicLayout(int nLength, DWORD nMode)
  51. {
  52. int ActualSize = 0;
  53. for(int i=0;i<= m_arrBars.GetUpperBound();++i)
  54. {
  55. COAMControlBar *pBar = (COAMControlBar *)GetDockedControlBar(i);
  56. if (pBar != NULL && pBar->IsVisible())
  57. {
  58. ActualSize = m_iActualSize;
  59. break;
  60. }
  61. }
  62. int cx,cy;
  63. if (nMode & LM_VERTDOCK) {
  64. cx = ActualSize ;
  65. cy = 32767;
  66. }
  67. if (nMode & LM_HORZDOCK) {
  68. cx= 32767;
  69. cy = ActualSize;
  70. }
  71. CalcSizeBarLayout();
  72. return CSize(cx,cy);
  73. }
  74. void COAMSizeDockBar::DoPaint(CDC *pDC)
  75. {
  76. CDockBar::DoPaint(pDC);
  77. }
  78. BOOL COAMSizeDockBar::IsDockBar() const
  79. {
  80. return FALSE;
  81. }
  82. BOOL COAMSizeDockBar::IsDockSizeBar() const
  83. {
  84. return TRUE;
  85. }
  86. void COAMSizeDockBar::OnInvertTracker(const CRect& rect)
  87. {
  88. // ASSERT_VALID(this);
  89. // ASSERT(!rect.IsRectEmpty());
  90. CDC* pDC = GetDockingFrame()->GetDC();
  91. CBrush* pBrush = CDC::GetHalftoneBrush();
  92. HBRUSH hOldBrush = NULL;
  93. if (pBrush != NULL)
  94. hOldBrush = (HBRUSH)SelectObject(pDC->m_hDC, pBrush->m_hObject);
  95. pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATINVERT);
  96. if (hOldBrush != NULL)
  97. SelectObject(pDC->m_hDC, hOldBrush);
  98. GetDockingFrame()->ReleaseDC(pDC);
  99. }
  100. void COAMSizeDockBar::HitTest(const CPoint & point)
  101. {
  102. UINT nID = ((UINT)(WORD)::GetDlgCtrlID(m_hWnd));
  103. CRect rcWin;
  104. GetWindowRect(&rcWin);
  105. HCURSOR hCur;
  106. static BOOL bHitting,bUnItting;
  107. bHitting = FALSE;
  108. bUnItting = TRUE;
  109. BOOL bHit = FALSE;
  110. if (nID == AFX_IDW_SIZEBAR_LEFT) {
  111. rcWin.left = rcWin.right-m_iTrackBorderSize;
  112. hCur = AfxGetApp()->LoadCursor(IDC_HSPLITBAR);
  113. bHit = rcWin.PtInRect(point);
  114. }
  115. else if (nID == AFX_IDW_SIZEBAR_TOP) {
  116. rcWin.top = rcWin.bottom-m_iTrackBorderSize;
  117. hCur = AfxGetApp()->LoadCursor(IDC_VSPLITBAR);
  118. bHit = rcWin.PtInRect(point);
  119. }
  120. else if (nID == AFX_IDW_SIZEBAR_RIGHT) {
  121. rcWin.right = rcWin.left+m_iTrackBorderSize;
  122. hCur = AfxGetApp()->LoadCursor(IDC_HSPLITBAR);
  123. bHit = rcWin.PtInRect(point);
  124. }
  125. else if (nID == AFX_IDW_SIZEBAR_BOTTOM) {
  126. rcWin.bottom = rcWin.top+m_iTrackBorderSize;
  127. hCur = AfxGetApp()->LoadCursor(IDC_VSPLITBAR);
  128. bHit = rcWin.PtInRect(point);
  129. }
  130. if (bHit) {
  131. SetCursor(hCur);
  132. }
  133. else  {
  134. hCur = ::LoadCursor(NULL,IDC_ARROW);
  135. SetCursor(hCur);
  136. }
  137. m_bOkToDrag = bHit;
  138. }
  139. /////////////////////////////////////////////////////////////////////////////
  140. // COAMSizeDockBar message handlers
  141. void COAMSizeDockBar::OnNcPaint() 
  142. {
  143. EraseNonClient();
  144. }
  145. void COAMSizeDockBar::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp) 
  146. {
  147. UINT nID = ((UINT)(WORD)::GetDlgCtrlID(m_hWnd));
  148. if (nID == AFX_IDW_SIZEBAR_LEFT) {
  149. m_cyBottomBorder += m_iTrackBorderSize;
  150. CDockBar::OnNcCalcSize(bCalcValidRects, lpncsp);
  151. m_cyBottomBorder -= m_iTrackBorderSize;
  152. }
  153. else if (nID == AFX_IDW_SIZEBAR_TOP) {
  154. m_cyBottomBorder += m_iTrackBorderSize;
  155. CDockBar::OnNcCalcSize(bCalcValidRects, lpncsp);
  156. m_cyBottomBorder -= m_iTrackBorderSize;
  157. }
  158. else if (nID == AFX_IDW_SIZEBAR_RIGHT) {
  159. m_cyTopBorder += m_iTrackBorderSize;
  160. CDockBar::OnNcCalcSize(bCalcValidRects, lpncsp);
  161. m_cyTopBorder -= m_iTrackBorderSize;
  162. }
  163. else if (nID == AFX_IDW_SIZEBAR_BOTTOM) {
  164. m_cyTopBorder += m_iTrackBorderSize;
  165. CDockBar::OnNcCalcSize(bCalcValidRects, lpncsp);
  166. m_cyTopBorder -= m_iTrackBorderSize;
  167. }
  168. }
  169. BOOL COAMSizeDockBar::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  170. {
  171. return (nHitTest == HTCLIENT)?
  172. CDockBar::OnSetCursor(pWnd, nHitTest, message):FALSE;
  173. }
  174. UINT COAMSizeDockBar::OnNcHitTest(CPoint point) 
  175. {
  176. HitTest(point);
  177. return (m_bOkToDrag)?HTBORDER:CDockBar::OnNcHitTest(point);
  178. }
  179. void COAMSizeDockBar::OnNcLButtonDown(UINT nHitTest, CPoint point) 
  180. {
  181. if( m_bOkToDrag )
  182. {
  183. UINT nID = ((UINT)(WORD)::GetDlgCtrlID(m_hWnd));
  184. CFrameWnd *pFrame=GetDockingFrame();
  185. GetWindowRect(m_rcTrack);
  186. if (nID == AFX_IDW_SIZEBAR_LEFT)
  187. m_rcTrack.left = m_rcTrack.right-m_iTrackBorderSize;
  188. else if (nID == AFX_IDW_SIZEBAR_TOP)
  189. m_rcTrack.top = m_rcTrack.bottom-m_iTrackBorderSize;
  190. else if (nID == AFX_IDW_SIZEBAR_RIGHT)
  191. m_rcTrack.right = m_rcTrack.left+m_iTrackBorderSize;
  192. else if (nID == AFX_IDW_SIZEBAR_BOTTOM)
  193. m_rcTrack.bottom = m_rcTrack.top+m_iTrackBorderSize;
  194. pFrame->ScreenToClient(&m_rcTrack);
  195. pFrame->ScreenToClient(&point);
  196. m_ptStartDrag = point;
  197. m_ptCurDrag = point;
  198. SetCapture();
  199. m_bDragging = TRUE;
  200. OnInvertTracker(m_rcTrack);
  201. }
  202. CDockBar::OnNcLButtonDown(nHitTest, point);
  203. }
  204. void COAMSizeDockBar::OnLButtonUp(UINT nFlags, CPoint point) 
  205. {
  206. if( m_bDragging )
  207. {
  208. CRect rectWin;
  209. CRect rectAvail;
  210. GetWindowRect(&rectWin);
  211. ReleaseCapture();
  212. m_bDragging = FALSE;
  213. OnInvertTracker(m_rcTrack);
  214. GetAvailableRect(rectAvail);
  215. UINT nID = ((UINT)(WORD)::GetDlgCtrlID(m_hWnd));
  216. if (nID == AFX_IDW_SIZEBAR_LEFT ) {
  217. int maxWidth = rectAvail.Width()-m_iSafeSpace;
  218. int newWidth = m_rcTrack.left-m_ptStartDrag.x;
  219. m_iActualSize = newWidth>maxWidth ? maxWidth: newWidth;
  220. m_iActualSize += rectWin.Width();
  221. }
  222. else if (nID == AFX_IDW_SIZEBAR_TOP) {
  223. int maxHeight = rectAvail.Height()-m_iSafeSpace;
  224. int newHeight = m_rcTrack.top-m_ptStartDrag.y;
  225. m_iActualSize = newHeight>maxHeight ? maxHeight : newHeight;
  226. m_iActualSize += rectWin.Height();
  227. }
  228. else if (nID == AFX_IDW_SIZEBAR_RIGHT) {
  229. int maxWidth = rectAvail.Width()-m_iSafeSpace;
  230. int newWidth = m_ptStartDrag.x-m_rcTrack.left;
  231. m_iActualSize = newWidth>maxWidth ? maxWidth: newWidth;
  232. m_iActualSize += rectWin.Width();
  233. }
  234. else if (nID == AFX_IDW_SIZEBAR_BOTTOM) {
  235. int maxHeight = rectAvail.Height()-m_iSafeSpace;
  236. int newHeight = m_ptStartDrag.y-m_rcTrack.top;
  237. m_iActualSize = newHeight>maxHeight ? maxHeight : newHeight;
  238. m_iActualSize += rectWin.Height();
  239. }
  240. if(m_iActualSize<m_iTrackBorderSize )
  241. m_iActualSize = m_iTrackBorderSize;
  242. GetDockingFrame()->RecalcLayout();
  243. RecalcAllExcept(NULL);
  244. }
  245. CDockBar::OnLButtonUp(nFlags, point);
  246. }
  247. void COAMSizeDockBar::OnMouseMove(UINT nFlags, CPoint point) 
  248. {
  249. if( m_bDragging )
  250. {
  251. CRect rectWin;
  252. GetWindowRect(&rectWin);
  253. CRect rectAvail;
  254. GetAvailableRect(rectAvail);
  255. CFrameWnd *pFrame=GetDockingFrame();
  256. ClientToScreen(&point);
  257. pFrame->ScreenToClient(&point);
  258. UINT nID = ((UINT)(WORD)::GetDlgCtrlID(m_hWnd));
  259. if (nID == AFX_IDW_SIZEBAR_LEFT) {
  260. point.x = point.x>rectAvail.right ? rectAvail.right:point.x;
  261. point.x = point.x<m_iTrackBorderSize ? m_iTrackBorderSize:point.x;
  262. }
  263. else if (nID == AFX_IDW_SIZEBAR_TOP) {
  264. point.y = point.y>rectAvail.bottom ? rectAvail.bottom:point.y;
  265. point.y = point.y<m_iTrackBorderSize ? m_iTrackBorderSize:point.y;
  266. }
  267. else if (nID == AFX_IDW_SIZEBAR_RIGHT) {
  268. point.x = point.x<rectAvail.left ? rectAvail.left:point.x;
  269. point.x = point.x>rectAvail.right+m_iActualSize-m_iTrackBorderSize ? rectAvail.right-m_iTrackBorderSize+m_iActualSize:point.x;
  270. }
  271. else if (nID == AFX_IDW_SIZEBAR_BOTTOM) {
  272. point.y = point.y<rectAvail.top ? rectAvail.top:point.y;
  273. point.y = point.y>rectAvail.bottom+m_iActualSize-m_iTrackBorderSize ? rectAvail.bottom-m_iTrackBorderSize+m_iActualSize:point.y;
  274. }
  275. int deltaX = point.x-m_ptCurDrag.x;
  276. int deltaY = point.y-m_ptCurDrag.y;
  277. m_ptCurDrag = point;
  278. if (nID == AFX_IDW_SIZEBAR_LEFT || nID == AFX_IDW_SIZEBAR_RIGHT && deltaX)
  279. {
  280. OnInvertTracker(m_rcTrack);
  281. m_rcTrack.left+=deltaX;
  282. m_rcTrack.right+=deltaX;
  283. OnInvertTracker(m_rcTrack);
  284. }
  285. else if( nID == AFX_IDW_SIZEBAR_TOP || nID == AFX_IDW_SIZEBAR_BOTTOM && deltaY)
  286. {
  287. OnInvertTracker(m_rcTrack);
  288. m_rcTrack.top+=deltaY;
  289. m_rcTrack.bottom+=deltaY;
  290. OnInvertTracker(m_rcTrack);
  291. }
  292. }
  293. CDockBar::OnMouseMove(nFlags, point);
  294. }
  295. void COAMSizeDockBar::OnSysColorChange() 
  296. {
  297. CDockBar::OnSysColorChange();
  298. m_clrBtnHilite = ::GetSysColor(COLOR_BTNHILIGHT);
  299. m_clrBtnShadow = ::GetSysColor(COLOR_BTNSHADOW);
  300. m_clrBtnFace = ::GetSysColor(COLOR_BTNFACE);
  301. }
  302. /////////////////////////////////////////////////////////////////////////////
  303. // COAMControlBar operations
  304. void COAMSizeDockBar::GetAvailableRect(CRect &rect)
  305. {
  306. GetDockingFrame()->GetClientRect(&rect);
  307. GetDockingFrame()->RepositionBars(0xffff, 0xffff, AFX_IDW_PANE_FIRST,reposQuery,
  308. &rect, &rect, TRUE);
  309. }
  310. BOOL COAMSizeDockBar::IsLastControlBar(int index)
  311. {
  312. for( int i=index; i<m_arrBars.GetSize(); ++i)
  313. {
  314. COAMControlBar *pOther = (COAMControlBar *)GetDockedControlBar(i);
  315. if (pOther != NULL && pOther->IsVisible())
  316. {
  317. return FALSE;
  318. }
  319. }
  320. return TRUE;
  321. }
  322. COAMControlBar* COAMSizeDockBar::GetDockedSizeBar(int nPos)
  323. {
  324. return (COAMControlBar*)GetDockedControlBar(nPos);
  325. }
  326. void COAMSizeDockBar::RecalcAllExcept(COAMSizeDockBar *pBar)
  327. {
  328. CFrameWnd *pFrame = (CFrameWnd*)AfxGetApp()->m_pMainWnd;
  329. ASSERT_VALID(pFrame);
  330. for (int i = 0; i < 4; i++)
  331. {
  332. COAMSizeDockBar* pDock = (COAMSizeDockBar*)pFrame->GetControlBar(dwSizeBarMap[i][0]);
  333. if (pDock != NULL && pDock != pBar) {
  334. pDock->CalcSizeBarLayout();
  335. }
  336. }
  337. }
  338. void COAMSizeDockBar::DrawBorders(CDC *pDC, CRect &rect)
  339. {
  340. int cxBorderLeft = 0;
  341. int cxBorderRight = 0;
  342. int cyBorderTop = 0;
  343. int cyBorderBottom = 0;
  344. CRect rc;
  345. rc.CopyRect(&rect);
  346. if (m_dwStyle & CBRS_BORDER_TOP) {
  347. pDC->FillSolidRect(rc.left,rc.top,rc.Width(),1,m_clrBtnShadow);
  348. pDC->FillSolidRect(rc.left,rc.top+1,rc.Width(),1,m_clrBtnHilite);
  349. cyBorderTop+=2;
  350. }
  351. if (m_dwStyle & CBRS_BORDER_BOTTOM) {
  352. pDC->FillSolidRect(rc.left,rc.bottom-1,rc.Width(),1,m_clrBtnHilite);
  353. pDC->FillSolidRect(rc.left,rc.bottom-2,rc.Width(),1,m_clrBtnShadow);
  354. cyBorderBottom+=2;
  355. }
  356. if (m_dwStyle & CBRS_BORDER_LEFT) {
  357. pDC->FillSolidRect(rc.left,rc.top,1,rc.Height(),m_clrBtnShadow);
  358. pDC->FillSolidRect(rc.left+1,rc.top,1,rc.Height(),m_clrBtnHilite);
  359. cxBorderLeft+=2;
  360. }
  361. if (m_dwStyle & CBRS_BORDER_RIGHT) {
  362. pDC->FillSolidRect(rc.right-2,rc.top,1,rc.Height(),m_clrBtnShadow);
  363. pDC->FillSolidRect(rc.right-1,rc.top,1,rc.Height(),m_clrBtnHilite);
  364. cxBorderRight+=2;
  365. }
  366. UINT nID = ((UINT)(WORD)::GetDlgCtrlID(m_hWnd));
  367. CRect rcTrack;
  368. rcTrack.CopyRect(&rc);
  369. if (nID == AFX_IDW_SIZEBAR_LEFT) {
  370. rcTrack.left    = rc.right-m_iTrackBorderSize;
  371. rcTrack.right  += 1;
  372. rcTrack.top    += 1;
  373. rcTrack.bottom -= 1;
  374. pDC->FillSolidRect(rcTrack,m_clrBtnFace);
  375. pDC->Draw3dRect(rcTrack,m_clrBtnHilite,m_clrBtnShadow);
  376. cxBorderRight = m_iTrackBorderSize;
  377. }
  378. else if (nID == AFX_IDW_SIZEBAR_TOP) {
  379. rcTrack.top = rc.bottom-m_iTrackBorderSize;
  380. rcTrack.bottom+=1;
  381. pDC->FillSolidRect(rcTrack,m_clrBtnFace);
  382. pDC->Draw3dRect(rcTrack,m_clrBtnHilite,m_clrBtnShadow);
  383. cyBorderBottom = m_iTrackBorderSize;
  384. }
  385. else if (nID == AFX_IDW_SIZEBAR_RIGHT) {
  386. rcTrack.right   = rc.left+m_iTrackBorderSize;
  387. rcTrack.left   -= 1;
  388. rcTrack.top    += 1;
  389. rcTrack.bottom -= 1;
  390. pDC->FillSolidRect(rcTrack,m_clrBtnFace);
  391. pDC->Draw3dRect(rcTrack,m_clrBtnHilite,m_clrBtnShadow);
  392. cxBorderLeft = m_iTrackBorderSize;
  393. }
  394. else if (nID == AFX_IDW_SIZEBAR_BOTTOM) {
  395. rcTrack.bottom = rc.top+m_iTrackBorderSize;
  396. rcTrack.top-=1;
  397. pDC->FillSolidRect(rcTrack,m_clrBtnFace);
  398. pDC->Draw3dRect(rcTrack,m_clrBtnHilite,m_clrBtnShadow);
  399. cyBorderTop = m_iTrackBorderSize;
  400. }
  401. rect.left += cxBorderLeft;
  402. rect.right -= cxBorderRight;
  403. rect.top += cyBorderTop;
  404. rect.bottom -= cyBorderBottom;
  405. }
  406. void COAMSizeDockBar::EraseNonClient()
  407. {
  408. CWindowDC dc(this);
  409. CRect rectClient;
  410. GetClientRect(rectClient);
  411. CRect rectWindow;
  412. GetWindowRect(rectWindow);
  413. ScreenToClient(rectWindow);
  414. rectClient.OffsetRect(-rectWindow.left, -rectWindow.top);
  415. dc.ExcludeClipRect(rectClient);
  416. rectWindow.OffsetRect(-rectWindow.left, -rectWindow.top);
  417. DrawBorders(&dc, rectWindow);
  418. dc.IntersectClipRect(rectWindow);
  419. SendMessage(WM_ERASEBKGND, (WPARAM)dc.m_hDC);
  420. }
  421. void COAMSizeDockBar::SetActualSize(int iSize)
  422. {
  423. m_iActualSize=iSize;
  424. }
  425. void COAMSizeDockBar::CalcSizeBarLayout()
  426. {
  427. HDWP hDWP = ::BeginDeferWindowPos(m_arrBars.GetSize());
  428. CRect rectAvail;
  429. GetClientRect(&rectAvail);
  430. int nCount = 0;
  431. int lastLeft = 0;
  432. int lastRight = 0;
  433. int lastBottom = 0;
  434. int lastTop = 0;
  435. for( int i=0; i<m_arrBars.GetSize(); ++i)
  436. {
  437. COAMControlBar *pBar = (COAMControlBar *)GetDockedControlBar(i);
  438. if (pBar != NULL && pBar->IsVisible())
  439. {
  440. CRect rectBar;
  441. ++nCount;
  442. pBar->GetWindowRect(&rectBar);
  443. pBar->m_bUnique = FALSE;
  444. ScreenToClient(&rectBar);
  445. CSize sizeIdeal = pBar->CalcDynamicLayout(-1,0);
  446. if( pBar->IsLeftDocked() )
  447. {
  448. rectBar.top = lastLeft;
  449. rectBar.left = 0;
  450. rectBar.right = rectAvail.Width();
  451. rectBar.bottom = rectBar.top + sizeIdeal.cy;
  452. if (rectBar.top>lastLeft)
  453. rectBar.top = lastLeft;
  454. lastLeft = rectBar.bottom;
  455. if (IsLastControlBar(i+1))
  456. {
  457. rectBar.bottom = rectAvail.bottom;
  458. pBar->m_bToFit = TRUE;
  459. if( nCount == 1 )
  460. pBar->m_bUnique = TRUE;
  461. }
  462. else
  463. pBar->m_bToFit = FALSE;
  464. }
  465. else if (pBar->IsTopDocked())
  466. {
  467. rectBar.left = lastTop;
  468. rectBar.top = 0;
  469. rectBar.bottom = rectAvail.Height();
  470. rectBar.right = rectBar.left + sizeIdeal.cx;
  471. if( rectBar.left>lastTop )
  472. rectBar.left = lastTop;
  473. lastTop = rectBar.right;
  474. if (IsLastControlBar(i+1))
  475. {
  476. rectBar.right = rectAvail.right;
  477. pBar->m_bToFit = TRUE;
  478. if (nCount == 1)
  479. pBar->m_bUnique = TRUE;
  480. }
  481. else
  482. pBar->m_bToFit = FALSE;
  483. }
  484. else if (pBar->IsRightDocked())
  485. {
  486. rectBar.top = lastRight;
  487. rectBar.left = 0;
  488. rectBar.right = rectAvail.Width();
  489. rectBar.bottom = rectBar.top + sizeIdeal.cy;
  490. if (rectBar.top>lastRight)
  491. rectBar.top = lastRight;
  492. lastRight = rectBar.bottom;
  493. if (IsLastControlBar(i+1))
  494. {
  495. rectBar.bottom = rectAvail.bottom;
  496. pBar->m_bToFit = TRUE;
  497. if (nCount == 1)
  498. pBar->m_bUnique = TRUE;
  499. }
  500. else
  501. pBar->m_bToFit = FALSE;
  502. }
  503. else if (pBar->IsBottomDocked())
  504. {
  505. rectBar.left = lastBottom;
  506. rectBar.top = 0;
  507. rectBar.bottom = rectAvail.Height();
  508. rectBar.right = rectBar.left + sizeIdeal.cx;
  509. if( rectBar.left>lastBottom )
  510. rectBar.left = lastBottom;
  511. lastBottom = rectBar.right;
  512. if (IsLastControlBar(i+1))
  513. {
  514. rectBar.right = rectAvail.right;
  515. pBar->m_bToFit = TRUE;
  516. if( nCount == 1 )
  517. pBar->m_bUnique = TRUE;
  518. }
  519. else
  520. pBar->m_bToFit = FALSE;
  521. }
  522. pBar->SetWindowPos(NULL,rectBar.left,rectBar.top,rectBar.Width(),rectBar.Height(),SWP_NOZORDER);
  523. // pBar->Invalidate();
  524. }
  525. }
  526. ::EndDeferWindowPos(hDWP);
  527. }
  528. void COAMSizeDockBar::Maximize(COAMControlBar* pBar)
  529. {
  530. int iExt=0;
  531. CRect rectAvail;
  532. GetClientRect(rectAvail);
  533. for (int i=0; i<m_arrBars.GetSize(); ++i)
  534. {
  535. COAMControlBar *pBarDock = (COAMControlBar *)GetDockedControlBar(i);
  536. if (pBarDock && pBarDock->IsVisible() && pBarDock != pBar) {
  537. pBarDock->Minimize();
  538. iExt += pBarDock->GetMinExt();
  539. }
  540. }
  541. if (pBar->IsLeftDocked() || pBar->IsRightDocked()) {
  542. iExt = rectAvail.Height()-iExt;
  543. }
  544. if (pBar->IsTopDocked() || pBar->IsBottomDocked()) {
  545. iExt = rectAvail.Width()-iExt;
  546. }
  547. pBar->Maximize(iExt);
  548. CalcSizeBarLayout();
  549. }
  550. void COAMSizeDockBar::Normalize(COAMControlBar *)
  551. {
  552. for( int i=0; i<m_arrBars.GetSize(); ++i) {
  553. COAMControlBar *pBarDock = (COAMControlBar*)GetDockedControlBar(i);
  554. if (pBarDock && pBarDock->IsVisible())
  555. pBarDock->Normalize();
  556. }
  557. CalcSizeBarLayout();
  558. }