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

SNMP编程

开发平台:

C/C++

  1. // OAMDockContext.cpp: implementation of the COAMDockContext class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "OAMDockContext.h"
  6. #include "OAMControlBar.h"
  7. #include "OAMSizeDockBar.h"
  8. #include <afxpriv.h>
  9. #include <..srcafximpl.h>
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. #define HORZF(dw) (dw & CBRS_ORIENT_HORZ)
  16. #define VERTF(dw) (dw & CBRS_ORIENT_VERT)
  17. DWORD dwSizeBarMap[4][2] =
  18. {
  19. { AFX_IDW_SIZEBAR_LEFT,     CBRS_LEFT   },
  20. { AFX_IDW_SIZEBAR_RIGHT,    CBRS_RIGHT  },
  21. { AFX_IDW_SIZEBAR_TOP,      CBRS_TOP    },
  22. { AFX_IDW_SIZEBAR_BOTTOM,   CBRS_BOTTOM },
  23. };
  24. static void AdjustRectangle(CRect& rect, CPoint pt)
  25. {
  26. int nXOffset = (pt.x < rect.left) ? (pt.x - rect.left) :
  27. (pt.x > rect.right) ? (pt.x - rect.right) : 0;
  28. int nYOffset = (pt.y < rect.top) ? (pt.y - rect.top) :
  29. (pt.y > rect.bottom) ? (pt.y - rect.bottom) : 0;
  30. rect.OffsetRect(nXOffset, nYOffset);
  31. }
  32. /////////////////////////////////////////////////////////////////////////////
  33. // COAMDockContext
  34. COAMDockContext::COAMDockContext(CControlBar* pBar) : CDockContext(pBar)
  35. {
  36. // TODO: add construction code here.
  37. }
  38. COAMDockContext::~COAMDockContext()
  39. {
  40. // TODO: add destruction code here.
  41. }
  42. /////////////////////////////////////////////////////////////////////////////
  43. void COAMDockContext::StartDragDockBar(CPoint pt)
  44. {
  45. ASSERT_VALID(m_pBar);
  46. m_bDragging = TRUE;
  47. InitLoop();
  48. if (m_pBar->m_dwStyle & CBRS_SIZE_DYNAMIC)
  49. {
  50. CRect rect;
  51. m_pBar->GetWindowRect(rect);
  52. m_ptLast = pt;
  53. CSize sizeHorz = m_pBar->CalcDynamicLayout(0, LM_HORZ | LM_HORZDOCK);
  54. CSize sizeVert = m_pBar->CalcDynamicLayout(0, LM_VERTDOCK);
  55. CSize sizeFloat = m_pBar->CalcDynamicLayout(0, LM_HORZ | LM_MRUWIDTH);
  56. m_rectDragHorz = CRect(rect.TopLeft(), sizeHorz);
  57. m_rectDragVert = CRect(rect.TopLeft(), sizeVert);
  58. // calculate frame dragging rectangle
  59. m_rectFrameDragHorz = CRect(rect.TopLeft(), sizeFloat);
  60. m_rectFrameDragVert = CRect(rect.TopLeft(), sizeFloat);
  61. CMiniFrameWnd::CalcBorders(&m_rectFrameDragHorz);
  62. CMiniFrameWnd::CalcBorders(&m_rectFrameDragVert);
  63. m_rectFrameDragHorz.InflateRect(-afxData.cxBorder2, -afxData.cyBorder2);
  64. m_rectFrameDragVert.InflateRect(-afxData.cxBorder2, -afxData.cyBorder2);
  65. }
  66. else if (m_pBar->m_dwStyle & CBRS_SIZE_FIXED)
  67. {
  68. CRect rect;
  69. m_pBar->GetWindowRect(rect);
  70. m_ptLast = pt;
  71. CSize sizeHorz = m_pBar->CalcDynamicLayout(-1, LM_HORZ | LM_HORZDOCK);
  72. CSize sizeVert = m_pBar->CalcDynamicLayout(-1, LM_VERTDOCK);
  73. m_rectFrameDragHorz = m_rectDragHorz = CRect(rect.TopLeft(), sizeHorz);
  74. m_rectFrameDragVert = m_rectDragVert = CRect(rect.TopLeft(), sizeVert);
  75. CMiniFrameWnd::CalcBorders(&m_rectFrameDragHorz);
  76. CMiniFrameWnd::CalcBorders(&m_rectFrameDragVert);
  77. m_rectFrameDragHorz.InflateRect(-afxData.cxBorder2, -afxData.cyBorder2);
  78. m_rectFrameDragVert.InflateRect(-afxData.cxBorder2, -afxData.cyBorder2);
  79. }
  80. else
  81. {
  82. CRect rect;
  83. m_pBar->GetWindowRect(rect);
  84. m_ptLast = pt;
  85. BOOL bHorz = HORZF(m_dwStyle);
  86. DWORD dwMode = !bHorz ? (LM_HORZ | LM_HORZDOCK) : LM_VERTDOCK;
  87. CSize size = m_pBar->CalcDynamicLayout(-1, dwMode);
  88. if (bHorz)
  89. {
  90. m_rectDragHorz = rect;
  91. m_rectDragVert = CRect(CPoint(pt.x - rect.Height()/2, rect.top), size);
  92. }
  93. else 
  94. {
  95. m_rectDragVert = rect;
  96. m_rectDragHorz = CRect(CPoint(rect.left, pt.y - rect.Width()/2), size);
  97. }
  98. m_rectFrameDragHorz = m_rectDragHorz;
  99. m_rectFrameDragVert = m_rectDragVert;
  100. CMiniFrameWnd::CalcBorders(&m_rectFrameDragHorz);
  101. CMiniFrameWnd::CalcBorders(&m_rectFrameDragVert);
  102. m_rectFrameDragHorz.InflateRect(-afxData.cxBorder2, -afxData.cyBorder2);
  103. m_rectFrameDragVert.InflateRect(-afxData.cxBorder2, -afxData.cyBorder2);
  104. }
  105. AdjustRectangle(m_rectDragHorz, pt);
  106. AdjustRectangle(m_rectDragVert, pt);
  107. AdjustRectangle(m_rectFrameDragHorz, pt);
  108. AdjustRectangle(m_rectFrameDragVert, pt);
  109. m_dwOverDockStyle = CanDockDockBar();
  110. MoveDockBar(pt);   
  111. TrackDockBar();
  112. }
  113. DWORD COAMDockContext::CanDockDockBar()
  114. {
  115. BOOL bStyleHorz;
  116. DWORD dwDock = 0; 
  117. DWORD dwCurr = 0; 
  118. // ASSERT(m_dwStyle != 0);
  119. // ASSERT(m_pDockSite->IsKindOf(RUNTIME_CLASS(CFrameWnd)));
  120. bStyleHorz = HORZF(m_dwStyle);
  121. bStyleHorz = m_bFlip ? !bStyleHorz : bStyleHorz;
  122. if (bStyleHorz && HORZF(m_dwDockStyle))
  123. {
  124. dwDock = CanDockDockBar(m_rectDragHorz,
  125. m_dwDockStyle & ~CBRS_ORIENT_VERT);
  126. }
  127. else if (VERTF(m_dwDockStyle))
  128. {
  129. dwDock = CanDockDockBar(m_rectDragVert,
  130. m_dwDockStyle & ~CBRS_ORIENT_HORZ);
  131. }
  132. if (!m_bFlip)
  133. {
  134. if (dwDock == 0 && HORZF(m_dwDockStyle))
  135. {
  136. dwCurr = CanDockDockBar(m_rectDragVert,
  137. m_dwDockStyle & ~CBRS_ORIENT_VERT);
  138. dwDock = CanDockDockBar(m_rectDragHorz,
  139. m_dwDockStyle & ~CBRS_ORIENT_VERT);
  140. dwDock = (dwDock == dwCurr) ? dwDock : 0;
  141. }
  142. if (dwDock == 0 && VERTF(m_dwDockStyle))
  143. {
  144. dwCurr = CanDockDockBar(m_rectDragHorz,
  145. m_dwDockStyle & ~CBRS_ORIENT_HORZ);
  146. dwDock = CanDockDockBar(m_rectDragVert,
  147. m_dwDockStyle & ~CBRS_ORIENT_HORZ);
  148. dwDock = (dwDock == dwCurr) ? dwDock : 0;
  149. }
  150. }
  151. return dwDock;
  152. }
  153. DWORD COAMDockContext::CanDockDockBar(CRect rect, DWORD dwDockStyle, CDockBar** ppDockBar)
  154. {
  155. CFrameWnd *pFrame = (CFrameWnd*)m_pDockSite;
  156. ASSERT_VALID(pFrame);
  157. dwDockStyle &= CBRS_ALIGN_ANY|CBRS_FLOAT_MULTI;
  158. if (ppDockBar != NULL)
  159. *ppDockBar = NULL;
  160. POSITION pos = pFrame->m_listControlBars.GetHeadPosition();
  161. while (pos != NULL)
  162. {
  163. COAMSizeDockBar* pDockBar = (COAMSizeDockBar*)pFrame->m_listControlBars.GetNext(pos);
  164. if( !pDockBar->IsKindOf(RUNTIME_CLASS(COAMSizeDockBar)) )
  165. continue;
  166. if (pDockBar->IsDockSizeBar() && pDockBar->IsWindowVisible() &&
  167. (pDockBar->m_dwStyle & dwDockStyle & CBRS_ALIGN_ANY) &&
  168. (!pDockBar->m_bFloating ||
  169. (dwDockStyle & pDockBar->m_dwStyle & CBRS_FLOAT_MULTI)))
  170. {
  171. CRect rectBar;
  172. pDockBar->GetWindowRect(&rectBar);
  173. if (rectBar.Width() == 0)
  174. rectBar.right++;
  175. if (rectBar.Height() == 0)
  176. rectBar.bottom++;
  177. if (rectBar.IntersectRect(rectBar, rect))
  178. {
  179. if (ppDockBar != NULL)
  180. *ppDockBar = pDockBar;
  181. return pDockBar->m_dwStyle & dwDockStyle;
  182. }
  183. }
  184. }
  185. return 0;
  186. }
  187. BOOL COAMDockContext::TrackDockBar()
  188. {
  189. if (::GetCapture() != NULL)
  190. return FALSE;
  191. m_pBar->SetCapture();
  192. // ASSERT(m_pBar == CWnd::GetCapture());
  193. while (CWnd::GetCapture() == m_pBar)
  194. {
  195. MSG msg;
  196. if (!::GetMessage(&msg, NULL, 0, 0))
  197. {
  198. AfxPostQuitMessage(msg.wParam);
  199. break;
  200. }
  201. switch (msg.message)
  202. {
  203. case WM_LBUTTONUP:
  204. if (m_bDragging)
  205. EndDragDockBar();
  206. else
  207. EndResize();
  208. return TRUE;
  209. case WM_MOUSEMOVE:
  210. if (m_bDragging)
  211. MoveDockBar(msg.pt);
  212. else
  213. Stretch(msg.pt);
  214. break;
  215. case WM_KEYUP:
  216. if (m_bDragging)
  217. OnKey((int)msg.wParam, FALSE);
  218. break;
  219. case WM_KEYDOWN:
  220. if (m_bDragging)
  221. OnKey((int)msg.wParam, TRUE);
  222. if (msg.wParam == VK_ESCAPE)
  223. {
  224. CancelLoop();
  225. return FALSE;
  226. }
  227. break;
  228. case WM_RBUTTONDOWN:
  229. CancelLoop();
  230. return FALSE;
  231. // just dispatch rest of the messages
  232. default:
  233. DispatchMessage(&msg);
  234. break;
  235. }
  236. }
  237. CancelLoop();
  238. return FALSE;
  239. }
  240. void COAMDockContext::EndDragDockBar()
  241. {
  242. CancelLoop();
  243. if (m_dwOverDockStyle != 0)
  244. {
  245. COAMSizeDockBar* pDockBar = GetDockBar(m_dwOverDockStyle);
  246. // ASSERT(pDockBar != NULL);
  247. CRect rect = (m_dwOverDockStyle & CBRS_ORIENT_VERT) ?
  248. m_rectDragVert : m_rectDragHorz;
  249. UINT uID = _AfxGetDlgCtrlID(pDockBar->m_hWnd);
  250. m_uMRUDockID = uID;
  251. m_rectMRUDockPos = rect;
  252. pDockBar->ScreenToClient(&m_rectMRUDockPos);
  253. DockSizeBar(m_pBar, pDockBar, &rect);
  254. m_pDockSite->RecalcLayout();
  255. }
  256. else if ((m_dwStyle & CBRS_SIZE_DYNAMIC) || (HORZF(m_dwStyle) && !m_bFlip) ||
  257. (VERTF(m_dwStyle) && m_bFlip))
  258. {
  259. m_dwMRUFloatStyle = CBRS_ALIGN_TOP | (m_dwDockStyle & CBRS_FLOAT_MULTI);
  260. m_ptMRUFloatPos = m_rectFrameDragHorz.TopLeft();
  261. m_pDockSite->FloatControlBar(m_pBar, m_ptMRUFloatPos, m_dwMRUFloatStyle);
  262. m_pDockSite->RecalcLayout();
  263. }
  264. else 
  265. {
  266. m_dwMRUFloatStyle = CBRS_ALIGN_LEFT | (m_dwDockStyle & CBRS_FLOAT_MULTI);
  267. m_ptMRUFloatPos = m_rectFrameDragVert.TopLeft();
  268. m_pDockSite->FloatControlBar(m_pBar, m_ptMRUFloatPos, m_dwMRUFloatStyle);
  269. m_pDockSite->RecalcLayout();
  270. }
  271. }
  272. COAMSizeDockBar* COAMDockContext::GetDockBar(DWORD dwOverDockStyle)
  273. {
  274. DWORD dw = 0;
  275. CDockBar* pBar;
  276. if (HORZF(dwOverDockStyle))
  277. {
  278. // ASSERT(m_pDockSite->IsKindOf(RUNTIME_CLASS(CFrameWnd)));
  279. dw = CanDockDockBar(m_rectDragHorz,
  280. dwOverDockStyle & ~CBRS_ORIENT_VERT, &pBar);
  281. // ASSERT(dw != 0);
  282. // ASSERT(pBar != NULL);
  283. return (COAMSizeDockBar*)pBar;
  284. }
  285. if (VERTF(dwOverDockStyle))
  286. {
  287. dw = CanDockDockBar(m_rectDragVert,
  288. dwOverDockStyle & ~CBRS_ORIENT_HORZ, &pBar);
  289. // ASSERT(dw != 0);
  290. // ASSERT(pBar != NULL);
  291. return (COAMSizeDockBar*)pBar;
  292. }
  293. return NULL;
  294. }
  295. void COAMDockContext::MoveDockBar(CPoint pt)
  296. {
  297. CPoint ptOffset = pt - m_ptLast;
  298. m_rectDragHorz.OffsetRect(ptOffset);
  299. m_rectFrameDragHorz.OffsetRect(ptOffset);
  300. m_rectDragVert.OffsetRect(ptOffset);
  301. m_rectFrameDragVert.OffsetRect(ptOffset);
  302. m_ptLast = pt;
  303. m_dwOverDockStyle = m_bForceFrame ? 0 : CanDockDockBar();
  304. DrawFocusRect();
  305. }
  306. void COAMDockContext::DockSizeBar(CControlBar * pBar,COAMSizeDockBar *pDockBar, LPRECT lpRect)
  307. {
  308. CFrameWnd *pFrame = (CFrameWnd*)m_pDockSite;
  309. ASSERT_VALID(pFrame);
  310. // ASSERT(pBar != NULL);
  311. // ASSERT(pBar->m_pDockContext != NULL);
  312. if( pDockBar == NULL )
  313. {
  314. for (int i = 0; i < 4; i++)
  315. {
  316. if ((dwSizeBarMap[i][1] & CBRS_ALIGN_ANY) ==
  317. (pBar->m_dwStyle & CBRS_ALIGN_ANY))
  318. {
  319. pDockBar = (COAMSizeDockBar*)pFrame->GetControlBar(dwSizeBarMap[i][0]);
  320. // ASSERT(pDockBar != NULL);
  321. break;
  322. }
  323. }
  324. }
  325. // ASSERT(pDockBar != NULL);
  326. // ASSERT(pFrame->m_listControlBars.Find(pBar) != NULL);
  327. // ASSERT(pBar->m_pDockSite == pFrame);
  328. ((COAMControlBar*)pBar)->Normalize();
  329. pDockBar->DockControlBar(pBar, lpRect);
  330. }
  331. void COAMDockContext::ToggleDocking()
  332. {
  333. if (m_pBar->IsKindOf(RUNTIME_CLASS(COAMControlBar)))
  334. {
  335. if (m_pBar->IsFloating())
  336. {
  337. // Dock it only if is allowed to be docked
  338. if (m_pBar->m_dwDockStyle & CBRS_ALIGN_ANY)
  339. {
  340. ASSERT((m_uMRUDockID >= AFX_IDW_DOCKBAR_TOP && m_uMRUDockID <= AFX_IDW_SIZEBAR_BOTTOM) ||
  341. m_uMRUDockID == 0);
  342. CRect rect = m_rectMRUDockPos;
  343. COAMSizeDockBar* pDockBar = NULL;
  344. if (m_uMRUDockID != 0)
  345. {
  346. pDockBar = (COAMSizeDockBar*)m_pDockSite->GetControlBar(m_uMRUDockID);
  347. pDockBar->ClientToScreen(&rect);
  348. }
  349. // dock it at the specified position, RecalcLayout will snap
  350. DockSizeBar(m_pBar, pDockBar, &rect);
  351. m_pDockSite->RecalcLayout();
  352. }
  353. }
  354. else
  355. {
  356. CPoint ptFloat = m_ptMRUFloatPos;
  357. if (ptFloat.x < 0 || ptFloat.y < 0)
  358. {
  359. ptFloat = m_rectMRUDockPos.TopLeft();
  360. m_pBar->GetParent()->ClientToScreen(&ptFloat);
  361. }
  362. m_pDockSite->FloatControlBar(m_pBar, ptFloat, m_dwMRUFloatStyle);
  363. }
  364. }
  365. }