OAMCONTROLBAR.CPP
上传用户:shgx688
上传日期:2009-12-27
资源大小:855k
文件大小:19k
源码类别:

SNMP编程

开发平台:

MultiPlatform

  1. // OAMControlBar.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "OAMControlBar.h"
  5. #include "OAMDockContext.h"
  6. #include "OAMSizeDockBar.h"
  7. #include "resource.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. #define GRIP_LEFTSPACING 3
  14. #define GRIP_STARTGRIP 8
  15. #define GRIP_SIZE 3
  16. #define GRIP_BUTTONSPACING 3
  17. #define GRIP_INTRASPACING 1
  18. #define _HIDECROSS 0
  19. #define _MAXORZDISABLE 1
  20. #define _MAXORZENABLE 2
  21. #define _MAXVERTDISABLE 3
  22. #define _MAXVERTENABLE 4
  23. #define _NORMORZDISABLE 5
  24. #define _NORMORZENABLE 6
  25. #define _NORMVERTDISABLE 7
  26. #define _NORMVERTENABLE 8
  27. HBITMAP hBkBitmap = NULL;
  28. COLORREF _clrText = RGB(0,0,0);
  29. CBrush  m_brBk;
  30. /////////////////////////////////////////////////////////////////////////////
  31. // COAMControlBar
  32. COAMControlBar::COAMControlBar()
  33. {
  34. m_iTrackBorderSize = 4;
  35. m_iAuxImage = -1;
  36. m_menuID = -1;
  37. m_bToFit = FALSE;
  38. m_bOkToDrag = FALSE;
  39. m_bDragging = FALSE;
  40. m_bMaximized = FALSE;
  41. m_bUnique = FALSE;
  42. m_bGripper = TRUE;
  43. m_bButtons = TRUE;
  44. m_sizeDesired = CSize(200,100);
  45. m_sizeNormal = CSize(200,100);
  46. m_cxOffset = 5;
  47. m_cyOffset = 3;
  48. // Create the image list used by frame buttons.
  49. m_ImageList.Create(IDB_BUTTON_IMAGES,
  50. 10, 1, RGB(255,255,255));
  51. m_pChildWnd = NULL;
  52. m_clrBtnHilite = ::GetSysColor(COLOR_BTNHILIGHT);
  53. m_clrBtnShadow = ::GetSysColor(COLOR_BTNSHADOW);
  54. m_clrBtnFace   = ::GetSysColor(COLOR_BTNFACE);
  55. }
  56. COAMControlBar::~COAMControlBar()
  57. {
  58. m_ImageList.DeleteImageList();
  59. }
  60. IMPLEMENT_DYNAMIC(COAMControlBar, CControlBar)
  61. BEGIN_MESSAGE_MAP(COAMControlBar, CControlBar)
  62. //{{AFX_MSG_MAP(COAMControlBar)
  63. ON_WM_NCPAINT()
  64. ON_WM_PAINT()
  65. ON_WM_MOUSEMOVE()
  66. ON_WM_SETCURSOR()
  67. ON_WM_LBUTTONUP()
  68. ON_WM_NCHITTEST()
  69. ON_WM_ERASEBKGND()
  70. ON_WM_SYSCOLORCHANGE()
  71. ON_WM_CREATE()
  72. ON_WM_WINDOWPOSCHANGED()
  73. ON_WM_CONTEXTMENU()
  74. ON_WM_LBUTTONDOWN()
  75. ON_COMMAND(IDC_BUTTON_HIDE, OnButtonClose)
  76. ON_UPDATE_COMMAND_UI(IDC_BUTTON_HIDE, OnUpdateButtonClose)
  77. ON_COMMAND(IDC_BUTTON_MINI, OnButtonMinimize)
  78. ON_UPDATE_COMMAND_UI(IDC_BUTTON_MINI, OnUpdateButtonMinimize)
  79. //}}AFX_MSG_MAP
  80. END_MESSAGE_MAP()
  81. /////////////////////////////////////////////////////////////////////////////
  82. // COAMControlBar overrides
  83. BOOL COAMControlBar::Create(CWnd *pParentWnd, UINT nID, LPCTSTR lpszWindowName, CSize sizeDefault, DWORD dwStyle)
  84. {
  85.     ASSERT_VALID(pParentWnd);   // must have a parent
  86.     // Set initial control bar style.
  87.     SetBarStyle(dwStyle & CBRS_ALL|CBRS_HIDE_INPLACE|CBRS_SIZE_DYNAMIC|CBRS_FLOAT_MULTI);
  88.     dwStyle &= ~CBRS_ALL;
  89.     dwStyle |= WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN;
  90.     
  91. m_sizeDesired = m_sizeNormal = sizeDefault;
  92. CString wndClass = ::AfxRegisterWndClass(
  93. CS_DBLCLKS, 0, ::GetSysColorBrush(COLOR_BTNFACE));
  94. return CWnd::Create(wndClass, lpszWindowName,
  95.   dwStyle, CRect(0,0,0,0), pParentWnd, nID);
  96. }
  97. BOOL COAMControlBar::PreTranslateMessage(MSG* pMsg) 
  98. {
  99. if (m_bButtons)
  100. m_ToolTip.RelayEvent(pMsg);
  101. return CControlBar::PreTranslateMessage(pMsg);
  102. }
  103. void COAMControlBar::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler)
  104. {
  105. if (m_bButtons)
  106. {
  107. UINT NewImage;
  108. BOOL bEnable = FALSE;
  109. if (IsHorzDocked())
  110. {
  111. if (m_bUnique) {
  112. m_ToolTip.UpdateTipText (IDS_EXPAND, &m_btnMinim);
  113. NewImage = _MAXORZDISABLE;
  114. bEnable = FALSE;
  115. }
  116. else if (!m_bMaximized) {
  117. m_ToolTip.UpdateTipText (IDS_EXPAND, &m_btnMinim);
  118. NewImage = _MAXORZENABLE;
  119. bEnable = TRUE;
  120. }
  121. else {
  122. m_ToolTip.UpdateTipText (IDS_CONTRACT, &m_btnMinim);
  123. NewImage = _NORMORZENABLE;
  124. bEnable = TRUE;
  125. }
  126. }
  127. else if(IsVertDocked())
  128. {
  129. if (m_bUnique) {
  130. m_ToolTip.UpdateTipText (IDS_EXPAND, &m_btnMinim);
  131. NewImage = _MAXVERTDISABLE;
  132. bEnable = FALSE;
  133. }
  134. else if (!m_bMaximized) {
  135. m_ToolTip.UpdateTipText (IDS_EXPAND, &m_btnMinim);
  136. NewImage = _MAXVERTENABLE;
  137. bEnable = TRUE;
  138. }
  139. else {
  140. m_ToolTip.UpdateTipText (IDS_CONTRACT, &m_btnMinim);
  141. NewImage = _NORMVERTENABLE;
  142. bEnable = TRUE;
  143. }
  144. }
  145. if (NewImage != m_iAuxImage) {
  146. m_iAuxImage = NewImage;
  147. m_btnMinim.SetIcon(m_ImageList.ExtractIcon(m_iAuxImage), CSize(10,10));
  148. m_btnMinim.EnableWindow(bEnable);
  149. }
  150. }
  151. }
  152. CSize COAMControlBar::CalcDynamicLayout(int nLength, DWORD nMode)
  153. { CSize sizeResult = m_sizeDesired;
  154. // sizeResult.cx += GetMinExt();
  155. // sizeResult.cy += GetMinExt();
  156. /* if(IsFloating())
  157. {
  158. if (nMode == LM_HORZ) {
  159. if (nLength < 50)
  160. nLength = 50;
  161. m_sizeDesired.cx = nLength;
  162. }
  163. if (nMode == (LM_LENGTHY | LM_HORZ)) {
  164. if (nLength < 50)
  165. nLength = 50;
  166. m_sizeDesired.cy = nLength;
  167. }
  168. sizeResult = m_sizeDesired;
  169. }*/
  170. return sizeResult;
  171. }
  172. /////////////////////////////////////////////////////////////////////////////
  173. // COAMControlBar message handlers
  174. void COAMControlBar::OnNcPaint() 
  175. {
  176. EraseNonClient();
  177. }
  178. void COAMControlBar::OnPaint() 
  179. {
  180. CPaintDC dc(this); // device context for painting
  181. CRect rc;
  182. m_iAuxImage = -1;
  183. GetClientRect(&rc);
  184. CRect rect;
  185. GetChildRect(rect);
  186. dc.ExcludeClipRect(rect);
  187. DrawBorders(&dc,rc);
  188. }
  189. void COAMControlBar::OnMouseMove(UINT nFlags, CPoint point) 
  190. {
  191. HitTest(point);
  192. CRect rectDock;
  193. if( m_bDragging )
  194. {
  195. // ASSERT(GetParent() != NULL);
  196. GetParent()->GetClientRect(&rectDock);
  197. ClientToScreen(&rectDock);
  198. ClientToScreen(&point);
  199. CFrameWnd *pFrame=GetDockingFrame();
  200. // ASSERT(pFrame != NULL);
  201. pFrame -> ScreenToClient(&point);
  202. pFrame->ScreenToClient(&rectDock);
  203. point.x = point.x>rectDock.right ? rectDock.right:point.x;
  204. point.x = point.x<rectDock.left ? rectDock.left:point.x;
  205. point.y = point.y>rectDock.bottom ? rectDock.bottom:point.y;
  206. point.y = point.y<rectDock.top ? rectDock.top:point.y;
  207. OnInvertTracker(m_rcTrack);
  208. int deltaX = point.x-m_ptCurDrag.x;
  209. int deltaY = point.y-m_ptCurDrag.y;
  210. if(IsVertDocked()) {
  211. m_rcTrack.top += deltaY;
  212. m_rcTrack.bottom += deltaY;
  213. }
  214. else if (IsHorzDocked()) {
  215. m_rcTrack.left += deltaX;
  216. m_rcTrack.right += deltaX;
  217. }
  218. OnInvertTracker(m_rcTrack);
  219. m_ptCurDrag = point;
  220. }
  221. CControlBar::OnMouseMove(nFlags, point);
  222. }
  223. BOOL COAMControlBar::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  224. {
  225. return (!m_bOkToDrag && !m_bDragging)?
  226. CControlBar::OnSetCursor(pWnd, nHitTest, message):FALSE;
  227. }
  228. void COAMControlBar::OnLButtonUp(UINT nFlags, CPoint point) 
  229. {
  230. CRect rectAvail;
  231. GetParent()->GetClientRect(&rectAvail);
  232. if( m_bDragging )
  233. {
  234.     ReleaseCapture();
  235.     OnInvertTracker(m_rcTrack);
  236.     m_bDragging = FALSE;
  237. if(IsVertDocked()) {
  238. int newHeight = m_rcTrack.top-m_ptStartDrag.y;
  239. m_sizeDesired.cy += newHeight;
  240. m_sizeDesired.cy = m_sizeDesired.cy > GetMinExt() ? m_sizeDesired.cy : GetMinExt();
  241. m_sizeDesired.cy = m_sizeDesired.cy > rectAvail.Height() ? rectAvail.Height() : m_sizeDesired.cy;
  242. }
  243.     
  244. else if (IsHorzDocked()) {
  245. int newWidth = m_rcTrack.left-m_ptStartDrag.x;
  246. m_sizeDesired.cx += newWidth;
  247. m_sizeDesired.cx = m_sizeDesired.cx > GetMinExt() ? m_sizeDesired.cx : GetMinExt();
  248.         m_sizeDesired.cx = m_sizeDesired.cx > rectAvail.Width() ? rectAvail.Width() : m_sizeDesired.cx;
  249.     }
  250.    ((COAMSizeDockBar *)GetParent())->CalcSizeBarLayout();
  251. }
  252.     CControlBar::OnLButtonUp(nFlags, point);
  253. }
  254. UINT COAMControlBar::OnNcHitTest(CPoint point) 
  255. {
  256. return HTCLIENT;
  257. }
  258. BOOL COAMControlBar::OnEraseBkgnd(CDC* pDC) 
  259. {
  260. int result;// = CControlBar::OnEraseBkgnd(pDC);
  261. if(hBkBitmap)
  262. {
  263. CRect rectClient;
  264. GetClientRect(rectClient);
  265. CBitmap * bp = CBitmap::FromHandle(hBkBitmap);
  266. pDC->FillRect(rectClient,&CBrush(bp));
  267. result = TRUE;
  268. }
  269. else
  270. {
  271. result = CControlBar::OnEraseBkgnd(pDC);
  272. }
  273. CRect rect;
  274. GetChildRect(rect);
  275. rect.DeflateRect(1,1);
  276. pDC->Draw3dRect(rect, m_clrBtnShadow, m_clrBtnHilite);
  277. UpdateWindow(); // Reduce some of the flickering. Really not convinced this is a good solution.
  278. return result;
  279. }
  280. void COAMControlBar::OnSysColorChange() 
  281. {
  282. CControlBar::OnSysColorChange();
  283. m_clrBtnHilite = ::GetSysColor(COLOR_BTNHILIGHT);
  284. m_clrBtnShadow = ::GetSysColor(COLOR_BTNSHADOW);
  285. m_clrBtnFace   = ::GetSysColor(COLOR_BTNFACE);
  286. }
  287. int COAMControlBar::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  288. {
  289. if (CControlBar::OnCreate(lpCreateStruct) == -1)
  290. return -1;
  291. if (m_bButtons)
  292. {
  293. if(!m_btnClose.Create(NULL, WS_CHILD | WS_VISIBLE | WS_TABSTOP |
  294. BS_NOTIFY | BS_OWNERDRAW | BS_ICON,
  295. CRect(0,0,0,0), this, IDC_BUTTON_HIDE ))
  296. {
  297. TRACE0(_T("Unable to create close buttonn"));
  298. return -1;
  299. }
  300. if(!m_btnMinim.Create(NULL, WS_CHILD | WS_VISIBLE | WS_TABSTOP |
  301. BS_NOTIFY | BS_OWNERDRAW | BS_ICON,
  302. CRect(0,0,0,0), this, IDC_BUTTON_MINI ))
  303. {
  304. TRACE0(_T("Unable to create minimize buttonn"));
  305. return -1;
  306. }
  307. m_btnClose.DisableFlatLook();
  308. m_btnMinim.DisableFlatLook();
  309. m_btnClose.SetIcon(m_ImageList.ExtractIcon(0), CSize(10,10));
  310. // Create the ToolTip control.
  311. m_ToolTip.Create(this);
  312. m_ToolTip.Activate(TRUE);
  313. m_ToolTip.AddTool (&m_btnClose, IDS_HIDE);
  314. m_ToolTip.AddTool (&m_btnMinim, IDS_EXPAND);
  315. }
  316. return 0;
  317. }
  318. void COAMControlBar::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos) 
  319. {
  320. CControlBar::OnWindowPosChanged(lpwndpos);
  321. if (m_bButtons)
  322. {
  323. if (IsFloating())
  324. {
  325. m_btnClose.ShowWindow(SW_HIDE);
  326. m_btnMinim.ShowWindow(SW_HIDE);
  327. }
  328. else
  329. {
  330. m_btnClose.ShowWindow(SW_SHOW);
  331. m_btnMinim.ShowWindow(SW_SHOW);
  332. CRect rcClose(GetButtonRect());
  333. CRect rcMinim(GetButtonRect());
  334. if (IsHorzDocked()) {
  335. rcMinim.OffsetRect(0,14);
  336. }
  337. else {
  338. rcClose.OffsetRect(14,0);
  339. }
  340. m_btnClose.MoveWindow(rcClose);
  341. m_btnMinim.MoveWindow(rcMinim);
  342.             Invalidate();     // Added
  343. }
  344. }
  345. if (m_pChildWnd->GetSafeHwnd()) {
  346. CRect rc;
  347. GetChildRect(rc);
  348. rc.DeflateRect(1,1);
  349. m_pChildWnd->MoveWindow(rc);
  350. m_pChildWnd->Invalidate();
  351. }
  352. }
  353. void COAMControlBar::OnContextMenu(CWnd* pWnd, CPoint point) 
  354. {
  355. // if no menu, just return. 
  356. /* if (m_menuID == -1 )
  357. // Gonzalo Pereyra
  358. DefWindowProc(WM_CONTEXTMENU, LONG(m_hWnd), 
  359. MAKELPARAM(point.x,point.y)); 
  360. TRACE0(_T("Warning: No control bar menu defined.n")); 
  361. return; 
  362. }
  363. if (point.x == -1 && point.y == -1)
  364. {
  365. //keystroke invocation
  366. CRect rect;
  367. GetClientRect(rect);
  368. ClientToScreen(rect);
  369. point = rect.TopLeft();
  370. point.Offset(5, 5);
  371. }
  372. CMenu menu;
  373. VERIFY(menu.LoadMenu(m_menuID));
  374. CMenu* pPopup = menu.GetSubMenu(0);
  375. // ASSERT(pPopup != NULL);
  376. CWnd* pWndPopupOwner = this;
  377. while (pWndPopupOwner->GetStyle() & WS_CHILD)
  378. pWndPopupOwner = pWndPopupOwner->GetParent();
  379. pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
  380. pWndPopupOwner);*/
  381. if (point.x == -1 && point.y == -1){
  382. //keystroke invocation
  383. CRect rect;
  384. GetClientRect(rect);
  385. ClientToScreen(rect);
  386. point = rect.TopLeft();
  387. point.Offset(5, 5);
  388. }
  389. CMenu menu;
  390. VERIFY(menu.LoadMenu(IDR_TREE));
  391. CMenu* pPopup = menu.GetSubMenu(0);
  392. ASSERT(pPopup != NULL);
  393. CWnd* pWndPopupOwner = this;
  394. // while (pWndPopupOwner->GetStyle() & WS_CHILD)
  395. // pWndPopupOwner = pWndPopupOwner->GetParent();
  396. pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
  397. pWndPopupOwner);
  398. }
  399. void COAMControlBar::OnLButtonDown(UINT nFlags, CPoint point) 
  400. {
  401. if (m_bOkToDrag)
  402. {
  403. CFrameWnd *pFrame=GetDockingFrame();
  404. GetClientRect(m_rcTrack);
  405. if (IsVertDocked()) {
  406. m_rcTrack.top = m_rcTrack.bottom-m_iTrackBorderSize-2;
  407. m_rcTrack.bottom-=2;
  408. }
  409. else if (IsHorzDocked()) {
  410. m_rcTrack.left = m_rcTrack.right-m_iTrackBorderSize-2;
  411. m_rcTrack.right-=2;
  412. }
  413. ClientToScreen(&m_rcTrack);
  414. pFrame->ScreenToClient(&m_rcTrack);
  415. ClientToScreen(&point);
  416. pFrame->ScreenToClient(&point);
  417. m_ptStartDrag = point;
  418. m_ptCurDrag = point;
  419. SetCapture();
  420. m_bDragging = TRUE;
  421. OnInvertTracker(m_rcTrack);
  422. }
  423. else if (m_pDockBar) {
  424. if (OnToolHitTest(point, NULL) == -1) {
  425. ClientToScreen(&point);
  426. ((COAMDockContext*)m_pDockContext)->StartDragDockBar(point);
  427. }
  428. }
  429. else {
  430. CControlBar::OnLButtonDown(nFlags, point);
  431. }
  432. }
  433. void COAMControlBar::OnButtonClose()
  434. {
  435. GetDockingFrame()->ShowControlBar(this,FALSE,FALSE);
  436. }
  437. void COAMControlBar::OnUpdateButtonClose(CCmdUI* pCmdUI)
  438. {
  439. pCmdUI->Enable();
  440. }
  441. void COAMControlBar::OnButtonMinimize()
  442. {
  443. if (!m_bMaximized) {
  444. ((COAMSizeDockBar *)GetParent())->Maximize(this);
  445. m_bMaximized = TRUE;
  446. }
  447. else {
  448. ((COAMSizeDockBar *)GetParent())->Normalize(this);
  449. m_bMaximized = FALSE;
  450. }
  451. }
  452. void COAMControlBar::OnUpdateButtonMinimize(CCmdUI* pCmdUI)
  453. {
  454. pCmdUI->Enable();
  455. }
  456. /////////////////////////////////////////////////////////////////////////////
  457. // COAMControlBar operations
  458. UINT COAMControlBar::GetMenuID()
  459. {
  460. return m_menuID;
  461. }
  462. void COAMControlBar::SetMenuID(UINT nID)
  463. {
  464. m_menuID = nID;
  465. }
  466. void COAMControlBar::ShowFrameControls(BOOL bGripper, BOOL bButtons)
  467. {
  468. m_bGripper = bGripper;
  469. m_bButtons = bButtons;
  470. }
  471. void COAMControlBar::EnableDockingOnSizeBar(DWORD dwDockStyle)
  472. {
  473. // ASSERT(m_pDockContext == NULL);
  474. m_dwDockStyle = dwDockStyle;
  475. if (m_pDockContext == NULL)
  476. m_pDockContext = new COAMDockContext(this);
  477. if (m_hWndOwner == NULL)
  478. m_hWndOwner = ::GetParent(m_hWnd);
  479. }
  480. void COAMControlBar::Maximize(int size)
  481. {
  482. m_sizeNormal = m_sizeDesired;
  483. if (IsHorzDocked()) {
  484. m_sizeDesired.cx = size;
  485. }
  486. else if (IsVertDocked()) {
  487. m_sizeDesired.cy = size;
  488. }
  489. m_bMaximized = TRUE;
  490. }
  491. void COAMControlBar::Minimize()
  492. {
  493. m_sizeNormal = m_sizeDesired;
  494. if (IsHorzDocked()) {
  495. m_sizeDesired.cx = GetMinExt();
  496. }
  497. else if (IsVertDocked()) {
  498. m_sizeDesired.cy = GetMinExt();
  499. }
  500. m_bMaximized = FALSE;
  501. }
  502. void COAMControlBar::Normalize()
  503. {
  504. if (IsHorzDocked()) {
  505. m_sizeDesired.cx = m_sizeNormal.cx;
  506. }
  507. else if (IsVertDocked()) {
  508. m_sizeDesired.cy = m_sizeNormal.cy;
  509. }
  510. m_bMaximized = FALSE;
  511. }
  512. void COAMControlBar::SetNormalSize(const CSize &cs)
  513. {
  514. m_sizeDesired = m_sizeNormal = cs;
  515. }
  516. BOOL COAMControlBar::IsVertDocked()
  517. {
  518. return (IsLeftDocked() || IsRightDocked());
  519. }
  520. BOOL COAMControlBar::IsHorzDocked()
  521. {
  522. return (IsTopDocked() || IsBottomDocked());
  523. }
  524. BOOL COAMControlBar::IsBottomDocked()
  525. {
  526. return m_pDockBar?(m_pDockBar->GetDlgCtrlID()
  527. == AFX_IDW_SIZEBAR_BOTTOM):FALSE;
  528. }
  529. BOOL COAMControlBar::IsTopDocked()
  530. {
  531. return m_pDockBar?(m_pDockBar->GetDlgCtrlID()
  532. == AFX_IDW_SIZEBAR_TOP):FALSE;
  533. }
  534. BOOL COAMControlBar::IsRightDocked()
  535. {
  536. return m_pDockBar?(m_pDockBar->GetDlgCtrlID()
  537. == AFX_IDW_SIZEBAR_RIGHT):FALSE;
  538. }
  539. BOOL COAMControlBar::IsLeftDocked()
  540. {
  541. return m_pDockBar?(m_pDockBar->GetDlgCtrlID()
  542. == AFX_IDW_SIZEBAR_LEFT):FALSE;
  543. }
  544. int COAMControlBar::GetMinExt()
  545. {
  546. int nRet = m_iTrackBorderSize;
  547. if (m_bGripper || m_bButtons) {
  548. nRet += GRIP_STARTGRIP;
  549. nRet += GRIP_SIZE*2;
  550. nRet += GRIP_INTRASPACING*3+2;
  551. }
  552. else
  553. nRet += 2;
  554. return nRet;
  555. }
  556. void COAMControlBar::GetChildRect(CRect &rect)
  557. {
  558. GetClientRect(&rect);
  559. if (!IsFloating())
  560. {
  561. if (IsVertDocked()) {
  562. // rect.left += sizeImgBarBorder.cx;//m_cxOffset;
  563. // rect.right -= sizeImgBarBorder.cx;//m_cxOffset;
  564. // rect.top += sizeImgBarBorder.cy;//m_cyOffset;
  565. // rect.bottom -= sizeImgBarBorder.cy;//m_cyOffset;
  566. rect.left += m_cxOffset;
  567. rect.right -= m_cxOffset;
  568. rect.top += (GetMinExt()-5);
  569. rect.bottom -= (m_iTrackBorderSize+4);
  570. }
  571. else if(IsHorzDocked()) {
  572. rect.left += (GetMinExt()-5);
  573. rect.right -= (m_iTrackBorderSize+4);
  574. rect.top += m_cyOffset;
  575. rect.bottom -= m_cyOffset;
  576. }
  577. if( rect.left > rect.right || rect.top > rect.bottom )
  578. rect = CRect(0,0,0,0);
  579. }
  580. }
  581. void COAMControlBar::EraseNonClient()
  582. {
  583. CWindowDC dc(this);
  584. CRect rectClient;
  585. GetClientRect(rectClient);
  586. CRect rectWindow;
  587. GetWindowRect(rectWindow);
  588. ScreenToClient(rectWindow);
  589. rectClient.OffsetRect(-rectWindow.left, -rectWindow.top);
  590. dc.ExcludeClipRect(rectClient);
  591. rectWindow.OffsetRect(-rectWindow.left, -rectWindow.top);
  592. dc.IntersectClipRect(rectWindow);
  593. SendMessage(WM_ERASEBKGND, (WPARAM)dc.m_hDC);
  594. }
  595. void COAMControlBar::DrawBorders(CDC *pDC, CRect &rect)
  596. {
  597. CRect rc;
  598. rc.CopyRect(&rect);
  599. CRect rcTrack;
  600. rcTrack.CopyRect(&rc);
  601. if(IsVertDocked())
  602. {
  603. if (!m_bToFit) {
  604. rcTrack.top = rc.bottom-m_iTrackBorderSize;
  605. rcTrack.top-=2;
  606. rcTrack.bottom-=1;
  607. pDC->FillSolidRect(rcTrack, m_clrBtnFace);
  608. pDC->Draw3dRect(rcTrack, m_clrBtnHilite, m_clrBtnShadow);
  609. }
  610. }
  611. else if (IsHorzDocked())
  612. {
  613. if (!m_bToFit) {
  614. rcTrack.left = rc.right-m_iTrackBorderSize;
  615. rcTrack.left-=2;
  616. rcTrack.right-=1;
  617. pDC->FillSolidRect(rcTrack, m_clrBtnFace);
  618. pDC->Draw3dRect(rcTrack, m_clrBtnHilite, m_clrBtnShadow);
  619. }
  620. }
  621. DrawGripper(pDC);
  622. }
  623. void COAMControlBar::HitTest(CPoint &point)
  624. {
  625. CRect rcWin;
  626. GetClientRect(&rcWin);
  627. HCURSOR hCur;
  628. BOOL bHit = FALSE;
  629. if (IsVertDocked()) {
  630. rcWin.top = rcWin.bottom-m_iTrackBorderSize;
  631. hCur = AfxGetApp()->LoadCursor(IDC_VSPLITBAR);
  632. bHit = rcWin.PtInRect(point) && !m_bToFit;
  633. }
  634. else if (IsHorzDocked()) {
  635. rcWin.left = rcWin.right-m_iTrackBorderSize;
  636. hCur = AfxGetApp()->LoadCursor(IDC_HSPLITBAR);
  637. bHit = rcWin.PtInRect(point) && !m_bToFit;
  638. }
  639. if( bHit )
  640. SetCursor(hCur);
  641. else {
  642. hCur = ::LoadCursor(NULL,IDC_ARROW);
  643. SetCursor(hCur);
  644. }
  645. m_bOkToDrag = bHit;
  646. }
  647. void COAMControlBar::OnInvertTracker(const CRect &rect)
  648. {
  649. ASSERT_VALID(this);
  650. // ASSERT(!rect.IsRectEmpty());
  651. CFrameWnd *pFrame=GetDockingFrame();
  652. CDC* pDC = pFrame->GetDC();
  653. CBrush* pBrush = CDC::GetHalftoneBrush();
  654. HBRUSH hOldBrush = NULL;
  655. if (pBrush != NULL)
  656. hOldBrush = (HBRUSH)SelectObject(pDC->m_hDC, pBrush->m_hObject);
  657. pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATINVERT);
  658. if (hOldBrush != NULL)
  659. SelectObject(pDC->m_hDC, hOldBrush);
  660. pFrame->ReleaseDC(pDC);
  661. }
  662. void COAMControlBar::SetChild(CWnd *pWnd)
  663. {
  664. m_pChildWnd = pWnd;
  665. }
  666. void COAMControlBar::DrawGripper(CDC *pDC)
  667. {
  668. if (!IsFloating() && m_bGripper)
  669. {
  670. // draw the gripper.
  671. CRect pRect(GetGripperRect());
  672. pDC->Draw3dRect( pRect, ::GetSysColor(COLOR_BTNHIGHLIGHT),
  673. ::GetSysColor(COLOR_BTNSHADOW) );
  674. if (IsHorzDocked())
  675. pRect.OffsetRect(4,0);
  676. else
  677. pRect.OffsetRect(0,4);
  678. pDC->Draw3dRect( pRect, ::GetSysColor(COLOR_BTNHIGHLIGHT),
  679. ::GetSysColor(COLOR_BTNSHADOW) );
  680. }
  681. }
  682. CRect COAMControlBar::GetButtonRect()
  683. {
  684. CRect rect;
  685. GetClientRect(&rect);
  686. rect.OffsetRect(-rect.left,-rect.top);
  687. if (IsHorzDocked()) {
  688. rect.top  += 3;
  689. rect.bottom = rect.top+12;
  690. rect.left  += 2;
  691. rect.right  = rect.left+12;
  692. }
  693. else {
  694. rect.right -= 19;
  695. rect.left   = rect.right-12;
  696. rect.top   += 3;
  697. rect.bottom = rect.top+12;
  698. }
  699. return rect;
  700. }
  701. CRect COAMControlBar::GetGripperRect()
  702. {
  703. CRect rect;
  704. GetClientRect(&rect);
  705. rect.OffsetRect(-rect.left,-rect.top);
  706. if (IsHorzDocked()) {
  707. rect.DeflateRect(3,3);
  708. rect.left += 1;
  709. rect.right  = rect.left+3;
  710. rect.bottom -= 1;
  711. rect.top += m_bButtons?30:1;
  712. }
  713. else {
  714. rect.DeflateRect(4,4);
  715. rect.top += 2;
  716. rect.bottom  = rect.top+3;
  717. rect.right -= m_bButtons?30:2;
  718. }
  719. return rect;
  720. }