MPCStatusBar.cpp
上传用户:rubberdam
上传日期:2007-01-10
资源大小:43k
文件大小:6k
源码类别:

状态条

开发平台:

Visual C++

  1. //
  2. // MPCStatusBar.cpp
  3. // 
  4. // (c) Pierre MELLINAND
  5. //
  6. // History
  7. // --------
  8. // v 1.0
  9. // June 1998: Created classes with names starting with XFX...
  10. // v 1.1
  11. // October 19, 1999 void MPCStatusBar::RemovePane(int nPaneID) added
  12. // BOOL MPCStatusBar::AddIndicator( int position, UINT paneID ) 
  13. // corrected bug (std text disappeared when AddIndicator called)
  14. // BOOL MPCStatusBar::GetStatusPane(int nIndex, MPCStatusBarPane & xfxpane)
  15. // GetPaneText( ) wasnt called
  16. // Renamed classes with prefix MPC..
  17. // Added parameter 'BOOL bAutodeleteControl' to method AddControl()
  18. //
  19. #include "StdAfx.h"
  20. #include <afxtempl.h>
  21. #include "MPCStatusBar.h"
  22. #ifdef _DEBUG
  23. #define new DEBUG_NEW
  24. #undef THIS_FILE
  25. static char THIS_FILE[] = __FILE__;
  26. #endif
  27. ////////////////////////////////////////////////////////////////////////
  28. // MPCStatusBarPaneControlInfo
  29. IMPLEMENT_DYNCREATE(MPCStatusBarPaneControlInfo,CObject)
  30. MPCStatusBarPaneControlInfo::MPCStatusBarPaneControlInfo()
  31. {
  32. m_hWnd = NULL;
  33. m_bAutodelete=TRUE;
  34. }
  35. ///////////////////////////////////////////////////////////////////////////////////
  36. // MPCStatusBarPane
  37. MPCStatusBarPane::MPCStatusBarPane(MPCStatusBarPane & xfxpane )
  38. {
  39. *this = xfxpane;
  40. }
  41. MPCStatusBarPane& MPCStatusBarPane::operator=(MPCStatusBarPane & xfxpane )
  42. {
  43. nID = xfxpane.nID;
  44. cxText = xfxpane.cxText;
  45. nStyle = xfxpane.nStyle;
  46. strText = xfxpane.strText;
  47. return *this;
  48. }
  49. MPCStatusBarPane::MPCStatusBarPane()
  50. {
  51. }
  52. ////////////////////////////////////////////////////////////////////////
  53. // MPCStatusBar
  54. IMPLEMENT_DYNCREATE(MPCStatusBar,CStatusBar)
  55. BEGIN_MESSAGE_MAP(MPCStatusBar, CStatusBar)
  56. //{{AFX_MSG_MAP(MPCStatusBar)
  57. ON_WM_SIZE()
  58. //}}AFX_MSG_MAP
  59. END_MESSAGE_MAP()
  60. MPCStatusBar::~MPCStatusBar()
  61. {
  62. for( int i = 0; i < m_aPans.GetSize(); i++ )
  63. {
  64. if( m_aPans[i]->m_hWnd && ::IsWindow(m_aPans[i]->m_hWnd->m_hWnd) )
  65. m_aPans[i]->m_hWnd->CloseWindow();
  66. if( m_aPans[i]->m_bAutodelete )
  67. {
  68. delete m_aPans[i]->m_hWnd;
  69. }
  70. delete m_aPans[i];
  71. }
  72. }
  73. void MPCStatusBar::OnSize(UINT nType, int cx, int cy) 
  74. {
  75. CStatusBar::OnSize(nType, cx, cy);
  76. PositionControls();
  77. }
  78. void MPCStatusBar::PositionControls()
  79. {
  80. int h,v,s;
  81. GetStatusBarCtrl( ).GetBorders( h, v, s ) ;
  82. for(int i = 0; i < m_aPans.GetSize(); i++ )
  83. {
  84. CRect rect;
  85. int index = CommandToIndex( m_aPans[i]->m_nPaneID );
  86. GetItemRect(index,rect);
  87. if( GetPaneStyle(index) & SBPS_NOBORDERS == SBPS_NOBORDERS)
  88. m_aPans[i]->m_hWnd->MoveWindow(rect);
  89. else
  90. {
  91. rect.top+=v;
  92. rect.bottom-=v;
  93. rect.left+=h+s;
  94. rect.right-=(h+s);
  95. m_aPans[i]->m_hWnd->MoveWindow(rect);
  96. }
  97. }
  98. }
  99. MPCStatusBarPaneControlInfo * MPCStatusBar::GetPanControl(int nPaneID)
  100. {
  101. for(int i = 0; i < m_aPans.GetSize(); i++ )
  102. {
  103. if( m_aPans[i]->m_nPaneID == nPaneID )
  104. return m_aPans[i];
  105. }
  106. return NULL;
  107. }
  108. BOOL MPCStatusBar::AddControl(CWnd * pWnd, int paneID, BOOL bAutodeleteControl)
  109. {
  110. MPCStatusBarPaneControlInfo * pPanInfo = GetPanControl(paneID);
  111. if( pPanInfo )
  112. return FALSE;
  113. int idx = CommandToIndex( paneID ) ;
  114. if( idx == -1 )
  115. return FALSE;
  116. MPCStatusBarPaneControlInfo * pPan = new MPCStatusBarPaneControlInfo;
  117. pPan->m_nPaneID =  paneID;
  118. pPan->m_hWnd    =  pWnd;
  119. pPan->m_bAutodelete = bAutodeleteControl;
  120. m_aPans.Add(pPan);
  121. PositionControls();
  122. Invalidate(TRUE);
  123. return TRUE;
  124. }
  125. void MPCStatusBar::SetPaneWidth(int index, int cxWidth)
  126. {
  127. UINT nID,nStyle;
  128. int width;
  129. GetPaneInfo(index,nID,nStyle,width);
  130. SetPaneInfo(index,nID,nStyle,cxWidth);
  131. }
  132. BOOL MPCStatusBar::GetStatusPane(int nIndex, MPCStatusBarPane & xfxpane)
  133. {
  134. if( nIndex < m_nCount  && nIndex >= 0 )
  135. {
  136. GetPaneInfo( nIndex,  xfxpane.nID, xfxpane.nStyle, xfxpane.cxText ) ;
  137. GetPaneText( nIndex , xfxpane.strText );
  138. return TRUE;
  139. }
  140. return FALSE;
  141. }
  142. BOOL MPCStatusBar::AddIndicator( int position, UINT paneID )
  143. {
  144. CArray<MPCStatusBarPane,MPCStatusBarPane> arPanes;
  145. MPCStatusBarPane statusPane;
  146. int i;
  147. i = 0;
  148. while( GetStatusPane(i,statusPane) )
  149. {
  150. arPanes.Add( statusPane );
  151. i++;
  152. }
  153. if( position < 0 )
  154. position = 0;
  155. if( position > arPanes.GetSize() )
  156. position = arPanes.GetSize()-1;
  157. for(i = 0; i < arPanes.GetSize(); i ++ )
  158. {
  159. if( paneID == arPanes[i].nID )
  160. {
  161. TRACE("XFXStatusBar::AddIndicator(): Pane ID already exists n");
  162. return FALSE;
  163. }
  164. }
  165. MPCStatusBarPane new_statusPane;
  166. new_statusPane.nID = paneID;
  167. if( arPanes.GetSize() )
  168. arPanes.InsertAt(position,new_statusPane);
  169. else
  170. arPanes.Add(new_statusPane);
  171. UINT * pIndicators = new UINT[arPanes.GetSize()];
  172. for(i=0;i<arPanes.GetSize();i++)
  173. pIndicators[i]=arPanes[i].nID;
  174. SetRedraw(FALSE);
  175. SetIndicators(pIndicators,arPanes.GetSize());
  176. // Replace infos of indicators ..
  177. for(i = 0; i < arPanes.GetSize(); i++ )
  178. {
  179. if( arPanes[i].nID != paneID )
  180. {
  181. SetPaneInfo(i,arPanes[i].nID,arPanes[i].nStyle,arPanes[i].cxText);
  182. SetPaneText(i,arPanes[i].strText);
  183. }
  184. else
  185. {
  186. SetPaneWidth(i,50);
  187. SetPaneText(i,arPanes[i].strText);
  188. }
  189. }
  190. delete pIndicators;
  191. SetRedraw(TRUE);
  192. PositionControls();
  193. Invalidate(TRUE);
  194. return TRUE;
  195. }
  196. void MPCStatusBar::RemovePane(int nPaneID)
  197. {
  198. SetRedraw(FALSE);
  199. CWnd * pwnd = NULL;
  200. for( int i = 0; i < m_aPans.GetSize(); i++ )
  201. {
  202. if( m_aPans[i]->m_nPaneID == nPaneID )
  203. {
  204. if( m_aPans[i]->m_bAutodelete )
  205. pwnd = m_aPans[i]->m_hWnd;
  206. delete m_aPans[i];
  207. m_aPans.RemoveAt(i);
  208. break;
  209. }
  210. }
  211. if( pwnd )
  212. {
  213. pwnd->DestroyWindow();
  214. delete pwnd;
  215. }
  216. CArray<MPCStatusBarPane,MPCStatusBarPane> arPanes;
  217. MPCStatusBarPane statusPane;
  218. i = 0;
  219. while( GetStatusPane(i,statusPane) )
  220. {
  221. if( statusPane.nID != (UINT)nPaneID )
  222. arPanes.Add( statusPane );
  223. i++;
  224. }
  225. // Now remove the indicator
  226. UINT * pIndicators = new UINT[arPanes.GetSize()];
  227. for(i=0;i<arPanes.GetSize();i++)
  228. pIndicators[i]=arPanes[i].nID;
  229. SetIndicators(pIndicators,arPanes.GetSize());
  230. // Replace infos of indicators ..
  231. for(i = 0; i < arPanes.GetSize(); i++ )
  232. {
  233. SetPaneInfo(i,arPanes[i].nID,arPanes[i].nStyle,arPanes[i].cxText);
  234. SetPaneText(i,arPanes[i].strText);
  235. }
  236. delete pIndicators;
  237. SetRedraw(TRUE);
  238. PositionControls();
  239. Invalidate(TRUE);
  240. }
  241. // End of file ///////////////////////////////////////////////////////////////