ExtStatusControlBar.cpp
上传用户:sesekoo
上传日期:2020-07-18
资源大小:21543k
文件大小:52k
源码类别:

界面编程

开发平台:

Visual C++

  1. // This is part of the Professional User Interface Suite library.
  2. // Copyright (C) 2001-2009 FOSS Software, Inc.
  3. // All rights reserved.
  4. //
  5. // http://www.prof-uis.com
  6. // mailto:support@prof-uis.com
  7. //
  8. // This source code can be used, modified and redistributed
  9. // under the terms of the license agreement that is included
  10. // in the Professional User Interface Suite package.
  11. //
  12. // Warranties and Disclaimers:
  13. // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND
  14. // INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  16. // IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT,
  17. // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES,
  18. // INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA,
  19. // INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE
  20. // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  21. #include "stdafx.h"
  22. #ifndef __EXT_MFC_NO_STATUSBAR
  23. #if (!defined __EXT_STATUSCONTROLBAR_H)
  24. #include <ExtStatusControlBar.h>
  25. #endif
  26. #if (!defined __EXTDOCKBAR_H)
  27. #include "ExtDockBar.h"
  28. #endif
  29. #if (!defined __EXT_PAINT_MANAGER_H)
  30. #include <ExtPaintManager.h>
  31. #endif
  32. #if _MFC_VER < 0x700
  33. #include <../src/AfxImpl.h>
  34. #else
  35. #include <../src/mfc/AfxImpl.h>
  36. #endif
  37. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  38. #if (!defined __EXTCUSTOMIZE_H)
  39. #include <ExtCustomize.h>
  40. #endif
  41. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  42. #if (!defined __EXT_MEMORY_DC_H)
  43. #include <../src/ExtMemoryDC.h>
  44. #endif
  45. #if (!defined __EXT_POPUP_MENU_WND_H)
  46. #include <ExtPopupMenuWnd.h>
  47. #endif
  48. #ifdef _DEBUG
  49. #define new DEBUG_NEW
  50. #undef THIS_FILE
  51. static char THIS_FILE[] = __FILE__;
  52. #endif
  53. #if (!defined SBPF_UPDATE)
  54. #define SBPF_UPDATE 0x0001  // pending update of text
  55. #endif // _DEBUG
  56. /////////////////////////////////////////////////////////////////////////////
  57. // CExtStatusControlBar
  58. IMPLEMENT_DYNCREATE( CExtStatusControlBar, CStatusBar )
  59. IMPLEMENT_CExtPmBridge_MEMBERS( CExtStatusControlBar );
  60. CExtStatusControlBar::CExtStatusControlBar()
  61. : m_bOuterRectInFirstBand( false )
  62. , m_bCompleteRepaint( true )
  63. , m_bDrawPaneSeparatorsInsteadOfBorders( false ) // default status bar control behavior
  64. , m_bHideTextOnDisabledPanes( true ) // default status bar control behavior
  65. , m_bDoNotPaintIcons( false )
  66. , m_nDrawPaneTextFlags( DT_SINGLELINE|DT_LEFT|DT_VCENTER ) // default status bar control behavior
  67. , m_bLockPainting( false )
  68. , m_nAdvancedTipStyle( INT(CExtPopupMenuTipWnd::__ETS_RECTANGLE_NO_ICON) )
  69. {
  70. m_clrStatusBk = (COLORREF)(-1);
  71. PmBridge_Install();
  72. }
  73. CExtStatusControlBar::~CExtStatusControlBar()
  74. {
  75. PmBridge_Uninstall();
  76. _RemovePanesImpl();
  77. }
  78. void CExtStatusControlBar::PostNcDestroy()
  79. {
  80. _RemovePanesImpl();
  81. CStatusBar::PostNcDestroy();
  82. }
  83. void CExtStatusControlBar::_RemovePanesImpl()
  84. {
  85. INT nCount = INT( m_arrPaneControls.GetSize() );
  86. if( nCount == 0 )
  87. return;
  88. CList < UINT, UINT > _listCtrlIDs( nCount );
  89.   for( INT i = 0; i < nCount; i++ )
  90.   _listCtrlIDs.AddTail( UINT( m_arrPaneControls[i]->nID ) );
  91. for( POSITION pos = _listCtrlIDs.GetHeadPosition(); pos != NULL; )
  92. {
  93. UINT nID = _listCtrlIDs.GetNext( pos );
  94. RemovePaneControl( nID );
  95. }
  96. }
  97. bool CExtStatusControlBar::OnQueryDrawPaneSeparatorsInsteadOfBorders() const
  98. {
  99. ASSERT_VALID( this );
  100. if( m_bCompleteRepaint
  101. && PmBridge_GetPM()->StatusBar_QuerySkinSupport(this)
  102. )
  103. return true;
  104. return m_bDrawPaneSeparatorsInsteadOfBorders;
  105. }
  106. BEGIN_MESSAGE_MAP(CExtStatusControlBar, CStatusBar)
  107. //{{AFX_MSG_MAP(CExtStatusControlBar)
  108. ON_WM_PAINT()
  109. ON_WM_NCPAINT()
  110. ON_WM_CREATE()
  111. ON_WM_CONTEXTMENU()
  112. ON_WM_ERASEBKGND()
  113. ON_WM_SIZE()
  114. ON_WM_MOUSEMOVE()
  115. ON_WM_CANCELMODE()
  116. //}}AFX_MSG_MAP
  117. ON_MESSAGE( WM_SIZEPARENT, OnSizeParent )
  118. ON_WM_SYSCOLORCHANGE()
  119. __EXT_MFC_SAFE_ON_WM_SETTINGCHANGE()
  120. ON_MESSAGE(WM_DISPLAYCHANGE, OnDisplayChange)
  121. ON_MESSAGE(__ExtMfc_WM_THEMECHANGED, OnThemeChanged)
  122. __EXT_MFC_ON_WM_NCHITTEST()
  123. END_MESSAGE_MAP()
  124. /////////////////////////////////////////////////////////////////////////////
  125. // CExtStatusControlBar message handlers
  126. void CExtStatusControlBar::OnPaint() 
  127. {
  128. ASSERT_VALID( this );
  129. if( m_bLockPainting ) 
  130. return;
  131. if( !m_bCompleteRepaint )
  132. {
  133. Default();
  134. return;
  135. }
  136. CPaintDC dcPaint( this );
  137. DoPaint( &dcPaint );
  138. }
  139. void CExtStatusControlBar::DoPaint( CDC * pDC )
  140. {
  141. ASSERT_VALID( this );
  142. ASSERT_VALID( pDC );
  143. // XP painting & last pane size fixed by Dmitry Yakovlev
  144. _SyncStatusBarColors();
  145. CRect rcClient;
  146. GetClientRect( &rcClient );
  147. CExtPaintManager::stat_ExcludeChildAreas(
  148. *pDC,
  149. GetSafeHwnd(),
  150. CExtPaintManager::stat_DefExcludeChildAreaCallback
  151. );
  152. CExtMemoryDC dc(
  153. pDC,
  154. &rcClient
  155. );
  156. UpdateAllPanes( FALSE, TRUE );
  157. // erase client area with the current color/gradient
  158. CRect rcFill( rcClient );
  159. rcFill.left = rcFill.top = 0;
  160. rcFill.right  -= rcClient.left;
  161. rcFill.bottom -= rcClient.top;
  162. OnPaintEntireBackground( dc, rcFill );
  163. // pre-compute gripper rect, exclude it's area
  164. CRect rcGrip( 0, 0, 0, 0 );
  165. CWnd * pWndParentStatus = GetParent(); // GetTopLevelParent();
  166. if( pWndParentStatus != NULL )
  167. {
  168. WINDOWPLACEMENT _wp;
  169. ::memset( (void*)&_wp, 0, sizeof(WINDOWPLACEMENT) );
  170. _wp.length = sizeof(WINDOWPLACEMENT);
  171. pWndParentStatus->GetWindowPlacement( &_wp );
  172. if( _wp.showCmd != SW_SHOWMAXIMIZED
  173. //&& (pWndParentStatus->GetStyle()&WS_BORDER) != 0
  174. )
  175. {
  176. MINMAXINFO _mmi;
  177. ::memset( &_mmi, 0, sizeof(MINMAXINFO) );
  178. CExtPaintManager::monitor_parms_t _mp;
  179. CExtPaintManager::stat_GetMonitorParms( _mp, (CWnd*)pWndParentStatus );
  180. _mmi.ptMaxPosition.x = _mp.m_rcWorkArea.left;
  181. _mmi.ptMaxPosition.y = _mp.m_rcWorkArea.top;
  182. _mmi.ptMaxTrackSize.x = _mp.m_rcWorkArea.Width(); // ::GetSystemMetrics( SM_CXMAXTRACK );
  183. _mmi.ptMaxTrackSize.y = _mp.m_rcWorkArea.Height(); // ::GetSystemMetrics( SM_CYMAXTRACK );
  184. _mmi.ptMinTrackSize.x = ::GetSystemMetrics( SM_CXMINTRACK );
  185. _mmi.ptMinTrackSize.y = ::GetSystemMetrics( SM_CYMINTRACK );
  186. _mmi.ptMaxSize.x = _mmi.ptMaxTrackSize.x;
  187. _mmi.ptMaxSize.y = _mmi.ptMaxTrackSize.y;
  188. if( ((CWnd*)pWndParentStatus)->SendMessage( WM_GETMINMAXINFO, 0, LPARAM(&_mmi) ) == 0 )
  189. {
  190. if( _mmi.ptMinTrackSize.x < _mmi.ptMaxTrackSize.x
  191. || _mmi.ptMinTrackSize.y < _mmi.ptMaxTrackSize.y
  192. )
  193. {
  194. GetClientRect( &rcGrip );
  195. rcGrip.left = rcGrip.right - ::GetSystemMetrics( SM_CXVSCROLL );
  196. dc.ExcludeClipRect( &rcGrip );
  197. }
  198. } // if( ((CWnd*)pWndParentStatus)->SendMessage( WM_GETMINMAXINFO, 0, LPARAM(&_mmi) ) == 0 )
  199. } // if( _wp.showCmd != SW_SHOWMAXIMIZED ...
  200. } // if( pWndParentStatus != NULL )
  201. CFont * pOldFont = NULL;
  202. int nOldBkMode = 0;
  203. COLORREF nOldTextColor = 0;
  204. if( m_bCompleteRepaint )
  205. {
  206. pOldFont = dc.SelectObject( &PmBridge_GetPM()->m_FontNormal );
  207. nOldBkMode = dc.SetBkMode( TRANSPARENT );
  208. nOldTextColor = dc.SetTextColor( m_clrPaneTextNormal );
  209. } // if( m_bCompleteRepaint )
  210. // re-paint borders/text/icons
  211. CRect rcPanePrev( 0, 0, 0, 0 );
  212. for( INT nPaneIdx = 0; nPaneIdx < m_nCount; nPaneIdx++ )
  213. {
  214. CRect rcPane;
  215. GetItemRect( nPaneIdx, &rcPane );
  216. // CStatusBar::GetItemRect() sometimes returns invalid size 
  217. // of the last pane - we will re-compute it
  218.         DWORD dwPaneStyle = GetPaneStyle( nPaneIdx );
  219. if( nPaneIdx == (m_nCount-1) )
  220. {
  221. int cx = ::GetSystemMetrics( SM_CXEDGE );
  222. if( (dwPaneStyle & SBPS_STRETCH ) == 0 )
  223. {
  224. UINT nID, nStyle;
  225. int  cxWidth;
  226. GetPaneInfo( nPaneIdx, nID, nStyle, cxWidth );
  227. rcPane.right = rcPane.left + cxWidth + cx*3;
  228. } // if( (dwPaneStyle & SBPS_STRETCH ) == 0 )
  229. else
  230. {
  231. CRect rcClient;
  232. GetClientRect( &rcClient );
  233. rcPane.right = rcClient.right;
  234. if( (GetStyle() & SBARS_SIZEGRIP) == SBARS_SIZEGRIP )
  235. {
  236. int cxSmIcon = ::GetSystemMetrics( SM_CXSMICON );
  237. rcPane.right -= cxSmIcon + cx;
  238. } // if( (GetStyle() & SBARS_SIZEGRIP) == SBARS_SIZEGRIP )
  239. } // else from if( (dwPaneStyle & SBPS_STRETCH ) == 0 )
  240. } // if( nPaneIdx == (m_nCount-1) )
  241. HICON hIcon = NULL;
  242. if( ! m_bDoNotPaintIcons )
  243. hIcon = (HICON)
  244. CStatusBar::GetStatusBarCtrl().
  245. SendMessage( SB_GETICON, nPaneIdx );
  246. CString sPaneText = GetPaneText( nPaneIdx );
  247. OnErasePaneBackground(
  248. dc,
  249. nPaneIdx,
  250. rcPane
  251. );
  252. OnPaintPane(
  253. dc,
  254. nPaneIdx,
  255. rcPane,
  256. dwPaneStyle,
  257. hIcon,
  258. sPaneText.IsEmpty()
  259. ? __EXT_MFC_SAFE_LPCTSTR( NULL )
  260. : __EXT_MFC_SAFE_LPCTSTR( LPCTSTR(sPaneText) )
  261. ,
  262. GetPaneDrawTextFlags(nPaneIdx) // m_nDrawPaneTextFlags
  263. );
  264. if( m_bCompleteRepaint
  265. && OnQueryDrawPaneSeparatorsInsteadOfBorders()
  266. && nPaneIdx > 0
  267. )
  268. OnPaintSeparator(
  269. dc,
  270. nPaneIdx,
  271. rcPanePrev,
  272. rcPane
  273. );
  274. rcPanePrev = rcPane;
  275. } // for( INT nPaneIdx = m_bOuterRectInFirstBand ? 0 : 1; nPaneIdx < m_nCount; nPaneIdx++ )
  276. if( m_bCompleteRepaint )
  277. {
  278. dc.SetTextColor( nOldTextColor );
  279. dc.SetBkMode( nOldBkMode );
  280. dc.SelectObject( pOldFont );
  281. } // if( m_bCompleteRepaint )
  282. // paint resizing gripper after all pane borders - this will allow gripper
  283. // to be on the top of all panes when window size is near its minimal size 
  284. if( !rcGrip.IsRectEmpty() )
  285. {
  286. dc.SelectClipRgn( NULL );
  287. OnPaintGripper( dc, rcGrip );
  288. } // if( !rcGrip.IsRectEmpty() )
  289. }
  290. bool CExtStatusControlBar::OnQueryGripperEnabledState() const
  291. {
  292. ASSERT_VALID( this );
  293. if( CExtPopupMenuWnd::g_bFullScreenMode )
  294. return false;
  295. CWnd * pWndParent = GetParent();
  296. if( pWndParent != NULL )
  297. {
  298. DWORD dwWndStyle = pWndParent->GetStyle();
  299. if( (dwWndStyle&WS_THICKFRAME) == 0 )
  300. return false;
  301. }
  302. return true;
  303. }
  304. //////////////////////////////////////////////////////////////////////////
  305. void CExtStatusControlBar::OnPaintGripper(
  306. CDC & dc,
  307. const CRect & rcGrip
  308. )
  309. {
  310. ASSERT_VALID( this );
  311. if( ! m_bCompleteRepaint )
  312. dc.FillSolidRect( &rcGrip, m_clrStatusBk );
  313. if( ! OnQueryGripperEnabledState() )
  314. return;
  315. CRect rcPaintGrip( rcGrip );
  316. rcPaintGrip.OffsetRect( -1, -1 );
  317. PmBridge_GetPM()->PaintResizingGripper(
  318. dc,
  319. rcPaintGrip,
  320. this
  321. );
  322. }
  323. //////////////////////////////////////////////////////////////////////////
  324. void CExtStatusControlBar::OnPaintSeparator(
  325. CDC & dc,
  326. int nPaneIdxAfterSep,
  327. const CRect & rcPaneBefore,
  328. const CRect & rcPaneAfter
  329. )
  330. {
  331. ASSERT_VALID( this );
  332. if( PmBridge_GetPM()->StatusBar_PaintSeparator(
  333. dc,
  334. nPaneIdxAfterSep,
  335. rcPaneBefore,
  336. rcPaneAfter,
  337. this
  338. )
  339. )
  340. return;
  341. CRect rcSeparator(
  342. rcPaneBefore.right,
  343. rcPaneAfter.top,
  344. rcPaneAfter.left,
  345. rcPaneAfter.bottom
  346. );
  347. rcSeparator.DeflateRect( 0, 1 );
  348. PmBridge_GetPM()->PaintSeparator(
  349. dc,
  350. rcSeparator,
  351. true,
  352. true,
  353. this,
  354. nPaneIdxAfterSep
  355. );
  356. }
  357. //////////////////////////////////////////////////////////////////////////
  358. void CExtStatusControlBar::OnPaintEntireBackground(
  359. CDC & dc,
  360. const CRect & rcBk
  361. )
  362. {
  363. ASSERT_VALID( this );
  364. if( m_bCompleteRepaint
  365. && PmBridge_GetPM()->StatusBar_EraseBackground(
  366. dc,
  367. rcBk,
  368. this
  369. )
  370. )
  371. return;
  372. bool bTransparent = false;
  373. if( m_bCompleteRepaint
  374. && PmBridge_GetPM()->GetCb2DbTransparentMode(this)
  375. )
  376. {
  377. if( PmBridge_GetPM()->PaintDockerBkgnd( true, dc, this ) )
  378. bTransparent = true;
  379. }
  380. if( ! bTransparent )
  381. dc.FillSolidRect( &rcBk, m_clrStatusBk );
  382. // invoke default handler
  383. if( ! m_bCompleteRepaint )
  384. CStatusBar::DefWindowProc( WM_PAINT, (WPARAM)dc.GetSafeHdc(), 0 );
  385. }
  386. //////////////////////////////////////////////////////////////////////////
  387. void CExtStatusControlBar::OnErasePaneBackground(
  388. CDC & dc,
  389. int nPaneIdx,
  390. const CRect & rcPane
  391. )
  392. {
  393. ASSERT_VALID( this );
  394. COLORREF clrBack = OnQueryPaneBkColor( nPaneIdx );
  395. if( clrBack != COLORREF(-1L) )
  396. {
  397. dc.FillSolidRect( rcPane, clrBack );
  398. return;
  399. }
  400. PmBridge_GetPM()->StatusBar_ErasePaneBackground(
  401. dc,
  402. nPaneIdx,
  403. rcPane,
  404. this
  405. );
  406. }
  407. //////////////////////////////////////////////////////////////////////////
  408. void CExtStatusControlBar::OnPaintPane(
  409. CDC & dc,
  410. int nPaneIdx,
  411. const CRect & rcPane,
  412. DWORD dwPaneStyle,
  413. HICON hIcon,
  414. __EXT_MFC_SAFE_LPCTSTR sPaneText, // by default it's text from the status bar control
  415. UINT nDrawTextFlags // by default m_nDrawPaneTextFlags is used
  416. )
  417. {
  418. ASSERT_VALID( this );
  419. if( m_bCompleteRepaint )
  420. {
  421. bool bDisabled = 
  422. ((dwPaneStyle & SBPS_DISABLED) != 0) ? true : false;
  423. COLORREF clrText = 
  424. OnQueryPaneTextColor( nPaneIdx, !bDisabled );
  425. if( PmBridge_GetPM()->StatusBar_PaintPane(
  426. dc,
  427. nPaneIdx,
  428. rcPane,
  429. dwPaneStyle,
  430. hIcon,
  431. sPaneText,
  432. nDrawTextFlags,
  433. clrText,
  434. this
  435. )
  436. )
  437. return;
  438. CRect rcText( rcPane );
  439. if( hIcon != NULL )
  440. {
  441. CExtCmdIcon _icon;
  442. _icon.AssignFromHICON( hIcon, true );
  443. CSize sizeIcon = _icon.GetSize();
  444. ASSERT( sizeIcon.cx > 0 && sizeIcon.cy > 0 );
  445. rcText.left += sizeIcon.cx + 1;
  446. _icon.Paint(
  447. PmBridge_GetPM(),
  448. dc,
  449. rcPane.left + 1,
  450. rcPane.top + ( rcPane.Height() - sizeIcon.cy ) / 2,
  451. -1,
  452. -1
  453. );
  454. } // if( hIcon != NULL )
  455. int nPaneTextLen =
  456. (sPaneText == NULL)
  457. ? int(0)
  458. : int(_tcslen(sPaneText))
  459. ;
  460. if( (!bDisabled)
  461. || (bDisabled && (!m_bHideTextOnDisabledPanes))
  462. && nPaneTextLen > 0
  463. )
  464. { // if text painting is allowed
  465. rcText.DeflateRect( 2, 0 );
  466. if( rcText.right > rcText.left )
  467. {
  468. COLORREF clrTextRestore = COLORREF(-1L);
  469. COLORREF clrTextCustom = OnQueryPaneTextColor( nPaneIdx, !bDisabled );
  470. if( clrTextCustom != COLORREF(-1L) )
  471. clrTextRestore = dc.SetTextColor( clrTextCustom );
  472. else if( bDisabled )
  473. clrTextRestore = dc.SetTextColor( m_clrPaneTextDisabled );
  474. dc.DrawText(
  475. LPCTSTR(sPaneText),
  476. nPaneTextLen,
  477. &rcText,
  478. nDrawTextFlags
  479. );
  480. if( clrTextRestore != COLORREF(-1L) )
  481. dc.SetTextColor( clrTextRestore );
  482. } // if( rcText.right > rcText.left )
  483. } // if text painting is allowed
  484. } // if( m_bCompleteRepaint )
  485. if( (!m_bCompleteRepaint)
  486. || ( m_bCompleteRepaint
  487. && (! OnQueryDrawPaneSeparatorsInsteadOfBorders() )
  488. )
  489. )
  490. { // if paint pane borders
  491. bool bDrawPaneBorder = false;
  492. if( nPaneIdx == 0 )
  493. {
  494. bDrawPaneBorder = m_bOuterRectInFirstBand;
  495. } // if( nPaneIdx == 0 )
  496. else
  497. {
  498. if( (dwPaneStyle&SBPS_NOBORDERS) == 0 )
  499. bDrawPaneBorder = true;
  500. } // else from if( nPaneIdx == 0 )
  501. if( bDrawPaneBorder )
  502. {
  503. // if( m_bCompleteRepaint )
  504. // {
  505. // dc.Draw3dRect( &rcPane, m_clrPaneRect, m_clrPaneRect );
  506. // } // if( m_bCompleteRepaint )
  507. // else
  508. {
  509. CExtPaintManager::PAINTCONTROLBARBORDERSDATA _pcbbd(
  510. this,
  511. CExtPaintManager::__CB_INNER_STATUSBAR_ITEM,
  512. 0,
  513. rcPane
  514. );
  515. PmBridge_GetPM()->PaintControlBarBorders( dc, _pcbbd );
  516. } // else from if( m_bCompleteRepaint )
  517. } // if( bDrawPaneBorder )
  518. } // if paint pane borders
  519. if( (!m_bCompleteRepaint) && g_PaintManager.m_UxTheme.IsAppThemed() )
  520. {
  521. CRect rcPaneInner( rcPane );
  522. rcPaneInner.DeflateRect( 1, 1 );
  523. dc.Draw3dRect( &rcPaneInner, m_clrStatusBk, m_clrStatusBk );
  524. } // if( (!m_bCompleteRepaint) && g_PaintManager.m_UxTheme.IsAppThemed() )
  525. }
  526. //////////////////////////////////////////////////////////////////////////
  527. COLORREF CExtStatusControlBar::OnQueryPaneTextColor(
  528. int nPaneIdx,
  529. bool bEnabled
  530. ) const
  531. {
  532. ASSERT_VALID( this );
  533. ASSERT( 0 <= nPaneIdx && nPaneIdx < GetPaneCount() );
  534. _ED_ _data;
  535. UINT nID = GetItemID( nPaneIdx );
  536. if( ! m_mapIdToExtData.Lookup( nID, _data ) )
  537. return COLORREF(-1L);
  538. return 
  539. bEnabled 
  540. ? _data.m_clrTextNormal 
  541. : _data.m_clrTextDisabled;
  542. }
  543. COLORREF CExtStatusControlBar::OnQueryPaneBkColor(
  544. int nPaneIdx
  545. ) const
  546. {
  547. ASSERT_VALID( this );
  548. ASSERT( 0 <= nPaneIdx && nPaneIdx < GetPaneCount() );
  549. _ED_ _data;
  550. UINT nID = GetItemID( nPaneIdx );
  551. if( ! m_mapIdToExtData.Lookup( nID, _data ) )
  552. return COLORREF(-1L);
  553. return _data.m_clrBack;
  554. }
  555. //////////////////////////////////////////////////////////////////////////
  556. void CExtStatusControlBar::OnNcPaint() 
  557. {
  558. ASSERT_VALID( this );
  559. if( !m_bCompleteRepaint )
  560. {
  561. Default();
  562. return;
  563. }
  564. _SyncStatusBarColors();
  565. CRect rcClient, rcWnd;
  566. GetClientRect( rcClient );
  567. ClientToScreen( rcClient );
  568. GetWindowRect( rcWnd );
  569. rcClient.OffsetRect( -rcWnd.TopLeft() );
  570. rcWnd.OffsetRect( -rcWnd.TopLeft() );
  571. CWindowDC dc( this );
  572. dc.ExcludeClipRect( &rcClient );
  573. CExtPaintManager::PAINTCONTROLBARBORDERSDATA _pcbbd(
  574. this,
  575. CExtPaintManager::__CB_OUTER_STATUSBAR,
  576. m_dwStyle,
  577. rcWnd
  578. );
  579. PmBridge_GetPM()->PaintControlBarBorders( dc, _pcbbd );
  580. }
  581. //////////////////////////////////////////////////////////////////////////
  582. void CExtStatusControlBar::DrawBorders( CDC * pDC, CRect& rc )
  583. {
  584. ASSERT_VALID( this );
  585. ASSERT_VALID( pDC );
  586. CExtPaintManager::PAINTCONTROLBARBORDERSDATA _pcbbd(
  587. this,
  588. CExtPaintManager::__CB_OUTER_STATUSBAR,
  589. m_dwStyle,
  590. rc
  591. );
  592. PmBridge_GetPM()->PaintControlBarBorders( *pDC, _pcbbd );
  593. }
  594. //////////////////////////////////////////////////////////////////////////
  595. void CExtStatusControlBar::_SyncStatusBarColors()
  596. {
  597. ASSERT_VALID( this );
  598. COLORREF clrStatusBkNeeded =
  599. PmBridge_GetPM()->GetColor(
  600. CExtPaintManager::CLR_3DFACE_OUT, this
  601. );
  602. if( m_clrStatusBk != clrStatusBkNeeded )
  603. {
  604. m_clrStatusBk = clrStatusBkNeeded;
  605. GetStatusBarCtrl().SetBkColor( m_clrStatusBk );
  606. } // if( m_clrStatusBk != clrStatusBkNeeded )
  607. m_clrGripper = PmBridge_GetPM()->GetColor( CExtPaintManager::CLR_TEXT_OUT, this );
  608. m_clrPaneTextNormal = PmBridge_GetPM()->GetColor( COLOR_BTNTEXT, this );
  609. m_clrPaneTextDisabled = PmBridge_GetPM()->GetColor( CExtPaintManager::CLR_TEXT_DISABLED, this );
  610. m_clrPaneRect = m_clrStatusBk;
  611. if( m_bCompleteRepaint )
  612. m_clrPaneRect = PmBridge_GetPM()->GetColor( COLOR_3DSHADOW, this );
  613. }
  614. //////////////////////////////////////////////////////////////////////////
  615. void CExtStatusControlBar::OnSysColorChange() 
  616. {
  617. ASSERT_VALID( this );
  618. CStatusBar::OnSysColorChange();
  619. CExtPaintManager * pPM = PmBridge_GetPM();
  620. g_PaintManager.OnSysColorChange( this );
  621. g_CmdManager.OnSysColorChange( pPM, this );
  622. _SyncStatusBarColors();
  623. }
  624. //////////////////////////////////////////////////////////////////////////
  625. void CExtStatusControlBar::OnSettingChange(UINT uFlags, __EXT_MFC_SAFE_LPCTSTR lpszSection) 
  626. {
  627. ASSERT_VALID( this );
  628. //USES_CONVERSION;
  629. //TRACE2("  ==> CExtStatusControlBar::OnSettingChange(0x%08X,"%S")n", uFlags, (lpszSection == NULL) ? "NULL" : T2CA(lpszSection) );
  630. CStatusBar::OnSettingChange( uFlags, lpszSection );
  631. CExtPaintManager * pPM = PmBridge_GetPM();
  632. g_PaintManager.OnSettingChange( this, uFlags, lpszSection );
  633. g_CmdManager.OnSettingChange( pPM, this, uFlags, lpszSection );
  634. _SyncStatusBarColors();
  635. }
  636. //////////////////////////////////////////////////////////////////////////
  637. LRESULT CExtStatusControlBar::OnDisplayChange( WPARAM wParam, LPARAM lParam )
  638. {
  639. ASSERT_VALID( this );
  640. LRESULT lResult = CStatusBar::OnDisplayChange( wParam, lParam );
  641. CExtPaintManager * pPM = PmBridge_GetPM();
  642. g_PaintManager.OnDisplayChange( this, (INT)wParam, CPoint(lParam) );
  643. g_CmdManager.OnDisplayChange( pPM, this, (INT)wParam, CPoint(lParam) );
  644. return lResult;
  645. }
  646. //////////////////////////////////////////////////////////////////////////
  647. LRESULT CExtStatusControlBar::OnThemeChanged( WPARAM wParam, LPARAM lParam )
  648. {
  649. ASSERT_VALID( this );
  650. LRESULT lResult = Default();
  651. CExtPaintManager * pPM = PmBridge_GetPM();
  652. g_PaintManager.OnThemeChanged( this, wParam, lParam );
  653. g_CmdManager.OnThemeChanged( pPM, this, wParam, lParam );
  654. return lResult;
  655. }
  656. //////////////////////////////////////////////////////////////////////////
  657. int CExtStatusControlBar::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  658. {
  659. ASSERT_VALID( this );
  660. if( CStatusBar::OnCreate(lpCreateStruct) == -1 )
  661. return -1;
  662. CWnd::EnableToolTips( TRUE );
  663. CWnd::ModifyStyle( 0, WS_CLIPCHILDREN );
  664. ASSERT( GetSafeHwnd() != NULL );
  665. ASSERT( ::IsWindow(GetSafeHwnd()) );
  666. HWND hWndParent = ::GetParent( GetSafeHwnd() );
  667. ASSERT( hWndParent != NULL );
  668. ASSERT( ::IsWindow(hWndParent) );
  669. VERIFY(
  670. ::SetWindowPos(
  671. GetSafeHwnd(),
  672. HWND_TOP,
  673. 0, 0, 0, 0,
  674. SWP_NOSIZE|SWP_NOMOVE
  675. |SWP_NOREDRAW|SWP_NOACTIVATE|SWP_NOCOPYBITS
  676. |SWP_NOSENDCHANGING
  677. )
  678. );
  679. _SyncStatusBarColors();
  680. return 0;
  681. }
  682. //////////////////////////////////////////////////////////////////////////
  683. void CExtStatusControlBar::OnContextMenu(CWnd* pWnd, CPoint point) 
  684. {
  685. ASSERT_VALID( this );
  686. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  687. CExtCustomizeSite * pSite =
  688. CExtCustomizeSite::GetCustomizeSite( m_hWnd );
  689. if( pSite != NULL
  690. && pSite->IsCustomizeMode()
  691. )
  692. return;
  693. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  694. if( CExtControlBar::FindHelpMode(this) )
  695. return;
  696. CFrameWnd * pFrame = _GetDockingFrameImpl();
  697. if( pFrame == NULL )
  698. {
  699. CStatusBar::OnContextMenu( pWnd, point );
  700. return;
  701. }
  702. ASSERT_VALID( pFrame );
  703. HWND hWndTrack = GetOwner()->GetSafeHwnd();
  704. ASSERT( hWndTrack != NULL && ::IsWindow(hWndTrack) );
  705. CExtPopupMenuWnd * pPopup =
  706. CExtPopupMenuWnd::InstantiatePopupMenu(
  707. GetSafeHwnd(),
  708. RUNTIME_CLASS(CExtPopupMenuWnd),
  709. this
  710. );
  711. VERIFY( pPopup->CreatePopupMenu(hWndTrack) );
  712. if( ! CExtDockBar::_ConstructDockSiteControlBarPopupMenu(
  713. pFrame,
  714. pPopup,
  715. CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_STATUSBAR_CTX,
  716. this,
  717. WM_CONTEXTMENU,
  718. NULL
  719. )
  720. )
  721. {
  722. delete pPopup;
  723. return;
  724. }
  725. if( pPopup->ItemGetCount() == 0 )
  726. {
  727. delete pPopup;
  728. return;
  729. }
  730. ::SetFocus( hWndTrack );
  731. if( ! pPopup->TrackPopupMenu(
  732. TPMX_OWNERDRAW_FIXED,
  733. point.x,
  734. point.y,
  735. NULL,
  736. this,
  737. NULL,
  738. NULL,
  739. true
  740. )
  741. )
  742. {
  743. //delete pPopup;
  744. }
  745. }
  746. //////////////////////////////////////////////////////////////////////////
  747. CFrameWnd * CExtStatusControlBar::_GetDockingFrameImpl()
  748. {
  749. ASSERT_VALID( this );
  750. CFrameWnd * pFrame = GetParentFrame();
  751. if( pFrame == NULL )
  752. return NULL;
  753. ASSERT_VALID( pFrame );
  754. if( pFrame->IsKindOf(RUNTIME_CLASS(CMiniDockFrameWnd)) )
  755. {
  756. pFrame = pFrame->GetParentFrame();
  757. //ASSERT_VALID( pFrame );
  758. ASSERT( pFrame != NULL );
  759. ASSERT( !pFrame->IsKindOf(RUNTIME_CLASS(CMiniDockFrameWnd)) );
  760. }
  761. return pFrame;
  762. }
  763. //////////////////////////////////////////////////////////////////////////
  764. BOOL CExtStatusControlBar::OnEraseBkgnd(CDC* pDC) 
  765. {
  766. ASSERT_VALID( this );
  767. pDC;
  768. if( ! m_bCompleteRepaint )
  769. return Default() ? TRUE : FALSE;
  770. return TRUE;
  771. }
  772. //////////////////////////////////////////////////////////////////////////
  773. UINT CExtStatusControlBar::OnNcHitTest(CPoint point) 
  774. {
  775. ASSERT_VALID( this );
  776. if ( OnQueryGripperEnabledState() ) // fixed by Thomas Fuchs
  777. {
  778. CRect rcGrip( 0, 0, 0, 0 );
  779. CWnd * pWndParentStatus = GetParent();
  780. if( pWndParentStatus != NULL )
  781. {
  782. WINDOWPLACEMENT _wp;
  783. ::memset( (void*)&_wp, 0, sizeof(WINDOWPLACEMENT) );
  784. _wp.length = sizeof(WINDOWPLACEMENT);
  785. pWndParentStatus->GetWindowPlacement( &_wp );
  786. if( _wp.showCmd != SW_SHOWMAXIMIZED
  787. //&& (pWndParentStatus->GetStyle()&WS_BORDER) != 0
  788. )
  789. {
  790. MINMAXINFO _mmi;
  791. ::memset( &_mmi, 0, sizeof(MINMAXINFO) );
  792. CExtPaintManager::monitor_parms_t _mp;
  793. CExtPaintManager::stat_GetMonitorParms( _mp, (CWnd*)pWndParentStatus );
  794. _mmi.ptMaxPosition.x = _mp.m_rcWorkArea.left;
  795. _mmi.ptMaxPosition.y = _mp.m_rcWorkArea.top;
  796. _mmi.ptMaxTrackSize.x = _mp.m_rcWorkArea.Width(); // ::GetSystemMetrics( SM_CXMAXTRACK );
  797. _mmi.ptMaxTrackSize.y = _mp.m_rcWorkArea.Height(); // ::GetSystemMetrics( SM_CYMAXTRACK );
  798. _mmi.ptMinTrackSize.x = ::GetSystemMetrics( SM_CXMINTRACK );
  799. _mmi.ptMinTrackSize.y = ::GetSystemMetrics( SM_CYMINTRACK );
  800. _mmi.ptMaxSize.x = _mmi.ptMaxTrackSize.x;
  801. _mmi.ptMaxSize.y = _mmi.ptMaxTrackSize.y;
  802. if( ((CWnd*)pWndParentStatus)->SendMessage( WM_GETMINMAXINFO, 0, LPARAM(&_mmi) ) == 0 )
  803. {
  804. if( _mmi.ptMinTrackSize.x < _mmi.ptMaxTrackSize.x
  805. || _mmi.ptMinTrackSize.y < _mmi.ptMaxTrackSize.y
  806. )
  807. {
  808. GetClientRect( &rcGrip );
  809. rcGrip.top = rcGrip.bottom - ::GetSystemMetrics( SM_CYVSCROLL );
  810. rcGrip.left = rcGrip.right - ::GetSystemMetrics( SM_CXVSCROLL );
  811. CPoint ptClient( point );
  812. ScreenToClient( &ptClient );
  813. if( rcGrip.PtInRect(ptClient) )
  814. {
  815. __EXT_MFC_LONG_PTR dwExStyle = ::__EXT_MFC_GetWindowLong( GetSafeHwnd(), GWL_EXSTYLE );
  816. bool bRTL = ( (dwExStyle & WS_EX_LAYOUTRTL) != 0 ) ? true : false;
  817. return bRTL 
  818. ? HTBOTTOMLEFT 
  819. : HTBOTTOMRIGHT;
  820. }
  821. }
  822. } // if( ((CWnd*)pWndParentStatus)->SendMessage( WM_GETMINMAXINFO, 0, LPARAM(&_mmi) ) == 0 )
  823. } // if( _wp.showCmd != SW_SHOWMAXIMIZED ...
  824. } // if( pWndParentStatus != NULL )
  825. } // if ( OnQueryGripperEnabledState() )
  826. UINT nHT = (UINT)CStatusBar::OnNcHitTest(point);
  827. if( nHT != HTCLIENT
  828. && ( ! OnQueryGripperEnabledState() )
  829. )
  830. nHT = HTCLIENT;
  831. return nHT;
  832. }
  833. void CExtStatusControlBar::OnSize(UINT nType, int cx, int cy) 
  834. {
  835. CStatusBar::OnSize(nType, cx, cy);
  836. RepositionControls();
  837. }
  838. void CExtStatusControlBar::RepositionControls(
  839. bool bUpdate // = true
  840. )
  841. {
  842. ASSERT_VALID( this );
  843. int nPaneIndex, nPaneCount = (int)m_arrPaneControls.GetSize();
  844. HDWP _hDWP = ::BeginDeferWindowPos( nPaneCount );
  845. CRect rcClient;
  846. GetClientRect( &rcClient );
  847. for( nPaneIndex = 0; nPaneIndex < nPaneCount; nPaneIndex++ )
  848. {
  849. int iIndex =
  850. CommandToIndex(
  851. m_arrPaneControls[ nPaneIndex ] -> nID
  852. );
  853. HWND hWnd =
  854. m_arrPaneControls[ nPaneIndex ] -> hWnd;
  855. CRect rcPane;
  856. GetItemRect( iIndex, &rcPane );
  857. // CStatusBar::GetItemRect() sometimes returns invalid size 
  858. // of the last pane - we will re-compute it
  859. int cx = ::GetSystemMetrics( SM_CXEDGE );
  860. DWORD dwPaneStyle = GetPaneStyle( iIndex );
  861. if( iIndex == (m_nCount-1) )
  862. {
  863. if( (dwPaneStyle & SBPS_STRETCH ) == 0 )
  864. {
  865. UINT nID, nStyle;
  866. int  cxWidth;
  867. GetPaneInfo( iIndex, nID, nStyle, cxWidth );
  868. rcPane.right = rcPane.left + cxWidth + cx*3;
  869. } // if( (dwPaneStyle & SBPS_STRETCH ) == 0 )
  870. else
  871. {
  872. CRect rcClient;
  873. GetClientRect( &rcClient );
  874. rcPane.right = rcClient.right;
  875. if( (GetStyle() & SBARS_SIZEGRIP) == SBARS_SIZEGRIP )
  876. {
  877. int cxSmIcon = ::GetSystemMetrics( SM_CXSMICON );
  878. rcPane.right -= cxSmIcon + cx;
  879. } // if( (GetStyle() & SBARS_SIZEGRIP) == SBARS_SIZEGRIP )
  880. } // else from if( (dwPaneStyle & SBPS_STRETCH ) == 0 )
  881. } // if( iIndex == (m_nCount-1) )
  882. if( ( GetPaneStyle(iIndex)&SBPS_NOBORDERS ) == 0
  883. && (! OnQueryDrawPaneSeparatorsInsteadOfBorders() )
  884. )
  885. {
  886. rcPane.DeflateRect( cx, cx );
  887. }
  888. else
  889. {
  890. rcPane.DeflateRect( cx, 1, cx, 1 );
  891. }
  892. if( hWnd != NULL && ::IsWindow( hWnd ) )
  893. {
  894. _hDWP =
  895. ::DeferWindowPos(
  896. _hDWP, 
  897. hWnd, 
  898. NULL, 
  899. rcPane.left,
  900. rcPane.top, 
  901. rcPane.Width(), 
  902. rcPane.Height(),
  903. SWP_NOZORDER|SWP_NOOWNERZORDER
  904. |SWP_NOACTIVATE //|SWP_SHOWWINDOW
  905. |SWP_FRAMECHANGED
  906. |SWP_NOCOPYBITS
  907. );
  908. } // if( hWnd != NULL && ::IsWindow( hWnd ) )
  909. } // for( nPaneIndex = 0; nPaneIndex < nPaneCount; nPaneIndex++ )
  910. VERIFY( ::EndDeferWindowPos( _hDWP ) );
  911. if( bUpdate )
  912. {
  913. Invalidate();
  914. UpdateWindow();
  915. }
  916. };
  917. //////////////////////////////////////////////////////////////////////////
  918. bool CExtStatusControlBar::AddPane(
  919.  UINT nID, // ID of the  pane
  920.  int nIndex // index of the pane
  921.  )
  922. {
  923. ASSERT_VALID( this );
  924. if( nIndex < 0 || nIndex > m_nCount )
  925. {
  926. //ASSERT( FALSE );
  927. return false;
  928. }
  929. if( CommandToIndex(nID) != -1)
  930. {
  931. //ASSERT( FALSE );
  932. return false;
  933. }
  934. // disable painting
  935. m_bLockPainting = true;
  936. CArray <_STATUSBAR_PANE_* , _STATUSBAR_PANE_* > arrPanesTmp;
  937. CArray < HICON, HICON > arrPaneIcons;
  938. CStatusBarCtrl & _ctrl = GetStatusBarCtrl();
  939. int iIndex;
  940. for( iIndex = 0; iIndex < (m_nCount+1); iIndex++ )
  941. {
  942. _STATUSBAR_PANE_ * pNewPane = new _STATUSBAR_PANE_;
  943. if( iIndex == nIndex )
  944. {
  945. pNewPane->nID    = nID;
  946. pNewPane->nStyle = SBPS_NORMAL;
  947. arrPaneIcons.Add( NULL );
  948. } // if( iIndex == nIndex )
  949. else
  950. {
  951. int idx = iIndex;
  952. if( iIndex > nIndex )
  953. idx--;
  954. _STATUSBAR_PANE_ * pOldPane = GetPanePtr(idx);
  955. pNewPane->cxText  = pOldPane->cxText;
  956. pNewPane->nFlags  = pOldPane->nFlags;
  957. pNewPane->nID     = pOldPane->nID;
  958. pNewPane->nStyle  = pOldPane->nStyle;
  959. pNewPane->strText = pOldPane->strText;
  960. HICON hIcon = (HICON)
  961. _ctrl.SendMessage(
  962. SB_GETICON,
  963. WPARAM(idx)
  964. );
  965. if( hIcon != NULL )
  966. {
  967. CExtCmdIcon _iconClone;
  968. _iconClone.AssignFromHICON( hIcon, true );
  969. hIcon = _iconClone.ExtractHICON();
  970. ASSERT( hIcon != NULL );
  971. } // if( hIcon != NULL )
  972. arrPaneIcons.Add( hIcon );
  973. } // else from if( iIndex == nIndex )
  974. arrPanesTmp.Add( pNewPane );
  975. } // for( iIndex = 0; iIndex < (m_nCount+1); iIndex++ )
  976. int nPaneCount = (int)arrPanesTmp.GetSize();
  977. UINT * lpIDArray = new UINT[ nPaneCount ];
  978. for( iIndex = 0; iIndex < nPaneCount; iIndex++ )
  979. lpIDArray[iIndex] = arrPanesTmp[iIndex]->nID;
  980. // set the indicators 
  981. SetIndicators( lpIDArray, nPaneCount );
  982. // free memory, reset icons
  983. for( iIndex = 0; iIndex < nPaneCount; iIndex++ )
  984. {
  985. _STATUSBAR_PANE_* pPane = arrPanesTmp[iIndex];
  986. if( iIndex != nIndex )
  987. PaneInfoSet(iIndex, pPane);
  988. if( pPane ) 
  989. delete pPane;
  990. HICON hIcon = arrPaneIcons[iIndex];
  991. _ctrl.SetIcon( iIndex, hIcon );
  992. } // for( iIndex = 0; iIndex < nPaneCount; iIndex++ )
  993. arrPanesTmp.RemoveAll();
  994. arrPaneIcons.RemoveAll();
  995. if( lpIDArray ) 
  996. delete [] lpIDArray;
  997. // enable painting
  998. m_bLockPainting = false;
  999. RepositionControls();
  1000. return true;
  1001. }
  1002. //////////////////////////////////////////////////////////////////////////
  1003. bool CExtStatusControlBar::_RemovePaneImpl(
  1004. UINT nID, // ID of the pane
  1005. bool bRefresh
  1006. )
  1007. {
  1008. ASSERT_VALID( this );
  1009. if( CommandToIndex(nID) == -1
  1010. //|| m_nCount == 1
  1011. )
  1012. {
  1013. ASSERT( FALSE );
  1014. return false;
  1015. }
  1016. // disable painting
  1017. m_bLockPainting = true;
  1018. m_mapIdToExtData.RemoveKey( nID );
  1019. CArray < _STATUSBAR_PANE_* , _STATUSBAR_PANE_ * > arrPanesTmp;
  1020. CArray < HICON, HICON > arrPaneIcons;
  1021. CStatusBarCtrl & _ctrl = GetStatusBarCtrl();
  1022. int nIndex;
  1023. for( nIndex = 0; nIndex < m_nCount; nIndex++ )
  1024. {
  1025. _STATUSBAR_PANE_ * pOldPane = GetPanePtr(nIndex);
  1026. HICON hIcon = (HICON)
  1027. _ctrl.SendMessage(
  1028. SB_GETICON,
  1029. WPARAM(nIndex)
  1030. );
  1031. if( pOldPane->nID == nID )
  1032. {
  1033. if( hIcon != NULL )
  1034. _ctrl.SetIcon( nIndex, (HICON)NULL );
  1035. continue;
  1036. } // if( pOldPane->nID == nID )
  1037. _STATUSBAR_PANE_ * pNewPane = new _STATUSBAR_PANE_;
  1038. pNewPane->cxText  = pOldPane->cxText;
  1039. pNewPane->nFlags  = pOldPane->nFlags;
  1040. pNewPane->nID     = pOldPane->nID;
  1041. pNewPane->nStyle  = pOldPane->nStyle;
  1042. pNewPane->strText = pOldPane->strText;
  1043. arrPanesTmp.Add( pNewPane );
  1044. if( hIcon != NULL )
  1045. {
  1046. CExtCmdIcon _iconClone;
  1047. _iconClone.AssignFromHICON( hIcon, true );
  1048. hIcon = _iconClone.ExtractHICON();
  1049. ASSERT( hIcon != NULL );
  1050. } // if( hIcon != NULL )
  1051. arrPaneIcons.Add( hIcon );
  1052. } // for( nIndex = 0; nIndex < m_nCount; nIndex++ )
  1053. UINT * lpIDArray = NULL;
  1054. if( arrPanesTmp.GetSize() > 0 )
  1055. {
  1056. lpIDArray = new UINT[ arrPanesTmp.GetSize() ];
  1057. for( nIndex = 0; nIndex < arrPanesTmp.GetSize(); nIndex++ )
  1058. lpIDArray[nIndex] = arrPanesTmp[nIndex]->nID;
  1059. } // if( arrPanesTmp.GetSize() > 0 )
  1060. // set the indicators
  1061. SetIndicators( lpIDArray, (int)arrPanesTmp.GetSize() );
  1062. // free memory, reset icons
  1063. for( nIndex = 0; nIndex < arrPanesTmp.GetSize(); nIndex++ )
  1064. {
  1065. _STATUSBAR_PANE_* pPane = arrPanesTmp[nIndex];
  1066. PaneInfoSet(nIndex, pPane);
  1067. if( pPane ) 
  1068. delete pPane;
  1069. HICON hIcon = arrPaneIcons[nIndex];
  1070. _ctrl.SetIcon( nIndex, hIcon );
  1071. } // for( nIndex = 0; nIndex < arrPanesTmp.GetSize(); nIndex++ )
  1072. RemovePaneControl( nID );
  1073. arrPanesTmp.RemoveAll();
  1074. arrPaneIcons.RemoveAll();
  1075. if( lpIDArray != NULL ) 
  1076. delete [] lpIDArray;
  1077. if( bRefresh )
  1078. RepositionControls();
  1079. // enable painting
  1080. m_bLockPainting = false;
  1081. return true;
  1082. }
  1083. //////////////////////////////////////////////////////////////////////////
  1084. bool CExtStatusControlBar::RemovePane(
  1085. UINT nID // ID of the pane
  1086. )
  1087. {
  1088. return _RemovePaneImpl( nID, true );
  1089. }
  1090. //////////////////////////////////////////////////////////////////////////
  1091. int CExtStatusControlBar::_RemovePanesImpl(
  1092. int nIndexToRemove,
  1093. int nCountToRemove,
  1094. bool bRefresh
  1095. )
  1096. {
  1097. ASSERT_VALID( this );
  1098. if( nIndexToRemove < 0
  1099. || nCountToRemove <= 0
  1100. )
  1101. return 0;
  1102. int nPaneCount = GetPaneCount();
  1103. ASSERT( nPaneCount >= 0 );
  1104. if( nIndexToRemove >= nPaneCount )
  1105. return 0;
  1106. if( (nIndexToRemove + nCountToRemove) > nPaneCount )
  1107. {
  1108. nCountToRemove = nPaneCount - nIndexToRemove;
  1109. ASSERT( nCountToRemove > 0 );
  1110. }
  1111. int nCountRemoved = 0;
  1112. for( int i = 0; i < nCountToRemove; i++ )
  1113. {
  1114. UINT nID = GetItemID( nIndexToRemove );
  1115. if( !_RemovePaneImpl( nID, false ) )
  1116. break;
  1117. nCountRemoved ++;
  1118. } // for( int i = 0; i < nCountToRemove; i++ )
  1119. if( bRefresh && nCountRemoved > 0 )
  1120. RepositionControls();
  1121. return nCountRemoved;
  1122. }
  1123. //////////////////////////////////////////////////////////////////////////
  1124. int CExtStatusControlBar::RemovePanes(
  1125. int nIndexToRemove,
  1126. int nCountToRemove
  1127. )
  1128. {
  1129. return _RemovePanesImpl( nIndexToRemove, nCountToRemove, true );
  1130. }
  1131. //////////////////////////////////////////////////////////////////////////
  1132. bool CExtStatusControlBar::RemovePaneControl( UINT nID )
  1133. {
  1134. ASSERT_VALID( this );
  1135. for( INT i = 0; i < m_arrPaneControls.GetSize(); i++ )
  1136. {
  1137. if( m_arrPaneControls[i]->nID == nID )
  1138. {
  1139. if( m_arrPaneControls[i]->hWnd != NULL
  1140. && ::IsWindow(m_arrPaneControls[i]->hWnd) 
  1141. {
  1142. ::ShowWindow( m_arrPaneControls[i]->hWnd, SW_HIDE ); 
  1143. if( m_arrPaneControls[i]->bAutoDestroy ) 
  1144. ::DestroyWindow( m_arrPaneControls[i]->hWnd );
  1145. }
  1146. _STATUSBAR_PANE_CTRL_ *pPaneCtrl = m_arrPaneControls[i];
  1147. if( pPaneCtrl )
  1148. delete pPaneCtrl;
  1149. m_arrPaneControls.RemoveAt(i);
  1150. return true;
  1151. }
  1152. }
  1153. return false;
  1154. }
  1155. //////////////////////////////////////////////////////////////////////////
  1156. bool CExtStatusControlBar::SetPaneControl(CWnd* pWnd, UINT nID, bool bAutoDestroy)
  1157. {
  1158. ASSERT_VALID( this );
  1159. return SetPaneControl( pWnd->GetSafeHwnd(), nID, bAutoDestroy);
  1160. }
  1161. bool CExtStatusControlBar::SetPaneControl(HWND hWnd, UINT nID, bool bAutoDestroy)
  1162. {
  1163. ASSERT_VALID( this );
  1164. if (CommandToIndex (nID) == -1)
  1165. {
  1166. return false; // pane doesn't exists
  1167. }
  1168. RemovePaneControl( nID ); // remove previous control if it exists
  1169. _STATUSBAR_PANE_CTRL_* pPaneCtrl = new _STATUSBAR_PANE_CTRL_;
  1170. pPaneCtrl->nID         = nID;
  1171. pPaneCtrl->hWnd        = hWnd;
  1172. pPaneCtrl->bAutoDestroy = bAutoDestroy;
  1173. m_arrPaneControls.Add(pPaneCtrl);
  1174. RepositionControls();
  1175. return true;
  1176. }
  1177. //////////////////////////////////////////////////////////////////////////
  1178. bool CExtStatusControlBar::PaneInfoGet(int nIndex, _STATUSBAR_PANE_* pPane) const
  1179. {
  1180. ASSERT_VALID( this );
  1181. ASSERT( pPane != NULL );
  1182. if( nIndex < m_nCount  && nIndex >= 0 )
  1183. {
  1184. GetPaneInfo( nIndex,  pPane->nID, pPane->nStyle, pPane->cxText );
  1185. CString strPaneText;
  1186. GetPaneText( nIndex , strPaneText );
  1187. pPane->strText = LPCTSTR(strPaneText);
  1188. return true;
  1189. }
  1190. return false;
  1191. }
  1192. //////////////////////////////////////////////////////////////////////////
  1193. bool CExtStatusControlBar::PaneInfoSet(int nIndex, _STATUSBAR_PANE_* pPane)
  1194. {
  1195. ASSERT_VALID( this );
  1196. ASSERT( pPane != NULL );
  1197. if( nIndex < m_nCount  && nIndex >= 0 )
  1198. {
  1199. SetPaneInfo( nIndex, pPane->nID, pPane->nStyle, pPane->cxText );
  1200. SetPaneText( nIndex, LPCTSTR( pPane->strText) );
  1201. return true;
  1202. }
  1203. return false;
  1204. }
  1205. //////////////////////////////////////////////////////////////////////////
  1206. UINT CExtStatusControlBar::GetPaneDrawTextFlags(
  1207. int nIndex
  1208. ) const
  1209. {
  1210. ASSERT_VALID( this );
  1211. if( GetSafeHwnd() == NULL )
  1212. return m_nDrawPaneTextFlags;
  1213. ASSERT( 0 <= nIndex && nIndex < GetPaneCount() );
  1214. _ED_ _data;
  1215. UINT nID = GetItemID( nIndex );
  1216. if( ! m_mapIdToExtData.Lookup( nID, _data ) )
  1217. return m_nDrawPaneTextFlags;
  1218. return _data.m_nDTF;
  1219. }
  1220. //////////////////////////////////////////////////////////////////////////
  1221. void CExtStatusControlBar::SetPaneDrawTextFlags(
  1222. int nIndex,
  1223. UINT _nDTF
  1224. )
  1225. {
  1226. ASSERT_VALID( this );
  1227. if( GetSafeHwnd() == NULL )
  1228. return;
  1229. ASSERT( 0 <= nIndex && nIndex < GetPaneCount() );
  1230. UINT nID = GetItemID( nIndex );
  1231. _ED_ _data;
  1232. if( m_mapIdToExtData.Lookup( nID, _data ) )
  1233. {
  1234. if( _nDTF == _data.m_nDTF )
  1235. return;
  1236. } // if( m_mapIdToExtData.Lookup( nID, nDTF ) )
  1237. _data.m_nDTF = _nDTF;
  1238. m_mapIdToExtData.SetAt( nID, _data );
  1239. Invalidate();
  1240. }
  1241. //////////////////////////////////////////////////////////////////////////
  1242. CExtStatusControlBar::e_StatusPaneBackgroundAccent_t CExtStatusControlBar::OnQueryPaneBackgroundAccent(
  1243. int nIndex
  1244. ) const
  1245. {
  1246. ASSERT_VALID( this );
  1247. if( GetSafeHwnd() == NULL )
  1248. return __ESPBA_DARK;
  1249. if( !( 0 <= nIndex && nIndex < GetPaneCount() ) )
  1250. return __ESPBA_DARK;
  1251. e_StatusPaneBackgroundAccent_t eSPBA = GetPaneBackgroundAccent( nIndex );
  1252. if( eSPBA == __ESPBA_AUTOMATIC )
  1253. {
  1254. eSPBA = __ESPBA_DARK;
  1255. UINT nID, nStyle;
  1256. int  cxWidth;
  1257. GetPaneInfo( nIndex, nID, nStyle, cxWidth );
  1258. if( nID == 0 )
  1259. eSPBA = __ESPBA_LIGHT;
  1260. }
  1261. return eSPBA;
  1262. }
  1263. //////////////////////////////////////////////////////////////////////////
  1264. CExtStatusControlBar::e_StatusPaneBackgroundAccent_t CExtStatusControlBar::GetPaneBackgroundAccent(
  1265. int nIndex
  1266. ) const
  1267. {
  1268. ASSERT_VALID( this );
  1269. if( GetSafeHwnd() == NULL )
  1270. return __ESPBA_AUTOMATIC;
  1271. ASSERT( 0 <= nIndex && nIndex < GetPaneCount() );
  1272. _ED_ _data;
  1273. UINT nID = GetItemID( nIndex );
  1274. if( ! m_mapIdToExtData.Lookup( nID, _data ) )
  1275. return __ESPBA_AUTOMATIC;
  1276. return _data.m_eSPBA;
  1277. }
  1278. //////////////////////////////////////////////////////////////////////////
  1279. void CExtStatusControlBar::SetPaneBackgroundAccent(
  1280. int nIndex,
  1281. CExtStatusControlBar::e_StatusPaneBackgroundAccent_t eSPBA
  1282. )
  1283. {
  1284. ASSERT_VALID( this );
  1285. if( GetSafeHwnd() == NULL )
  1286. return;
  1287. ASSERT( __ESPBA_MIN_VALUE <= eSPBA && eSPBA <= __ESPBA_MAX_VALUE );
  1288. UINT nID = GetItemID( nIndex );
  1289. _ED_ _data;
  1290. if( m_mapIdToExtData.Lookup( nID, _data ) )
  1291. {
  1292. if( eSPBA == _data.m_eSPBA )
  1293. return;
  1294. } // if( m_mapIdToExtData.Lookup( nID, nDTF ) )
  1295. _data.m_eSPBA = eSPBA;
  1296. m_mapIdToExtData.SetAt( nID, _data );
  1297. Invalidate();
  1298. }
  1299. //////////////////////////////////////////////////////////////////////////
  1300. UINT CExtStatusControlBar::GetItemID( int nIndex ) const
  1301. {
  1302. ASSERT_VALID( this );
  1303. if( GetSafeHwnd() == NULL )
  1304. return 0;
  1305. ASSERT( 0 <= nIndex && nIndex < GetPaneCount() );
  1306. _STATUSBAR_PANE_ pane;
  1307. PaneInfoGet( nIndex, &pane );
  1308. return pane.nID;
  1309. }
  1310. //////////////////////////////////////////////////////////////////////////
  1311. CExtStatusControlBar::_STATUSBAR_PANE_* CExtStatusControlBar::GetPanePtr(int nIndex) const
  1312. {
  1313. ASSERT_VALID( this );
  1314. ASSERT((nIndex >= 0 && nIndex < m_nCount) || m_nCount == 0);
  1315. return ((_STATUSBAR_PANE_*)m_pData) + nIndex;
  1316. }
  1317. CExtStatusControlBar::_STATUSBAR_PANE_ * CExtStatusControlBar::_GetPanePtr( int nIndex ) const
  1318. {
  1319. ASSERT((nIndex >= 0 && nIndex < m_nCount) || m_nCount == 0);
  1320. return ((_STATUSBAR_PANE_*)m_pData) + nIndex;
  1321. }
  1322. //////////////////////////////////////////////////////////////////////////
  1323. BOOL CExtStatusControlBar::SetIndicators(
  1324. const UINT * lpIDArray,
  1325. int nIDCount
  1326. )
  1327. {
  1328. ASSERT_VALID( this );
  1329. ASSERT( nIDCount >= 0 );
  1330. ASSERT(
  1331. lpIDArray == NULL
  1332. || ::AfxIsValidAddress(
  1333. lpIDArray,
  1334. sizeof(UINT) * nIDCount,
  1335. FALSE
  1336. )
  1337. );
  1338. ASSERT( ::IsWindow(m_hWnd) );
  1339. if( ! AllocElements(
  1340. nIDCount,
  1341. sizeof(_STATUSBAR_PANE_)
  1342. )
  1343. )
  1344. return FALSE;
  1345. ASSERT( nIDCount == m_nCount );
  1346. BOOL bResult = TRUE;
  1347. if( lpIDArray != NULL )
  1348. {
  1349. HFONT hFont = (HFONT)SendMessage( WM_GETFONT );
  1350. CClientDC dcScreen( NULL );
  1351. HGDIOBJ hOldFont = NULL;
  1352. if( hFont != NULL )
  1353. hOldFont = dcScreen.SelectObject( hFont );
  1354. _STATUSBAR_PANE_ * pPane = _GetPanePtr( 0 );
  1355. for( int nPaneIndex = 0; nPaneIndex < nIDCount; nPaneIndex++ )
  1356. {
  1357. pPane->nID = * lpIDArray++;
  1358. pPane->nFlags |= SBPF_UPDATE;
  1359. if( pPane->nID != 0 )
  1360. {
  1361. if( ! g_ResourceManager->LoadString( pPane->strText, pPane->nID ) )
  1362. {
  1363. // bResult = FALSE;
  1364. // break;
  1365. pPane->strText = _T("");
  1366. }
  1367. pPane->cxText =
  1368. dcScreen.GetTextExtent(
  1369. pPane->strText,
  1370. pPane->strText.GetLength()
  1371. ).cx;
  1372. //ASSERT( pPane->cxText >= 0 );
  1373. if( ! SetPaneText( nPaneIndex, pPane->strText, FALSE ) )
  1374. {
  1375. bResult = FALSE;
  1376. break;
  1377. } // if( ! SetPaneText( nPaneIndex, pPane->strText, FALSE ) )
  1378. } // if( pPane->nID != 0 )
  1379. else
  1380. {
  1381. pPane->cxText =
  1382. ::GetSystemMetrics(SM_CXSCREEN) / 4;
  1383. if( nPaneIndex == 0 )
  1384. pPane->nStyle |=
  1385. SBPS_STRETCH|SBPS_NOBORDERS;
  1386. } // else from if( pPane->nID != 0 )
  1387. pPane ++;
  1388. } // for( int nPaneIndex = 0; nPaneIndex < nIDCount; nPaneIndex++ )
  1389. if( hOldFont != NULL )
  1390. dcScreen.SelectObject( hOldFont );
  1391. } // if( lpIDArray != NULL )
  1392. UpdateAllPanes( TRUE, TRUE );
  1393. return bResult;
  1394. }
  1395. //////////////////////////////////////////////////////////////////////////
  1396. CExtSafeString CExtStatusControlBar::GetTipText( int nPane ) const
  1397. {
  1398. ASSERT_VALID( this );
  1399. if( GetSafeHwnd() == NULL )
  1400. return CExtSafeString( _T("") );
  1401. ASSERT( 0 <= nPane && nPane < GetPaneCount() );
  1402. _ED_ _data;
  1403. UINT nID = GetItemID( nPane );
  1404. if( ! m_mapIdToExtData.Lookup( nID, _data ) )
  1405. return CExtSafeString( _T("") );
  1406. return _data.m_strTipText;
  1407. }
  1408. //////////////////////////////////////////////////////////////////////////
  1409. void CExtStatusControlBar::SetTipText( int nPane, __EXT_MFC_SAFE_LPCTSTR pszTipText )
  1410. {
  1411. ASSERT_VALID( this );
  1412. if( GetSafeHwnd() == NULL )
  1413. return;
  1414. CWnd::CancelToolTips();
  1415. if( pszTipText == NULL )
  1416. pszTipText = _T("");
  1417. ASSERT( 0 <= nPane && nPane < GetPaneCount() );
  1418. UINT nID = GetItemID( nPane );
  1419. _ED_ _data;
  1420. if( m_mapIdToExtData.Lookup( nID, _data ) )
  1421. {
  1422. if( _tcscmp(
  1423. pszTipText,
  1424. ( _data.m_strTipText.IsEmpty() ? _T("") : LPCTSTR(_data.m_strTipText) )
  1425. ) == 0
  1426. )
  1427. return;
  1428. } // if( m_mapIdToExtData.Lookup( nID, nDTF ) )
  1429. _data.m_strTipText = pszTipText;
  1430. m_mapIdToExtData.SetAt( nID, _data );
  1431. Invalidate();
  1432. }
  1433. //////////////////////////////////////////////////////////////////////////
  1434. void CExtStatusControlBar::SetPaneBkColor( 
  1435. int nPane, 
  1436. COLORREF clrBk // = COLORREF(-1L)
  1437. )
  1438. {
  1439. ASSERT_VALID( this );
  1440. ASSERT( 0 <= nPane && nPane < GetPaneCount() );
  1441. UINT nID = GetItemID( nPane );
  1442. _ED_ _data;
  1443. if( m_mapIdToExtData.Lookup( nID, _data ) 
  1444. && _data.m_clrBack == clrBk
  1445. )
  1446. return;
  1447. _data.m_clrBack = clrBk;
  1448. m_mapIdToExtData.SetAt( nID, _data );
  1449. Invalidate();
  1450. }
  1451. void CExtStatusControlBar::SetPaneTextColor(
  1452. int nPane, 
  1453. bool bEnabled,
  1454. COLORREF clrText // = COLORREF(-1L)
  1455. )
  1456. {
  1457. ASSERT_VALID( this );
  1458. ASSERT( 0 <= nPane && nPane < GetPaneCount() );
  1459. UINT nID = GetItemID( nPane );
  1460. _ED_ _data;
  1461. if( m_mapIdToExtData.Lookup( nID, _data ) 
  1462. && ( (bEnabled && _data.m_clrTextNormal == clrText)
  1463. || ((!bEnabled) && _data.m_clrTextDisabled == clrText)
  1464. )
  1465. )
  1466. return;
  1467. if( bEnabled )
  1468. _data.m_clrTextNormal = clrText;
  1469. else
  1470. _data.m_clrTextDisabled = clrText;
  1471. m_mapIdToExtData.SetAt( nID, _data );
  1472. Invalidate();
  1473. }
  1474. COLORREF CExtStatusControlBar::GetPaneBkColor( 
  1475. int nPane
  1476. ) const
  1477. {
  1478. ASSERT_VALID( this );
  1479. ASSERT( 0 <= nPane && nPane < GetPaneCount() );
  1480. return OnQueryPaneBkColor( nPane );
  1481. }
  1482. COLORREF CExtStatusControlBar::GetPaneTextColor(
  1483. int nPane,
  1484. bool bEnabled
  1485. ) const
  1486. {
  1487. ASSERT_VALID( this );
  1488. ASSERT( 0 <= nPane && nPane < GetPaneCount() );
  1489. return OnQueryPaneTextColor( nPane, bEnabled );
  1490. }
  1491. //////////////////////////////////////////////////////////////////////////
  1492. int CExtStatusControlBar::HitTestStatusPane(
  1493. CPoint ptClient
  1494. ) const
  1495. {
  1496. ASSERT_VALID( this );
  1497. if( GetSafeHwnd() == NULL
  1498. || (! ::IsWindow( GetSafeHwnd() ) )
  1499. )
  1500. return -1;
  1501. int nPaneCount = GetPaneCount();
  1502. if( nPaneCount == 0 )
  1503. return -1;
  1504. CPoint ptScreen( ptClient );
  1505. ClientToScreen( &ptScreen );
  1506. HWND hWndFromPoint = ::WindowFromPoint( ptScreen );
  1507. if( hWndFromPoint != m_hWnd
  1508. && (! ::IsChild(m_hWnd, hWndFromPoint) )
  1509. )
  1510. return -1;
  1511. for( int nPaneIndex = 0; nPaneIndex < nPaneCount; nPaneIndex++ )
  1512. {
  1513. CRect rcPane;
  1514. GetItemRect( nPaneIndex, &rcPane );
  1515. if( rcPane.PtInRect(ptClient) )
  1516. return nPaneIndex;
  1517. } // for( int nPaneIndex = 0; nPaneIndex < nPaneCount; nPaneIndex++ )
  1518. return -1;
  1519. }
  1520. //////////////////////////////////////////////////////////////////////////
  1521. __EXT_MFC_INT_PTR CExtStatusControlBar::OnToolHitTest(
  1522. CPoint point,
  1523. TOOLINFO * pTI
  1524. ) const
  1525. {
  1526. ASSERT_VALID( this );
  1527. if( CExtToolControlBar::g_bMenuTracking
  1528. || CExtPopupMenuWnd::IsMenuTracking()
  1529. || GetSafeHwnd() == NULL
  1530. || (! ::IsWindow( GetSafeHwnd() ) )
  1531. )
  1532. return -1;
  1533. if( m_nAdvancedTipStyle != INT(CExtPopupMenuTipWnd::__ETS_NONE) )
  1534. return -1;
  1535. int nPaneIndex = HitTestStatusPane( point );
  1536. if( nPaneIndex < 0 )
  1537. return -1;
  1538. __EXT_MFC_INT_PTR nHit = (__EXT_MFC_INT_PTR)GetItemID( nPaneIndex );
  1539. if( pTI != NULL )
  1540. {
  1541. GetItemRect( nPaneIndex, &(pTI->rect) );
  1542. pTI->uId = nHit;
  1543. pTI->hwnd = m_hWnd;
  1544. CString strToolTipText = GetTipText( nPaneIndex );
  1545. if( ! strToolTipText.IsEmpty() )
  1546. pTI->lpszText = _tcsdup( strToolTipText );
  1547. if( pTI->lpszText == NULL )
  1548. pTI->lpszText = LPSTR_TEXTCALLBACK;
  1549. } // if( pTI != NULL )
  1550. return nHit;
  1551. }
  1552. void CExtStatusControlBar::DrawPaneSeparatorsSet( 
  1553. bool bSet // = true 
  1554. )
  1555. {
  1556. ASSERT_VALID( this );
  1557. m_bDrawPaneSeparatorsInsteadOfBorders = bSet;
  1558. RepositionControls();
  1559. }
  1560. bool CExtStatusControlBar::DrawPaneSeparatorsGet() const
  1561. {
  1562. ASSERT_VALID( this );
  1563. return m_bDrawPaneSeparatorsInsteadOfBorders;
  1564. }
  1565. void CExtStatusControlBar::OuterRectInFirstBandSet( 
  1566. bool bSet // = true 
  1567. )
  1568. {
  1569. ASSERT_VALID( this );
  1570. m_bOuterRectInFirstBand = bSet;
  1571. Invalidate();
  1572. UpdateWindow();
  1573. }
  1574. bool CExtStatusControlBar::OuterRectInFirstBandGet() const
  1575. {
  1576. ASSERT_VALID( this );
  1577. return m_bOuterRectInFirstBand;
  1578. }
  1579. void CExtStatusControlBar::HideTextOnDisabledPanesSet( 
  1580. bool bSet // = true
  1581. )
  1582. {
  1583. ASSERT_VALID( this );
  1584. m_bHideTextOnDisabledPanes = bSet;
  1585. Invalidate();
  1586. UpdateWindow();
  1587. }
  1588. bool CExtStatusControlBar::HideTextOnDisabledPanesGet() const
  1589. {
  1590. ASSERT_VALID( this );
  1591. return m_bHideTextOnDisabledPanes;
  1592. }
  1593. void CExtStatusControlBar::EnableControl( 
  1594. int nIndex, 
  1595. bool bEnable // = true 
  1596. )
  1597. {
  1598. ASSERT_VALID( this );
  1599. UINT uItemID = GetItemID(nIndex);
  1600. for ( int i = 0; i < m_arrPaneControls.GetSize(); i++ )
  1601. {
  1602. if( uItemID == m_arrPaneControls[i]->nID )
  1603. {
  1604. if( m_arrPaneControls[i]->hWnd && ::IsWindow(m_arrPaneControls[i]->hWnd) ) 
  1605. {
  1606. ::EnableWindow(m_arrPaneControls[i]->hWnd, bEnable); 
  1607. Invalidate();
  1608. UpdateWindow();
  1609. }
  1610. }
  1611. }
  1612. }
  1613. void CExtStatusControlBar::SetPaneInfo(
  1614. int nIndex, 
  1615. UINT nID, 
  1616. UINT nStyle, 
  1617. int cxWidth
  1618. )
  1619. {
  1620. ASSERT_VALID( this );
  1621. CStatusBar::SetPaneInfo(nIndex, nID, nStyle, cxWidth);
  1622. bool bEnabled = ((nStyle&SBPS_DISABLED) == 0);
  1623. EnableControl(nIndex, bEnabled);
  1624. }
  1625. void CExtStatusControlBar::SetPaneStyle(
  1626. int nIndex, 
  1627. UINT nStyle
  1628. )
  1629. {
  1630. ASSERT_VALID( this );
  1631. CStatusBar::SetPaneStyle(nIndex, nStyle);
  1632. bool bEnabled = ((nStyle&SBPS_DISABLED) == 0);
  1633. EnableControl(nIndex, bEnabled);
  1634. }
  1635. int CExtStatusControlBar::GetPaneCount() const
  1636. {
  1637. ASSERT_VALID( this );
  1638. return m_nCount;
  1639. }
  1640. void CExtStatusControlBar::SetPaneWidth(int nIndex, int nWidth)
  1641. {
  1642. ASSERT_VALID( this );
  1643. _STATUSBAR_PANE_ pane;
  1644. PaneInfoGet(nIndex, &pane);
  1645. pane.cxText = nWidth;
  1646. PaneInfoSet(nIndex, &pane);
  1647. }
  1648. void CExtStatusControlBar::WidthFromContent( int nIndex )
  1649. {
  1650. ASSERT_VALID( this );
  1651. ASSERT((nIndex >= 0 && nIndex < m_nCount) || m_nCount == 0);
  1652. _STATUSBAR_PANE_ * pPane = GetPanePtr( nIndex );
  1653. ASSERT( pPane != NULL );
  1654. if( pPane == NULL )
  1655. return;
  1656. CRect rcText(0,0,0,0);
  1657. if( !pPane->strText.IsEmpty() )
  1658. {
  1659. HFONT hFont = (HFONT)SendMessage( WM_GETFONT );
  1660. CClientDC dcScreen( NULL );
  1661. HGDIOBJ hOldFont = NULL;
  1662. if( hFont != NULL )
  1663. hOldFont = dcScreen.SelectObject( hFont );
  1664. dcScreen.DrawText(
  1665. pPane->strText,
  1666. pPane->strText.GetLength(),
  1667. &rcText,
  1668. GetPaneDrawTextFlags( nIndex ) | DT_CALCRECT
  1669. );
  1670. if( hOldFont != NULL )
  1671. dcScreen.SelectObject( hOldFont );
  1672. } // if( !pPane->strText.IsEmpty() )
  1673. CStatusBarCtrl & _ctrl = GetStatusBarCtrl();
  1674. HICON hIcon = (HICON)
  1675. _ctrl.SendMessage(
  1676. SB_GETICON,
  1677. WPARAM(nIndex)
  1678. );
  1679. // ICON 2.53
  1680. CSize szIcon = CSize(0,0);
  1681. //  if( hIcon != NULL )
  1682. //  szIcon = CExtCmdIcon::stat_GetIconSize( hIcon );
  1683. if( hIcon != NULL )
  1684. {
  1685. CExtCmdIcon _icon;
  1686. _icon.AssignFromHICON( hIcon, false );
  1687. szIcon = _icon.GetSize();
  1688. }
  1689. SetPaneWidth( 
  1690. nIndex,
  1691. szIcon.cx + rcText.Width() + 2
  1692. );
  1693. RepositionControls();
  1694. }
  1695. void CExtStatusControlBar::OnCancelMode() 
  1696. {
  1697. CExtPopupMenuWnd::CancelMenuTracking();
  1698. CWnd::CancelToolTips();
  1699. CStatusBar::OnCancelMode();
  1700. }
  1701. CExtPopupMenuTipWnd * CExtStatusControlBar::OnAdvancedPopupMenuTipWndGet() const
  1702. {
  1703. if( m_nAdvancedTipStyle == INT(CExtPopupMenuTipWnd::__ETS_NONE) )
  1704. return NULL;
  1705. return (&( CExtPopupMenuSite::g_DefPopupMenuSite.GetTip() ));
  1706. }
  1707. void CExtStatusControlBar::OnAdvancedPopupMenuTipWndDisplay(
  1708. CExtPopupMenuTipWnd & _ATTW,
  1709. const RECT & rcExcludeArea,
  1710. __EXT_MFC_SAFE_LPCTSTR strTipText
  1711. ) const
  1712. {
  1713. ASSERT_VALID( this );
  1714. if( strTipText == NULL
  1715. || _tcscmp( strTipText, _T("") ) == 0 
  1716. )
  1717. return;
  1718. _ATTW.SetText( LPCTSTR(strTipText) );
  1719. _ATTW.SetTipStyle( (CExtPopupMenuTipWnd::e_tip_style_t) m_nAdvancedTipStyle );
  1720. _ATTW.Show( (CWnd*) this, rcExcludeArea );
  1721. }
  1722. void CExtStatusControlBar::OnMouseMove( UINT nFlags, CPoint point )
  1723. {
  1724. CStatusBar::OnMouseMove( nFlags, point );
  1725. if( (! CExtPopupMenuWnd::IsMenuTracking() ) )
  1726. {
  1727. CExtPopupMenuTipWnd * pATTW =
  1728. OnAdvancedPopupMenuTipWndGet();
  1729. if( pATTW != NULL )
  1730. {
  1731. int nPaneIndex = HitTestStatusPane( point );
  1732. if( nPaneIndex < 0 )
  1733. return;
  1734. CRect rcPane;
  1735. GetItemRect( nPaneIndex, &rcPane );
  1736. CString strToolTipText = GetTipText( nPaneIndex );
  1737. if( ! strToolTipText.IsEmpty() )
  1738. {
  1739. CRect rcArea = rcPane;
  1740. ClientToScreen( &rcArea );
  1741. OnAdvancedPopupMenuTipWndDisplay(
  1742. *pATTW,
  1743. rcArea,
  1744. LPCTSTR( strToolTipText )
  1745. );
  1746. }
  1747. } // if( pATTW != NULL )
  1748. }
  1749. }
  1750. LRESULT CExtStatusControlBar::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
  1751. {
  1752. if( ( message == WM_PRINT
  1753. || message == WM_PRINTCLIENT 
  1754. )
  1755. && m_bCompleteRepaint
  1756. )
  1757. {
  1758. CDC * pDC = CDC::FromHandle( (HDC) wParam );
  1759. CRect rcWnd, rcClient;
  1760. GetWindowRect( &rcWnd );
  1761. GetClientRect( &rcClient );
  1762. ClientToScreen( rcClient );
  1763. rcClient.OffsetRect( -rcWnd.TopLeft() );
  1764. rcWnd.OffsetRect( -rcWnd.TopLeft() );
  1765. if( (lParam&PRF_NONCLIENT) != 0 )
  1766. {
  1767. pDC->ExcludeClipRect(rcClient);
  1768. CExtPaintManager::PAINTCONTROLBARBORDERSDATA _pcbbd(
  1769. this,
  1770. CExtPaintManager::__CB_OUTER_STATUSBAR,
  1771. m_dwStyle,
  1772. rcWnd
  1773. );
  1774. PmBridge_GetPM()->PaintControlBarBorders( *pDC, _pcbbd );
  1775. pDC->SelectClipRgn( NULL );
  1776. }
  1777. if( (lParam&(PRF_CLIENT|PRF_ERASEBKGND)) != 0 )
  1778. {
  1779. CPoint ptVpOffset( 0, 0 );
  1780. if( (lParam&PRF_NONCLIENT) != 0 )
  1781. {
  1782. ptVpOffset.x = rcWnd.left - rcClient.left;
  1783. ptVpOffset.y = rcWnd.top - rcClient.top;
  1784. }
  1785. if( ptVpOffset.x != 0
  1786. || ptVpOffset.y != 0
  1787. )
  1788. pDC->OffsetViewportOrg(
  1789. -ptVpOffset.x,
  1790. -ptVpOffset.y
  1791. );
  1792. DoPaint( pDC );
  1793. if( ptVpOffset.x != 0
  1794. || ptVpOffset.y != 0
  1795. )
  1796. pDC->OffsetViewportOrg(
  1797. ptVpOffset.x,
  1798. ptVpOffset.y
  1799. );
  1800. } // if( (lParam&(PRF_CLIENT|PRF_ERASEBKGND)) != 0 )
  1801. if( (lParam&PRF_CHILDREN) != 0 )
  1802. CExtPaintManager::stat_PrintChildren(
  1803. m_hWnd,
  1804. message,
  1805. pDC->GetSafeHdc(),
  1806. lParam,
  1807. false
  1808. );
  1809. return (!0);
  1810. }
  1811. return CStatusBar::WindowProc(message, wParam, lParam);
  1812. }
  1813. LRESULT CExtStatusControlBar::OnSizeParent( WPARAM wParam, LPARAM lParam )
  1814. {
  1815. ASSERT_VALID( this );
  1816. LRESULT lResult = CStatusBar::OnSizeParent( wParam, lParam );
  1817. HWND hWndOwn = GetSafeHwnd();
  1818. if( hWndOwn == NULL )
  1819. return lResult;
  1820. ::RedrawWindow(
  1821. hWndOwn,
  1822. NULL,
  1823. NULL,
  1824. RDW_INVALIDATE|RDW_ERASE|RDW_ALLCHILDREN
  1825. );
  1826. return lResult;
  1827. }
  1828. #endif // __EXT_MFC_NO_STATUSBAR