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

SNMP编程

开发平台:

MultiPlatform

  1. // OAMFrameWnd.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "OAMFrameWnd.h"
  5. #include "OAMDockBar.h"
  6. #include "OAMSizeDockBar.h"
  7. #include "OAMControlBar.h"
  8. #include "OAMMiniDockFrameWnd.h"
  9. //#include "ChangeAgent.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. /////////////////////////////////////////////////////////////////////////////
  16. // COAMFrameWnd
  17. extern DWORD dwSizeBarMap[4][2];
  18. COAMFrameWnd::COAMFrameWnd()
  19. {
  20. for (int i = 0; i < 4; ++i)
  21. m_aInitialSize[i] = 0;
  22. }
  23. COAMFrameWnd::~COAMFrameWnd()
  24. {
  25. // TODO: add destruction code here.
  26. }
  27. IMPLEMENT_DYNCREATE(COAMFrameWnd, CFrameWnd)
  28. BEGIN_MESSAGE_MAP(COAMFrameWnd, CFrameWnd)
  29. ON_WM_INITMENU()
  30. //{{AFX_MSG_MAP(COAMFrameWnd)
  31. // ON_COMMAND(ID_SETAGENT, OnSetagent)
  32. //}}AFX_MSG_MAP
  33. END_MESSAGE_MAP()
  34. /////////////////////////////////////////////////////////////////////////////
  35. // COAMFrameWnd message handlers
  36. // dwDockBarMap
  37. DWORD COAMFrameWnd::dwDockBarMap[4][2] =
  38. {
  39. { AFX_IDW_DOCKBAR_TOP,      CBRS_TOP    },
  40. { AFX_IDW_DOCKBAR_BOTTOM,   CBRS_BOTTOM },
  41. { AFX_IDW_DOCKBAR_LEFT,     CBRS_LEFT   },
  42. { AFX_IDW_DOCKBAR_RIGHT,    CBRS_RIGHT  },
  43. };
  44. void COAMFrameWnd::DockControlBarLeftOf(CControlBar* Bar, CControlBar* LeftOf)
  45. {
  46. CRect rect;
  47. DWORD dw;
  48. UINT n;
  49. // get MFC to adjust the dimensions of all docked ToolBars
  50. // so that GetWindowRect will be accurate
  51. RecalcLayout(TRUE);
  52. LeftOf->GetWindowRect(&rect);
  53. rect.OffsetRect(1,0);
  54. dw=LeftOf->GetBarStyle();
  55. n = 0;
  56. n = (dw&CBRS_ALIGN_TOP)  ? AFX_IDW_DOCKBAR_TOP : n;
  57. n = (dw&CBRS_ALIGN_BOTTOM && n==0) ? AFX_IDW_DOCKBAR_BOTTOM : n;
  58. n = (dw&CBRS_ALIGN_LEFT && n==0) ? AFX_IDW_DOCKBAR_LEFT : n;
  59. n = (dw&CBRS_ALIGN_RIGHT && n==0) ? AFX_IDW_DOCKBAR_RIGHT : n;
  60. // When we take the default parameters on rect, DockControlBar will dock
  61. // each Toolbar on a seperate line. By calculating a rectangle, we in effect
  62. // are simulating a Toolbar being dragged to that location and docked.
  63. DockControlBar(Bar,n,&rect);
  64. }
  65. void COAMFrameWnd::EnableDocking(DWORD dwDockStyle)
  66. {
  67. // must be CBRS_ALIGN_XXX or CBRS_FLOAT_MULTI only
  68. // ASSERT((dwDockStyle & ~(CBRS_ALIGN_ANY|CBRS_FLOAT_MULTI)) == 0);
  69. CFrameWnd::EnableDocking(dwDockStyle);
  70. for (int i = 0; i < 4; i++) {
  71. if (dwDockBarMap[i][1] & dwDockStyle & CBRS_ALIGN_ANY) {
  72. CDockBar* pDock = (CDockBar*)GetControlBar(dwDockBarMap[i][0]);
  73. // make sure the dock bar is of correct type
  74. if( pDock || !pDock->IsKindOf(RUNTIME_CLASS(COAMDockBar)) ) {
  75. BOOL bNeedDelete = ! pDock->m_bAutoDelete;
  76. pDock->m_pDockSite->RemoveControlBar(pDock);
  77. pDock->m_pDockSite = 0; // avoid problems in destroying the dockbar
  78. pDock->DestroyWindow();
  79. if( bNeedDelete )
  80. delete pDock;
  81. pDock = 0;
  82. }
  83. if( pDock == 0 ) {
  84. pDock = new COAMDockBar;
  85. if (!pDock->Create(this,
  86. WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_CHILD|WS_VISIBLE |
  87. dwDockBarMap[i][1], dwDockBarMap[i][0])) {
  88. AfxThrowResourceException();
  89. }
  90. }
  91. }
  92. }
  93. }
  94. void COAMFrameWnd::RecalcLayout(BOOL bNotify) 
  95. {
  96. CFrameWnd::RecalcLayout(bNotify);
  97. RecalcAllExcept(NULL);
  98. }
  99. void COAMFrameWnd::EnableDockingSizeBar(DWORD dwDockStyle)
  100. {
  101. // must be CBRS_ALIGN_XXX or CBRS_FLOAT_MULTI only
  102. // ASSERT((dwDockStyle & ~(CBRS_ALIGN_ANY|CBRS_FLOAT_MULTI)) == 0);
  103. m_pFloatingFrameClass = RUNTIME_CLASS(COAMMiniDockFrameWnd);
  104. for (int i = 0; i < 4; i++)
  105. {
  106. if (dwSizeBarMap[i][1] & dwDockStyle & CBRS_ALIGN_ANY)
  107. {
  108. COAMSizeDockBar* pDock = (COAMSizeDockBar*)GetControlBar(dwSizeBarMap[i][0]);
  109. if (pDock == NULL)
  110. {
  111. pDock = new COAMSizeDockBar;
  112. if( m_aInitialSize[i] )
  113. pDock->SetActualSize(m_aInitialSize[i]);
  114. if (!pDock->Create(this,
  115. WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_CHILD|WS_VISIBLE |
  116. dwSizeBarMap[i][1], dwSizeBarMap[i][0]))
  117. {
  118. AfxThrowResourceException();
  119. }
  120. }
  121. }
  122. }
  123. }
  124. void COAMFrameWnd::RecalcAllExcept(COAMSizeDockBar *pBar)
  125. {
  126. for (int i = 0; i < 4; i++)
  127. {
  128. COAMSizeDockBar* pDock = (COAMSizeDockBar*)GetControlBar(dwSizeBarMap[i][0]);
  129. if (pDock != NULL && pDock != pBar)
  130. {
  131. pDock->CalcSizeBarLayout();
  132. }
  133. }
  134. }
  135. void COAMFrameWnd::SetInitialSize(int top, int bottom, int left, int right)
  136. {
  137. m_aInitialSize[2] = top;
  138. m_aInitialSize[3] = bottom;
  139. m_aInitialSize[0] = left;
  140. m_aInitialSize[1] = right;
  141. }
  142. void COAMFrameWnd::DockSizeBar(CControlBar * pBar,COAMSizeDockBar *pDockBar, LPRECT lpRect)
  143. {
  144. // ASSERT(pBar != NULL);
  145. // ASSERT(pBar->m_pDockContext != NULL);
  146. if( pDockBar == NULL )
  147. {
  148. for (int i = 0; i < 4; i++)
  149. {
  150. if ((dwSizeBarMap[i][1] & CBRS_ALIGN_ANY) ==
  151. (pBar->m_dwStyle & CBRS_ALIGN_ANY))
  152. {
  153. pDockBar = (COAMSizeDockBar*)GetControlBar(dwSizeBarMap[i][0]);
  154. // ASSERT(pDockBar != NULL);
  155. break;
  156. }
  157. }
  158. }
  159. // ASSERT(pDockBar != NULL);
  160. // ASSERT(m_listControlBars.Find(pBar) != NULL);
  161. // ASSERT(pBar->m_pDockSite == this);
  162. ((COAMControlBar*)pBar)->Normalize();
  163. pDockBar->DockControlBar(pBar, lpRect);
  164. }