ExtStatusControlBar.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:9k
源码类别:

CA认证

开发平台:

Visual C++

  1. // This is part of the Professional User Interface Suite library.
  2. // Copyright (C) 2001-2004 FOSS Software, Inc.
  3. // All rights reserved.
  4. //
  5. // http://www.prof-uis.com
  6. // http://www.fossware.com
  7. // mailto:foss@fossware.com
  8. // Warranties and Disclaimers:
  9. // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND
  10. // INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
  11. // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.o
  12. // IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT,
  13. // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES,
  14. // INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA,
  15. // INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE
  16. // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  17. // ExtStatusControlBar.cpp : implementation file
  18. //
  19. #include "stdafx.h"
  20. #include "ExtStatusControlBar.h"
  21. #ifdef _DEBUG
  22. #define new DEBUG_NEW
  23. #undef THIS_FILE
  24. static char THIS_FILE[] = __FILE__;
  25. #endif
  26. /////////////////////////////////////////////////////////////////////////////
  27. // CExtStatusControlBar
  28. CExtStatusControlBar::CExtStatusControlBar()
  29. {
  30. }
  31. CExtStatusControlBar::~CExtStatusControlBar()
  32. {
  33. for ( int i = 0; i < m_arrPaneControls.GetSize(); i++ ){
  34. if( m_arrPaneControls[i]->hWnd && ::IsWindow(m_arrPaneControls[i]->hWnd) ) {
  35. ::ShowWindow(m_arrPaneControls[i]->hWnd, SW_HIDE); 
  36. if( m_arrPaneControls[i]->bAutoDestroy ) {
  37. ::DestroyWindow(m_arrPaneControls[i]->hWnd);
  38. }
  39. }
  40. _STATUSBAR_PANE_CTRL_ *pPaneCtrl = m_arrPaneControls[i];
  41. if( pPaneCtrl )
  42. delete pPaneCtrl;
  43. }
  44. }
  45. BEGIN_MESSAGE_MAP(CExtStatusControlBar, CStatusBar)
  46. //{{AFX_MSG_MAP(CExtStatusControlBar)
  47. ON_WM_CREATE()
  48. //}}AFX_MSG_MAP
  49. END_MESSAGE_MAP()
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CExtStatusControlBar message handlers
  52. //////////////////////////////////////////////////////////////////////////
  53. int CExtStatusControlBar::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  54. {
  55. if( CStatusBar::OnCreate(lpCreateStruct) == -1 )
  56. return -1;
  57. return 0;
  58. }
  59. //////////////////////////////////////////////////////////////////////////
  60. LRESULT CExtStatusControlBar::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  61. {
  62. LRESULT lResult =CStatusBar::WindowProc(message, wParam, lParam);
  63. if( message == WM_SIZE ){
  64. RepositionControls();
  65. }
  66. return lResult;
  67. }
  68. //////////////////////////////////////////////////////////////////////////
  69. void CExtStatusControlBar::RepositionControls()
  70. {
  71. HDWP _hDWP = ::BeginDeferWindowPos( m_arrPaneControls.GetSize() );
  72. CRect rcClient;
  73. GetClientRect(&rcClient);
  74. for (int i = 0; i < m_arrPaneControls.GetSize(); i++ )
  75. {
  76. int   iIndex  = CommandToIndex(m_arrPaneControls[i]->nID);
  77. HWND hWnd    = m_arrPaneControls[i]->hWnd;
  78. CRect rcPane;
  79. GetItemRect(iIndex, &rcPane);
  80. // CStatusBar::GetItemRect() sometimes returns invalid size 
  81. // of the last pane - we will re-compute it
  82. int cx = ::GetSystemMetrics( SM_CXEDGE );
  83. DWORD dwPaneStyle = GetPaneStyle( iIndex );
  84. if( iIndex == (m_nCount-1) )
  85. {
  86. if( (dwPaneStyle & SBPS_STRETCH ) == 0 )
  87. {
  88. UINT nID, nStyle;
  89. int  cxWidth;
  90. GetPaneInfo( iIndex, nID, nStyle, cxWidth );
  91. rcPane.right = rcPane.left + cxWidth + cx*3;
  92. } // if( (dwPaneStyle & SBPS_STRETCH ) == 0 )
  93. else
  94. {
  95. CRect rcClient;
  96. GetClientRect( &rcClient );
  97. rcPane.right = rcClient.right;
  98. if( (GetStyle() & SBARS_SIZEGRIP) == SBARS_SIZEGRIP )
  99. {
  100. int cxSmIcon = ::GetSystemMetrics( SM_CXSMICON );
  101. rcPane.right -= cxSmIcon + cx;
  102. } // if( (GetStyle() & SBARS_SIZEGRIP) == SBARS_SIZEGRIP )
  103. } // else from if( (dwPaneStyle & SBPS_STRETCH ) == 0 )
  104. } // if( iIndex == (m_nCount-1) )
  105. if ((GetPaneStyle (iIndex) & SBPS_NOBORDERS) == 0){
  106. rcPane.DeflateRect(cx,cx);
  107. }else{
  108. rcPane.DeflateRect(cx,1,cx,1);
  109. }
  110. if (hWnd && ::IsWindow(hWnd)){
  111. _hDWP = ::DeferWindowPos(
  112. _hDWP, 
  113. hWnd, 
  114. NULL, 
  115. rcPane.left,
  116. rcPane.top, 
  117. rcPane.Width(), 
  118. rcPane.Height(),
  119. SWP_NOZORDER|SWP_NOOWNERZORDER|SWP_SHOWWINDOW
  120. );
  121. ::RedrawWindow(
  122. hWnd,
  123. NULL,
  124. NULL,
  125. RDW_INVALIDATE|RDW_UPDATENOW
  126. |RDW_ERASE|RDW_ERASENOW
  127. );
  128. } // if (hWnd && ::IsWindow(hWnd)){ 
  129. }
  130. VERIFY( ::EndDeferWindowPos( _hDWP ) );
  131. };
  132. //////////////////////////////////////////////////////////////////////////
  133. BOOL CExtStatusControlBar::AddPane(
  134.  UINT nID, // ID of the  pane
  135.  int nIndex // index of the pane
  136.  )
  137. {
  138. if (nIndex < 0 || nIndex > m_nCount){
  139. ASSERT(FALSE);
  140. return FALSE;
  141. }
  142. if (CommandToIndex(nID) != -1){
  143. ASSERT(FALSE);
  144. return FALSE;
  145. }
  146. CArray<_STATUSBAR_PANE_*,_STATUSBAR_PANE_*> arrPanesTmp;
  147. int iIndex = 0;
  148. for (iIndex = 0; iIndex < m_nCount+1; iIndex++)
  149. {
  150. _STATUSBAR_PANE_* pNewPane = new _STATUSBAR_PANE_;
  151. if (iIndex == nIndex){
  152. pNewPane->nID    = nID;
  153. pNewPane->nStyle = SBPS_NORMAL;
  154. }else{
  155. int idx = iIndex;
  156. if (iIndex > nIndex) idx--;
  157. _STATUSBAR_PANE_* pOldPane  = GetPanePtr(idx);
  158. pNewPane->cxText  = pOldPane->cxText;
  159. pNewPane->nFlags  = pOldPane->nFlags;
  160. pNewPane->nID     = pOldPane->nID;
  161. pNewPane->nStyle  = pOldPane->nStyle;
  162. pNewPane->strText = pOldPane->strText;
  163. }
  164. arrPanesTmp.Add(pNewPane);
  165. }
  166. int nPanesCount = arrPanesTmp.GetSize();
  167. UINT* lpIDArray = new UINT[ nPanesCount ];
  168. for (iIndex = 0; iIndex < nPanesCount; iIndex++) {
  169. lpIDArray[iIndex] = arrPanesTmp[iIndex]->nID;
  170. }
  171. // set the indicators 
  172. SetIndicators(lpIDArray, nPanesCount);
  173. // free memory
  174. for (iIndex = 0; iIndex < nPanesCount; iIndex++){
  175. _STATUSBAR_PANE_* pPane = arrPanesTmp[iIndex];
  176. if (iIndex != nIndex)
  177. PaneInfoSet(iIndex, pPane);
  178. if(pPane) 
  179. delete pPane;
  180. }
  181. arrPanesTmp.RemoveAll();
  182. if(lpIDArray) 
  183. delete []lpIDArray;
  184. RepositionControls();
  185. return TRUE;
  186. }
  187. //////////////////////////////////////////////////////////////////////////
  188. BOOL CExtStatusControlBar::RemovePane(
  189. UINT nID // ID of the pane
  190. )
  191. {
  192. if ( CommandToIndex(nID) == -1 || m_nCount == 1 ){
  193. ASSERT(FALSE);
  194. return FALSE;
  195. }
  196. CArray<_STATUSBAR_PANE_*,_STATUSBAR_PANE_*> arrPanesTmp;
  197. int nIndex;
  198. for (nIndex = 0; nIndex < m_nCount; nIndex++)
  199. {
  200. _STATUSBAR_PANE_* pOldPane = GetPanePtr(nIndex);
  201. if (pOldPane->nID == nID)
  202. continue;
  203. _STATUSBAR_PANE_* pNewPane = new _STATUSBAR_PANE_;
  204. pNewPane->cxText  = pOldPane->cxText;
  205. pNewPane->nFlags  = pOldPane->nFlags;
  206. pNewPane->nID     = pOldPane->nID;
  207. pNewPane->nStyle  = pOldPane->nStyle;
  208. pNewPane->strText = pOldPane->strText;
  209. arrPanesTmp.Add(pNewPane);
  210. }
  211. UINT* lpIDArray = new UINT[arrPanesTmp.GetSize()];
  212. for (nIndex = 0; nIndex < arrPanesTmp.GetSize(); nIndex++) {
  213. lpIDArray[nIndex] = arrPanesTmp[nIndex]->nID;
  214. }
  215. // set the indicators
  216. SetIndicators(lpIDArray, arrPanesTmp.GetSize());
  217. // free memory
  218. for (nIndex = 0; nIndex < arrPanesTmp.GetSize(); nIndex++){
  219. _STATUSBAR_PANE_* pPane = arrPanesTmp[nIndex];
  220. PaneInfoSet(nIndex, pPane);
  221. if(pPane) 
  222. delete pPane;
  223. }
  224. for ( int i = 0; i < m_arrPaneControls.GetSize(); i++ ){
  225. if (m_arrPaneControls[i]->nID == nID){
  226. if( m_arrPaneControls[i]->hWnd && ::IsWindow(m_arrPaneControls[i]->hWnd) ) {
  227. ::ShowWindow(m_arrPaneControls[i]->hWnd, SW_HIDE); 
  228. if( m_arrPaneControls[i]->bAutoDestroy ) {
  229. ::DestroyWindow(m_arrPaneControls[i]->hWnd);
  230. }
  231. }
  232. _STATUSBAR_PANE_CTRL_ *pPaneCtrl = m_arrPaneControls[i];
  233. if( pPaneCtrl )
  234. delete pPaneCtrl;
  235. m_arrPaneControls.RemoveAt(i);
  236. break;
  237. }
  238. }
  239. arrPanesTmp.RemoveAll();
  240. if(lpIDArray) 
  241. delete []lpIDArray;
  242. RepositionControls();
  243. return TRUE;
  244. }
  245. //////////////////////////////////////////////////////////////////////////
  246. BOOL CExtStatusControlBar::AddPaneControl(HWND hWnd, UINT nID, BOOL bAutoDestroy)
  247. {
  248. if (CommandToIndex (nID) == -1) {
  249. return FALSE;
  250. }
  251. _STATUSBAR_PANE_CTRL_* pPaneCtrl = new _STATUSBAR_PANE_CTRL_;
  252. pPaneCtrl->nID         = nID;
  253. pPaneCtrl->hWnd        = hWnd;
  254. pPaneCtrl->bAutoDestroy = bAutoDestroy;
  255. m_arrPaneControls.Add(pPaneCtrl);
  256. RepositionControls();
  257. return TRUE;
  258. }
  259. //////////////////////////////////////////////////////////////////////////
  260. BOOL CExtStatusControlBar::PaneInfoGet(int nIndex, _STATUSBAR_PANE_* pPane)
  261. {
  262. if( nIndex < m_nCount  && nIndex >= 0 )
  263. {
  264. GetPaneInfo( nIndex,  pPane->nID, pPane->nStyle, pPane->cxText );
  265. CString strPaneText;
  266. GetPaneText( nIndex , strPaneText );
  267. pPane->strText = LPCTSTR(strPaneText);
  268. return TRUE;
  269. }
  270. return FALSE;
  271. }
  272. //////////////////////////////////////////////////////////////////////////
  273. BOOL CExtStatusControlBar::PaneInfoSet(int nIndex, _STATUSBAR_PANE_* pPane)
  274. {
  275. if( nIndex < m_nCount  && nIndex >= 0 ){
  276. SetPaneInfo( nIndex, pPane->nID, pPane->nStyle, pPane->cxText );
  277. SetPaneText( nIndex, LPCTSTR( pPane->strText) );
  278. return TRUE;
  279. }
  280. return FALSE;
  281. }