Ooextoolbar.cpp
上传用户:zhenhuadz
上传日期:2007-01-07
资源大小:1511k
文件大小:55k
源码类别:

远程控制编程

开发平台:

Visual C++

  1. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  2. // =  oooo   oooo  
  3. // = oooooo oooooo  
  4. // = oo  oo oo  oo  
  5. // = oo  oo oo  oo  
  6. // = oooooo oooooo  
  7. // =  oooo   oooo    Copyright ( c ) The Old Ones 1998
  8. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  9. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  10. // General information section.
  11. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  12. // $Author::                                                               $ User who last changed the file
  13. // $Date::                                                                 $ Date and time of last check in
  14. // $Revision::                                                             $ Visual SourceSafe version number
  15. // $Workfile::                                                             $ Filename
  16. // End =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  17. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  18. // History section.
  19. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  20. // $History::                                                              $
  21. // End =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 
  22. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  23. // @doc
  24. // @module OOExToolBar.cpp | 
  25. //         This module include an improved tool bar.
  26. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  27. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  28. // Include file section.
  29. // ------------------------------------------------------------------------
  30. // Precompile header file.
  31. #include "StdAfx.h"
  32. // Base class definition.
  33. #include "OOExToolBar.hpp"
  34. // Math include file.
  35. #include "math.h"
  36. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  37. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  38. // Macro and other definition.
  39. // ------------------------------------------------------------------------
  40. #ifdef _DEBUG
  41. #define new DEBUG_NEW
  42. #undef THIS_FILE
  43. static char THIS_FILE[] = __FILE__;
  44. #endif
  45. IMPLEMENT_DYNAMIC( COOExToolBar, CToolBar )
  46. BEGIN_MESSAGE_MAP( COOExToolBar, CToolBar )
  47. //{{AFX_MSG_MAP( COOExToolBar )
  48. ON_WM_NCCALCSIZE()
  49. ON_WM_CREATE()
  50. ON_WM_NCPAINT()
  51. ON_WM_SYSCOLORCHANGE()
  52.     ON_WM_WINDOWPOSCHANGING()
  53. //}}AFX_MSG_MAP
  54. END_MESSAGE_MAP()
  55. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  56. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  57. // Initialization and destruction method.
  58. // ------------------------------------------------------------------------
  59. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  60. // @mfunc:    (IMPLEMENTATION)
  61. //            <c COOExToolBar> 
  62. //            This is the main constructor.
  63. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  64. COOExToolBar::COOExToolBar( void )
  65. {
  66.     // Set the default flag.
  67.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  68.     m_nShowIconMode = 1;        // Large icon.
  69.     m_bShowIconText = false;     // Text.
  70.     m_SmallIconSize = CSize( 16, 16 );
  71.     m_LargeIconSize = CSize( 32, 32 );
  72.     m_bOldFloating=false; 
  73. }
  74. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  75. // @mfunc:    (IMPLEMENTATION)
  76. //            <c COOExToolBar> 
  77. //            This is the main destructor.
  78. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  79. COOExToolBar::~COOExToolBar( void )
  80. {
  81.     // Free the image list associated memory.
  82.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  83.     for ( int i=0; i<NB_POSSIBLE_MODE; i++ )
  84.     {
  85.         if ( m_ImageList[ i ].GetSafeHandle() )
  86.             m_ImageList[ i ].DeleteImageList();
  87.     }
  88. }
  89. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  90. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  91. // Mode related method.
  92. // ------------------------------------------------------------------------
  93. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  94. // @mfunc:    (FUNCTIONAL)
  95. //            <c COOExToolBar> 
  96. //            To view large or small icon.
  97. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  98. void COOExToolBar::SetIconMode( 
  99.      UINT _nShowIconMode )  // @Parm 0 Small Icon, 1 Large Icon, 2 Extra Large Icon.
  100. {
  101.     // Store the new value.
  102.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  103.     m_nShowIconMode = _nShowIconMode;
  104.     // Load the image list.
  105.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  106.     AssignImageList();
  107.     // Resize the toolbar.
  108.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  109.     ResizeToolBar();
  110. }
  111. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  112. // @mfunc:    (FUNCTIONAL)
  113. //            <c COOExToolBar> 
  114. //            To get the large or small icon mode.
  115. // @RDesc     0 Small Icon, 1 Large Icon, 2 Extra Large Icon.
  116. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  117. UINT COOExToolBar::GetIconMode( void ) const
  118. {
  119.     return m_nShowIconMode;
  120. }
  121. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  122. // @mfunc:    (FUNCTIONAL)
  123. //            <c COOExToolBar> 
  124. //            To set the text on or off.
  125. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  126. void COOExToolBar::SetTextMode( 
  127.      bool _bShowIconText )  // @Parm True to view the text, false to hide it.
  128. {
  129.     // Store the new value.
  130.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  131.     m_bShowIconText = _bShowIconText;
  132.     // Resize the toolbar.
  133.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  134.     ResizeToolBar();
  135. }
  136. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  137. // @mfunc:    (FUNCTIONAL)
  138. //            <c COOExToolBar> 
  139. //            To get the text on or off.
  140. // @RDesc     True if the text is on, False otherwise.
  141. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  142. bool COOExToolBar::GetTextMode( void ) const
  143. {
  144.     return m_bShowIconText;
  145. }
  146. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  147. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  148. // Loading information.
  149. // ------------------------------------------------------------------------
  150. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  151. // @mfunc:    (FUNCTIONAL)
  152. //            <c COOExToolBar> 
  153. //            To load the toolbar information.
  154. // @RDesc     True if the tool bar is loaded.
  155. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  156. BOOL COOExToolBar::LoadToolBar( 
  157.      UINT _ResourceId )     // @Parm The toolbar resource id.
  158. {
  159.     // Convert the resource id into a resource name and load the toolbar
  160.     // using the base class method.
  161.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  162.     CString lpszResourceName;
  163.     lpszResourceName.Format( "#%d", _ResourceId );
  164.     BOOL bReturn = CToolBar::LoadToolBar( lpszResourceName );
  165.     // Check if we loaded the toolbar.
  166.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  167.     if ( bReturn == FALSE )
  168.     {
  169.         return bReturn;
  170.     }
  171.     // Retrieve the height of the toolbar before putting text.
  172.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  173.     CToolBarCtrl& bar = GetToolBarCtrl();
  174.     int nIndex = 0;
  175.     CRect NoTextRc( 0, 0, 0, 0 );
  176.     bar.GetItemRect( 0, NoTextRc );
  177.   
  178. // Set the text for each button.
  179.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  180.     TBBUTTON tb;
  181.     for ( nIndex = bar.GetButtonCount(); nIndex >= 0; nIndex-- )
  182.     {
  183.         ZeroMemory(&tb, sizeof(TBBUTTON));
  184.         bar.GetButton(nIndex, &tb);
  185.         // Do we have a separator?
  186.         if ( ( tb.fsStyle & TBSTYLE_SEP ) ==  TBSTYLE_SEP ) {
  187.             continue;
  188.         }
  189.         // Have we got a valid command id?
  190.         if ( tb.idCommand == 0 ) {
  191.             continue;
  192.         }
  193. // Get the resource string if there is one.
  194.         CString strText((LPCSTR)tb.idCommand);
  195.         LPCTSTR lpszButtonText = NULL;
  196.         CString strButtonText(_T(&""));
  197.         _TCHAR seps[] = _T(&"n");
  198.         if ( !strText.IsEmpty() ) {
  199.             lpszButtonText = _tcstok( ( LPTSTR ) ( LPCTSTR ) strText, seps );
  200.             while( lpszButtonText )
  201.             {
  202.                 strButtonText = lpszButtonText;
  203.                 lpszButtonText = _tcstok( NULL, seps );
  204.             } 
  205.         }
  206.         if ( !strButtonText.IsEmpty() ) {
  207.             SetButtonText( nIndex, strButtonText );
  208.         }
  209.     }
  210. // Calculate the effect of the text on the toolbar.
  211.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  212. CRect rc( 0, 0, 0, 0 );
  213. CSize sizeMax( 0, 0 );
  214. for ( nIndex = bar.GetButtonCount(); nIndex >= 0; nIndex-- )
  215. {
  216. bar.GetItemRect( nIndex, rc );
  217. rc.NormalizeRect();
  218. sizeMax.cx = __max( rc.Size().cx, sizeMax.cx );
  219. sizeMax.cy = __max( rc.Size().cy, sizeMax.cy );
  220. }
  221.     // Resize the toolbar.
  222.     // The text width is the maximum width of the bitmap.  All toolbar size
  223.     // must at least be this width.
  224.     // The text height is the height added to the button.  Even in large mode
  225.     // we must add this text height.
  226.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  227.     m_nTextWidth = sizeMax.cx;
  228.     m_nTextHeight = sizeMax.cy - ( NoTextRc.Size().cy );
  229.     ResizeToolBar();
  230.     // Create the needed image list.
  231.     // Build the image list.
  232.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  233.     CClientDC dc( this );
  234.     int nNbBits = dc.GetDeviceCaps( BITSPIXEL );
  235.     for ( int i=0; i<NB_POSSIBLE_MODE; i++ )
  236.     {
  237.         UINT nColorMode = ILC_COLOR;
  238.         if ( nNbBits > 8 )
  239.         {
  240.             nColorMode = ILC_COLORDDB;
  241.         }
  242.         CSize Size = m_LargeIconSize;
  243.         if ( i < 3 )
  244.         {
  245.             Size = m_SmallIconSize;
  246.         }
  247.       
  248.         m_ImageList[ i ].Create( Size.cx, Size.cy, nColorMode | ILC_MASK, bar.GetButtonCount(), 10 );
  249.     }
  250.     return bReturn;
  251. }
  252. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  253.     
  254. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  255. // Image list initialization method.
  256. // ------------------------------------------------------------------------
  257. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  258. // @mfunc:    (FUNCTIONAL)
  259. //            <c COOExToolBar> 
  260. //            To set the image list.
  261. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  262. void COOExToolBar::SetImageList( 
  263.      ImageMode_ _Mode,       // @Parm The image mode.
  264.      CImageList& _rList )    // @Parm The hoover image list.
  265. {
  266.     // Store the list handle for future use.
  267.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  268.     m_ImageList[ _Mode ].Attach( _rList.Detach() );
  269. }
  270. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  271. // @mfunc:    (FUNCTIONAL)
  272. //            <c COOExToolBar> 
  273. //            To set the current mode appropriate image list.
  274. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  275. void COOExToolBar::AssignImageList( void )
  276. {
  277.     // Prepare the list associated with the current mode.
  278.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  279.     CImageList* pTempHotList;
  280.     CImageList* pTempNormalList;
  281.     CImageList* pTempDisableList;
  282.     if ( m_nShowIconMode == 0 )
  283.     {
  284.         pTempHotList     = &m_ImageList[ SmallHot ];
  285.         pTempNormalList  = &m_ImageList[ SmallStandard ];
  286.         pTempDisableList = &m_ImageList[ SmallDisable ];
  287.     }
  288.     if ( m_nShowIconMode == 1 )
  289.     {
  290.         pTempHotList     = &m_ImageList[ LargeHot ];
  291.         pTempNormalList  = &m_ImageList[ LargeStandard ];
  292.         pTempDisableList = &m_ImageList[ LargeDisable ];
  293.     }
  294.     // Set the list in the control.
  295.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  296.     SetHotImageList( pTempHotList );
  297.     SetStandardImageList( pTempNormalList );
  298.     SetDisableImageList( pTempDisableList );
  299. }
  300. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  301. // @mfunc:    (FUNCTIONAL)
  302. //            <c COOExToolBar> 
  303. //            To set the image list in the control.
  304. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  305. void COOExToolBar::InitImageList( void )
  306. {
  307.     // Set the image list according to the current mode.
  308.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  309.     AssignImageList();
  310. }
  311. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  312. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  313. // Private Image list method.
  314. // ------------------------------------------------------------------------
  315. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  316. // @mfunc:    (FUNCTIONAL)
  317. //            <c COOExToolBar> 
  318. //            Method to calculate the current size of the button.
  319. // @rdesc     The button size.
  320. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  321. CSize COOExToolBar::CalcButtonSize( void )
  322. {
  323.     // Calcul the width of the drop button.
  324.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  325.     CSize theButtonSize;
  326.     if ( m_nShowIconMode == 0 )
  327.     {
  328.         theButtonSize = CSize( m_SmallIconSize.cx + 8, m_SmallIconSize.cy + 7 );
  329.     }
  330.     else if ( m_nShowIconMode == 1 )
  331.     {
  332.         theButtonSize = CSize( m_LargeIconSize.cx + 8, m_LargeIconSize.cy + 7 );
  333.     }
  334.     // Check the text mode and set or hide the text.
  335.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  336.     if ( m_bShowIconText )
  337.     {
  338.         // The text width is the maximum width of the bitmap.  All toolbar size
  339.         // must at least be this width.
  340.         if ( theButtonSize.cx < m_nTextWidth ) 
  341.         {
  342.             theButtonSize.cx = m_nTextWidth;
  343.         }
  344.         // The text height is the height added to the button.  Even in large mode
  345.         // we must add this text height.
  346.         theButtonSize.cy += m_nTextHeight;
  347.     }
  348.     return theButtonSize;
  349. }
  350. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  351. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  352. // Image list information method.
  353. // ------------------------------------------------------------------------
  354. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  355. // @mfunc:    (FUNCTIONAL)
  356. //            <c COOExToolBar> 
  357. //            To set the hoover image list.
  358. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  359. void COOExToolBar::SetHotImageList( 
  360.      CImageList* pList )    // @Parm The hoover image list.
  361. {
  362.     // Retrieve the tool bar control and set the list reference.
  363.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  364. CWnd* pWnd = &GetToolBarCtrl();
  365. pWnd->SendMessage( TB_SETHOTIMAGELIST, 0, ( LPARAM ) ( HIMAGELIST ) *pList );
  366. }
  367. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  368. // @mfunc:    (FUNCTIONAL)
  369. //            <c COOExToolBar> 
  370. //            To set the normal image list.
  371. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  372. void COOExToolBar::SetStandardImageList( 
  373.      CImageList* pList )    // @Parm The normal image list.
  374. {
  375.     // Retrieve the tool bar control and set the list reference.
  376.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  377. CWnd* pWnd = &GetToolBarCtrl();
  378. pWnd->SendMessage( TB_SETIMAGELIST, 0, ( LPARAM ) ( HIMAGELIST ) *pList );
  379. }
  380. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  381. // @mfunc:    (FUNCTIONAL)
  382. //            <c COOExToolBar> 
  383. //            To set the disable image list.
  384. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  385. void COOExToolBar::SetDisableImageList( 
  386.      CImageList* pList )    // @Parm The normal image list.
  387. {
  388.     // Retrieve the tool bar control and set the list reference.
  389.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  390. CWnd* pWnd = &GetToolBarCtrl();
  391. pWnd->SendMessage( TB_SETDISABLEDIMAGELIST, 0, ( LPARAM ) ( HIMAGELIST ) *pList );
  392. }
  393. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  394. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  395. // Usefull protected method.
  396. // ------------------------------------------------------------------------
  397. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  398. // @mfunc:    (FUNCTIONAL)
  399. //            <c COOExToolBar> 
  400. //            To display the dropdown button for the given button.
  401. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  402. void COOExToolBar::SetButtonDropDown( 
  403.      int nID )  // @Parm The id to show the drop down.
  404. {
  405. // Change button style to dropdown.
  406.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  407. DWORD dwStyle = GetButtonStyle( CommandToIndex( nID ) );
  408. dwStyle |= TBSTYLE_DROPDOWN;
  409. SetButtonStyle( CommandToIndex( nID ), dwStyle );
  410.     // Calculate the drop button size.
  411.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  412.     CToolBarCtrl& bar = GetToolBarCtrl();
  413.     CSize theStdButtonSize = CalcButtonSize();
  414.     CRect rc( 0, 0, 0, 0 );
  415.     bar.GetItemRect( CommandToIndex( nID ), rc );
  416.     m_nDropButtonSize = rc.Width() - theStdButtonSize.cx;
  417. }
  418. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  419. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  420. // Usefull protected method.
  421. // ------------------------------------------------------------------------
  422. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  423. // @mfunc:    (FUNCTIONAL)
  424. //            <c COOExToolBar> 
  425. //            To resieze the toolbar once something change.
  426. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  427. void COOExToolBar::ResizeToolBar( void )
  428. {
  429.     // Set the size of the toolbar corresponding to the current mode.
  430.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  431.     CSize theSize = ( m_nShowIconMode == 0 ) ? m_SmallIconSize : m_LargeIconSize;
  432.     CSize theButtonSize = CalcButtonSize();
  433.     // Resize the toolbar and the dock frame.
  434.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  435. SetSizes( theButtonSize, theSize );
  436.     MoveWindow( 0, 0, 450, theButtonSize.cy );
  437.     SendMessage( WM_SIZE, SIZE_RESTORED );
  438.     CFrameWnd* pFrameWnd = GetDockingFrame();
  439. pFrameWnd->DelayRecalcLayout();
  440. }
  441. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  442. // @mfunc:    (FUNCTIONAL)
  443. //            <c COOExToolBar> 
  444. //            To draw the gripper on the toolbar.
  445. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  446. void COOExToolBar::DrawGripper( 
  447.      CDC& dc ) const        // @Parm The device context where to draw the gripper.
  448. {
  449.     // No gripper if floating
  450.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  451. if( m_dwStyle & CBRS_FLOATING )
  452.     {
  453. return;
  454.     }
  455.     // Retrieve the window coord and calculate the gripper position.
  456.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  457. CRect gripper;
  458. GetWindowRect( gripper );
  459. ScreenToClient( gripper );
  460. gripper.OffsetRect( -gripper.left, -gripper.top );
  461.     // Draw it accordingly to the orientation of the toolbar.
  462.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  463.     COLORREF clrBtnHilight = ::GetSysColor(COLOR_BTNHILIGHT);
  464.     COLORREF clrBtnShadow = ::GetSysColor(COLOR_BTNSHADOW);
  465.     if( m_dwStyle & CBRS_ORIENT_HORZ ) {
  466. // gripper at left
  467. gripper.DeflateRect( 3, 3 );
  468. gripper.right = gripper.left+3;
  469.         dc.Draw3dRect( gripper, clrBtnHilight, clrBtnShadow );
  470. gripper.OffsetRect(5, 0);
  471.         dc.Draw3dRect( gripper, clrBtnHilight, clrBtnShadow );
  472. }
  473. else {
  474. // gripper at top
  475. gripper.DeflateRect( 3, 3 );
  476. gripper.bottom = gripper.top+3;
  477. dc.Draw3dRect( gripper, clrBtnHilight, clrBtnShadow );
  478. gripper.OffsetRect(0, 5);
  479.         dc.Draw3dRect( gripper, clrBtnHilight, clrBtnShadow );
  480. }
  481. }
  482. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  483. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  484. // MFC Overloaded method.
  485. // ------------------------------------------------------------------------
  486. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  487. // @mfunc:    (FUNCTIONAL)
  488. //            <c COOExToolBar> 
  489. //            Only overloaded to use our cmdui instead of their.  This is
  490. //            the same code found in CToolBar::OnUpdateCmdUI, but we 
  491. //            replace the CCmdUI by CCoolCmdUI.
  492. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  493. void COOExToolBar::OnUpdateCmdUI( 
  494.      CFrameWnd* pTarget,        // @Parm ??
  495.      BOOL bDisableIfNoHndler )  // @Parm ??
  496. {
  497. CCoolCmdUI state; // this is the only line that's different--PD
  498. state.m_pOther = this;
  499. state.m_nIndexMax = ( UINT ) DefWindowProc( TB_BUTTONCOUNT, 0, 0 );
  500. for ( state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax; state.m_nIndex++ )
  501. {
  502. // get button state
  503. TBBUTTON button;
  504. VERIFY( DefWindowProc( TB_GETBUTTON, state.m_nIndex, ( LPARAM ) &button ) );
  505. // TBSTATE_ENABLED == TBBS_DISABLED so invert it
  506. button.fsState ^= TBSTATE_ENABLED;
  507. state.m_nID = button.idCommand;
  508. // ignore separators
  509. if ( !( button.fsStyle & TBSTYLE_SEP ) )
  510. {
  511. // allow the toolbar itself to have update handlers
  512. if ( CWnd::OnCmdMsg( state.m_nID, CN_UPDATE_COMMAND_UI, &state, NULL ) )
  513. continue;
  514. // allow the owner to process the update
  515. state.DoUpdate( pTarget, bDisableIfNoHndler );
  516. }
  517. }
  518. // update the dialog controls added to the toolbar
  519. UpdateDialogControls( pTarget, bDisableIfNoHndler );
  520. }
  521. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  522. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  523. // MFC Message method.
  524. // ------------------------------------------------------------------------
  525. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  526. // @mfunc:    (FUNCTIONAL)
  527. //            <c COOExToolBar> 
  528. //            This will draw the gripper on the toolbar then repaints
  529. //            client areas.
  530. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  531. void COOExToolBar::OnNcPaint( void ) 
  532. {
  533. CControlBar::EraseNonClient();
  534. CWindowDC dc( this );
  535. DrawGripper( dc );
  536. CRect pRect;
  537. GetClientRect( &pRect );
  538. InvalidateRect( &pRect, TRUE );
  539. CWnd* pWnd = &GetToolBarCtrl();
  540. pWnd->GetClientRect( &pRect ); 
  541. pWnd->InvalidateRect( &pRect, TRUE ); 
  542. }
  543. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  544. // @mfunc:    (FUNCTIONAL)
  545. //            <c COOExToolBar> 
  546. //            Trap to set the flat bar style.
  547. // @RDesc     Nonzero if the toolbar is correctly created.
  548. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  549. int COOExToolBar::OnCreate( 
  550.     LPCREATESTRUCT lpCreateStruct ) // @Parm Toolbar creation information.
  551. {
  552.     // Call the base class method.
  553.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  554. if ( CToolBar::OnCreate( lpCreateStruct ) == -1 )
  555.     {
  556. return -1;
  557.     }
  558.     // Set the style to flat.
  559.     // There is a but when docking vertical.  The size of the separator
  560.     // is not calculate correctly by MFC.  Only in style flat.
  561.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  562. ModifyStyle( 0, TBSTYLE_FLAT );
  563. SendMessage( TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_DRAWDDARROWS );
  564.     
  565.     // The window is now created.
  566.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  567. return 0;
  568. }
  569. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  570. // @mfunc:    (FUNCTIONAL)
  571. //            <c COOExToolBar> 
  572. //            Trap to size correctly the toolbar with the carret.
  573. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  574. void COOExToolBar::OnNcCalcSize(
  575.      BOOL bCalcValidRects,              // @Parm MFC Specific message.
  576.      NCCALCSIZE_PARAMS FAR* lpncsp )    // @Parm MFC Specific message.
  577. {
  578.     // No gripper if floating
  579.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  580. if( !( m_dwStyle & CBRS_FLOATING ) )
  581.     {
  582.         // Adjust non-client area for gripper at left or top.
  583.     if( m_dwStyle & CBRS_ORIENT_HORZ ) {
  584.     lpncsp->rgrc[0].left += 5;
  585.     lpncsp->rgrc[0].right += 5;
  586.     }
  587.     else {
  588.     lpncsp->rgrc[0].top += 5;
  589.     lpncsp->rgrc[0].bottom += 5;
  590.     }
  591.     }
  592. CToolBar::OnNcCalcSize( bCalcValidRects, lpncsp );
  593. }
  594. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  595. // @mfunc:    (FUNCTIONAL)
  596. //            <c COOExToolBar> 
  597. //            Call when ever the system color are changing. Trap to rebuild
  598. //            the toolbar image list with the good background color.
  599. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  600. void COOExToolBar::OnSysColorChange( void ) 
  601. {
  602.     // Call the base class method.
  603.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  604.     CToolBar::OnSysColorChange();
  605. }
  606. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  607. // @mfunc:    (FUNCTIONAL)
  608. //            <c COOExToolBar> 
  609. //            Call when the toolbar is moved.  There is a bug when the tool
  610. //            bar is in flat mode, and in vertical position.  The separator
  611. //            are not count in the height, so the last button is not completly
  612. //            displayed.
  613. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  614. void COOExToolBar::OnWindowPosChanging( LPWINDOWPOS _pWindowPos ) 
  615. {
  616.     // Default processing
  617.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  618.     if( m_bOldFloating != ( IsFloating()?true:false ) )
  619.     {
  620.         m_bOldFloating = !m_bOldFloating;
  621.         _pWindowPos->flags |= SWP_DRAWFRAME;
  622.     }
  623.     CToolBar::OnWindowPosChanging( _pWindowPos );
  624. }           
  625. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  626. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  627. // MFC Overloaded method.
  628. // The following stuff is to make the command update UI mechanism
  629. // work properly for flat tool bars. The main idea is to convert
  630. // a "checked" button state into a "pressed" button state. Changed 
  631. // lines marked with "PD"
  632. // ------------------------------------------------------------------------
  633. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  634. // @mfunc:    (FUNCTIONAL)
  635. //            <c CCoolCmdUI> 
  636. //            Came from Paul Dilascia Article.
  637. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  638. void CCoolCmdUI::Enable( BOOL bOn )
  639. {
  640. m_bEnableChanged = TRUE;
  641. CToolBar* pToolBar = ( CToolBar* ) m_pOther;
  642. ASSERT( pToolBar != NULL );
  643. ASSERT_KINDOF( CToolBar, pToolBar );
  644. ASSERT( m_nIndex < m_nIndexMax );
  645. UINT nNewStyle = pToolBar->GetButtonStyle( m_nIndex ) & ~TBBS_DISABLED;
  646. if ( !bOn )
  647. {
  648. nNewStyle |= TBBS_DISABLED;
  649. // WINBUG: If a button is currently pressed and then is disabled
  650. // COMCTL32.DLL does not unpress the button, even after the mouse
  651. // button goes up!  We work around this bug by forcing TBBS_PRESSED
  652. // off when a button is disabled.
  653. nNewStyle &= ~TBBS_PRESSED;
  654. }
  655. ASSERT( !( nNewStyle & TBBS_SEPARATOR ) );
  656. pToolBar->SetButtonStyle( m_nIndex, nNewStyle );
  657. }
  658. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  659. // @mfunc:    (FUNCTIONAL)
  660. //            <c CCoolCmdUI> 
  661. //            Came from Paul Dilascia Article.
  662. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  663. void CCoolCmdUI::SetCheck( int nCheck )
  664. {
  665. ASSERT( nCheck >= 0 && nCheck <= 2 ); // 0=>off, 1=>on, 2=>indeterminate
  666. CToolBar* pToolBar = ( CToolBar* ) m_pOther;
  667. ASSERT( pToolBar != NULL );
  668. ASSERT_KINDOF( CToolBar, pToolBar );
  669. ASSERT( m_nIndex < m_nIndexMax );
  670. UINT nOldStyle = pToolBar->GetButtonStyle( m_nIndex ); // PD
  671. UINT nNewStyle = nOldStyle &
  672. ~( TBBS_PRESSED | TBBS_INDETERMINATE ); // PD
  673. if ( nCheck == 1 )
  674. nNewStyle |= TBBS_PRESSED; // PD
  675. else if ( nCheck == 2 )
  676. nNewStyle |= TBBS_INDETERMINATE;
  677. // Following is to fix display bug for TBBS_CHECKED:
  678. // If new state is unchecked, repaint--but only if style actually changing.
  679. // (Otherwise will end up with flicker)
  680. // 
  681. if ( nNewStyle != nOldStyle ) {
  682. ASSERT( !( nNewStyle & TBBS_SEPARATOR ) );
  683. pToolBar->SetButtonStyle( m_nIndex, nNewStyle );
  684. pToolBar->Invalidate();
  685. }
  686. }
  687. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  688. CSize COOExToolBar::CalcDynamicLayout(int nLength, DWORD dwMode)
  689. {
  690. if ((nLength == -1) && 
  691.    !(dwMode & LM_MRUWIDTH) && !(dwMode & LM_COMMIT) &&
  692.    ((dwMode & LM_HORZDOCK) ||  (dwMode & LM_VERTDOCK)))
  693. {
  694. return CalcFixedLayout(dwMode & LM_STRETCH, dwMode & LM_HORZDOCK);
  695. }
  696. return CalcLayout(dwMode, nLength);
  697. }
  698. //////////////////
  699. // 1998 Microsoft Systems Journal - Paul DiLascia
  700. // This is the all-important function that gets the true size of a button,
  701. // instead of using m_sizeButton. And it's virtual, so you can override if
  702. // my algorithm doesn't work, as will surely be the case in some circumstances.
  703. //
  704. CSize COOExToolBar::GetButtonSize(TBBUTTON* pData, int iButton)
  705. {
  706. // Get the actual size of the button, not what's in m_sizeButton.
  707. // Make sure to do SendMessage instead of calling MFC's GetItemRect,
  708. // which has all sorts of bad side-effects! (Go ahead, take a look at it.)
  709. // 
  710. CRect rc;
  711. SendMessage(TB_GETITEMRECT, iButton, (LPARAM)&rc);
  712. CSize sz = rc.Size();
  713. ////////////////
  714. // Now must do special case for various versions of comctl32.dll,
  715. //
  716. DWORD dwStyle = pData[iButton].fsStyle;
  717. if ((pData[iButton].fsState & TBSTATE_WRAP)) {
  718. if (dwStyle & TBSTYLE_SEP) {
  719. // this is the last separator in the row (eg vertically docked)
  720. // fudge the height, and ignore the width. TB_GETITEMRECT will return
  721. // size = (8 x 22) even for a separator in vertical toolbar
  722. //
  723. sz.cy = sz.cx;
  724. sz.cx = 0; // separator takes no width if it's the last one
  725.         } else if (dwStyle & TBSTYLE_DROPDOWN ) {//&&
  726. //!m_bShowDropdownArrowWhenVertical) {
  727. // ignore width of dropdown
  728. sz.cx = 0;
  729. }
  730. }
  731. return sz;
  732. }
  733. //////////////////
  734. // 1998 Microsoft Systems Journal - Paul DiLascia
  735. // I renamed this from _GetButton.
  736. //
  737. void COOExToolBar::GetButton(int nIndex, TBBUTTON* pButton) const
  738. {
  739. CToolBar* pBar = (CToolBar*)this;
  740. VERIFY(pBar->SendMessage(TB_GETBUTTON, nIndex, (LPARAM)pButton));
  741. // TBSTATE_ENABLED == TBBS_DISABLED so invert it
  742. pButton->fsState ^= TBSTATE_ENABLED;
  743. }
  744. //////////////////
  745. // 1998 Microsoft Systems Journal - Paul DiLascia
  746. // I renamed this from _SetButton.
  747. //
  748. void COOExToolBar::SetButton(int nIndex, TBBUTTON* pButton)
  749. {
  750. // get original button state
  751. TBBUTTON button;
  752. VERIFY(SendMessage(TB_GETBUTTON, nIndex, (LPARAM)&button));
  753. // prepare for old/new button comparsion
  754. button.bReserved[0] = 0;
  755. button.bReserved[1] = 0;
  756. // TBSTATE_ENABLED == TBBS_DISABLED so invert it
  757. pButton->fsState ^= TBSTATE_ENABLED;
  758. pButton->bReserved[0] = 0;
  759. pButton->bReserved[1] = 0;
  760. // nothing to do if they are the same
  761. if (memcmp(pButton, &button, sizeof(TBBUTTON)) != 0)
  762. {
  763. // don't redraw everything while setting the button
  764. DWORD dwStyle = GetStyle();
  765. ModifyStyle(WS_VISIBLE, 0);
  766. VERIFY(SendMessage(TB_DELETEBUTTON, nIndex, 0));
  767. VERIFY(SendMessage(TB_INSERTBUTTON, nIndex, (LPARAM)pButton));
  768. ModifyStyle(0, dwStyle & WS_VISIBLE);
  769. // invalidate appropriate parts
  770. if (((pButton->fsStyle ^ button.fsStyle) & TBSTYLE_SEP) ||
  771. ((pButton->fsStyle & TBSTYLE_SEP) && pButton->iBitmap != button.iBitmap))
  772. {
  773. // changing a separator
  774. Invalidate(FALSE);
  775. }
  776. else
  777. {
  778. // invalidate just the button
  779. CRect rect;
  780. if (SendMessage(TB_GETITEMRECT, nIndex, (LPARAM)&rect))
  781. InvalidateRect(rect, FALSE);    // don't erase background
  782. }
  783. }
  784. }
  785. //////////////////
  786. // 1998 Microsoft Systems Journal - Paul DiLascia
  787. // Make the parent frame my owner. This is important for status bar
  788. // prompts to work.
  789. //
  790. ////////////////////////////////////////////////////////////////
  791. // 1998 Microsoft Systems Journal - Paul DiLascia
  792. // Stuff below is copied from MFC, my mods marked **PD**
  793. #ifdef _MAC
  794. #define CX_OVERLAP  1
  795. #else
  796. #define CX_OVERLAP  0
  797. #endif
  798. CSize COOExToolBar::CalcSize(TBBUTTON* pData, int nCount)
  799. {
  800. ASSERT(pData != NULL && nCount > 0);
  801. CPoint cur(0,0);
  802. CSize sizeResult(0,0);
  803. int cyTallestOnRow = 0;
  804. for (int i = 0; i < nCount; i++)
  805. {
  806. if (pData[i].fsState & TBSTATE_HIDDEN)
  807. continue;
  808. // **PD** Load actual size of button into local var
  809. // that obscures CToolBar::m_sizeButton.
  810. CSize m_sizeButton = GetButtonSize(pData, i);
  811. // **PD** I also changed the logic below to be more correct.
  812. cyTallestOnRow = max(cyTallestOnRow, m_sizeButton.cy);
  813. sizeResult.cx = max(cur.x + m_sizeButton.cx, sizeResult.cx);
  814. sizeResult.cy = max(cur.y + m_sizeButton.cy, sizeResult.cy);
  815. cur.x += m_sizeButton.cx - CX_OVERLAP;
  816. if (pData[i].fsState & TBSTATE_WRAP)
  817. {
  818. cur.x = 0;
  819. cur.y += cyTallestOnRow;
  820. cyTallestOnRow = 0;
  821. if (pData[i].fsStyle & TBSTYLE_SEP)
  822. cur.y += m_sizeButton.cy;
  823. }
  824. }
  825. return sizeResult;
  826. }
  827. int COOExToolBar::WrapToolBar(TBBUTTON* pData, int nCount, int nWidth)
  828. {
  829. ASSERT(pData != NULL && nCount > 0);
  830. int nResult = 0;
  831. int x = 0;
  832. for (int i = 0; i < nCount; i++)
  833. {
  834. pData[i].fsState &= ~TBSTATE_WRAP;
  835. if (pData[i].fsState & TBSTATE_HIDDEN)
  836. continue;
  837. int dx, dxNext;
  838. // **PD** Load actual size of button into local var
  839. // that obscures CToolBar::m_sizeButton.
  840. CSize m_sizeButton = GetButtonSize(pData, i);
  841. dx = m_sizeButton.cx;
  842. dxNext = dx - CX_OVERLAP;
  843. if (x + dx > nWidth)
  844. {
  845. BOOL bFound = FALSE;
  846. for (int j = i; j >= 0  &&  !(pData[j].fsState & TBSTATE_WRAP); j--)
  847. {
  848. // Find last separator that isn't hidden
  849. // a separator that has a command ID is not
  850. // a separator, but a custom control.
  851. if ((pData[j].fsStyle & TBSTYLE_SEP) &&
  852. (pData[j].idCommand == 0) &&
  853. !(pData[j].fsState & TBSTATE_HIDDEN))
  854. {
  855. bFound = TRUE; i = j; x = 0;
  856. pData[j].fsState |= TBSTATE_WRAP;
  857. nResult++;
  858. break;
  859. }
  860. }
  861. if (!bFound)
  862. {
  863. for (int j = i - 1; j >= 0 && !(pData[j].fsState & TBSTATE_WRAP); j--)
  864. {
  865. // Never wrap anything that is hidden,
  866. // or any custom controls
  867. if ((pData[j].fsState & TBSTATE_HIDDEN) ||
  868. ((pData[j].fsStyle & TBSTYLE_SEP) &&
  869. (pData[j].idCommand != 0)))
  870. continue;
  871. bFound = TRUE; i = j; x = 0;
  872. pData[j].fsState |= TBSTATE_WRAP;
  873. nResult++;
  874. break;
  875. }
  876. if (!bFound)
  877. x += dxNext;
  878. }
  879. }
  880. else
  881. x += dxNext;
  882. }
  883. return nResult + 1;
  884. }
  885. //////////////////////////////////////////////////////////////////////////
  886. // 1998 Microsoft Systems Journal - Paul DiLascia
  887. // Functions below are NOT modified. They're only here because they
  888. // call the modified functions above, which are NOT virtual.
  889. void  COOExToolBar::SizeToolBar(TBBUTTON* pData, int nCount, int nLength, BOOL bVert)
  890. {
  891. ASSERT(pData != NULL && nCount > 0);
  892. if (!bVert)
  893. {
  894. int nMin, nMax, nTarget, nCurrent, nMid;
  895. // Wrap ToolBar as specified
  896. nMax = nLength;
  897. nTarget = WrapToolBar(pData, nCount, nMax);
  898. // Wrap ToolBar vertically
  899. nMin = 0;
  900. nCurrent = WrapToolBar(pData, nCount, nMin);
  901. if (nCurrent != nTarget)
  902. {
  903. while (nMin < nMax)
  904. {
  905. nMid = (nMin + nMax) / 2;
  906. nCurrent = WrapToolBar(pData, nCount, nMid);
  907. if (nCurrent == nTarget)
  908. nMax = nMid;
  909. else
  910. {
  911. if (nMin == nMid)
  912. {
  913. WrapToolBar(pData, nCount, nMax);
  914. break;
  915. }
  916. nMin = nMid;
  917. }
  918. }
  919. }
  920. CSize size = CalcSize(pData, nCount);
  921. WrapToolBar(pData, nCount, size.cx);
  922. }
  923. else
  924. {
  925. CSize sizeMax, sizeMin, sizeMid;
  926. // Wrap ToolBar vertically
  927. WrapToolBar(pData, nCount, 0);
  928. sizeMin = CalcSize(pData, nCount);
  929. // Wrap ToolBar horizontally
  930. WrapToolBar(pData, nCount, 32767);
  931. sizeMax = CalcSize(pData, nCount);
  932. while (sizeMin.cx < sizeMax.cx)
  933. {
  934. sizeMid.cx = (sizeMin.cx + sizeMax.cx) / 2;
  935. WrapToolBar(pData, nCount, sizeMid.cx);
  936. sizeMid = CalcSize(pData, nCount);
  937. if (nLength < sizeMid.cy)
  938. {
  939. if (sizeMin == sizeMid)
  940. {
  941. WrapToolBar(pData, nCount, sizeMax.cx);
  942. return;
  943. }
  944. sizeMin = sizeMid;
  945. }
  946. else if (nLength > sizeMid.cy)
  947. sizeMax = sizeMid;
  948. else
  949. return;
  950. }
  951. }
  952. }
  953. struct _AFX_CONTROLPOS
  954. {
  955. int nIndex, nID;
  956. CRect rectOldPos;
  957. };
  958. CSize COOExToolBar::CalcLayout(DWORD dwMode, int nLength)
  959. {
  960. ASSERT_VALID(this);
  961. ASSERT(::IsWindow(m_hWnd));
  962. if (dwMode & LM_HORZDOCK)
  963. ASSERT(dwMode & LM_HORZ);
  964. int nCount;
  965. TBBUTTON* pData;
  966. CSize sizeResult(0,0);
  967. // Load Buttons
  968. {
  969. nCount = SendMessage(TB_BUTTONCOUNT, 0, 0);
  970. if (nCount != 0)
  971. {
  972. int i;
  973. pData = new TBBUTTON[nCount];
  974. for (i = 0; i < nCount; i++)
  975. GetButton(i, &pData[i]); // **PD** renamed from _GetButton
  976. }
  977. }
  978. if (nCount > 0)
  979. {
  980. if (!(m_dwStyle & CBRS_SIZE_FIXED))
  981. {
  982. BOOL bDynamic = m_dwStyle & CBRS_SIZE_DYNAMIC;
  983. if (bDynamic && (dwMode & LM_MRUWIDTH))
  984. SizeToolBar(pData, nCount, m_nMRUWidth);
  985. else if (bDynamic && (dwMode & LM_HORZDOCK))
  986. SizeToolBar(pData, nCount, 32767);
  987. else if (bDynamic && (dwMode & LM_VERTDOCK))
  988. SizeToolBar(pData, nCount, 0);
  989. else if (bDynamic && (nLength != -1))
  990. {
  991. CRect rect; rect.SetRectEmpty();
  992. CalcInsideRect(rect, (dwMode & LM_HORZ));
  993. BOOL bVert = (dwMode & LM_LENGTHY);
  994. int nLen = nLength + (bVert ? rect.Height() : rect.Width());
  995. SizeToolBar(pData, nCount, nLen, bVert);
  996. }
  997. else if (bDynamic && (m_dwStyle & CBRS_FLOATING))
  998. SizeToolBar(pData, nCount, m_nMRUWidth);
  999. else
  1000. SizeToolBar(pData, nCount, (dwMode & LM_HORZ) ? 32767 : 0);
  1001. }
  1002. sizeResult = CalcSize(pData, nCount);
  1003. if (dwMode & LM_COMMIT)
  1004. {
  1005. _AFX_CONTROLPOS* pControl = NULL;
  1006. int nControlCount = 0;
  1007. BOOL bIsDelayed = m_bDelayedButtonLayout;
  1008. m_bDelayedButtonLayout = FALSE;
  1009. for(int i = 0; i < nCount; i++)
  1010. if ((pData[i].fsStyle & TBSTYLE_SEP) && (pData[i].idCommand != 0))
  1011. nControlCount++;
  1012. if (nControlCount > 0)
  1013. {
  1014. pControl = new _AFX_CONTROLPOS[nControlCount];
  1015. nControlCount = 0;
  1016. for(int i = 0; i < nCount; i++)
  1017. {
  1018. if ((pData[i].fsStyle & TBSTYLE_SEP) && (pData[i].idCommand != 0))
  1019. {
  1020. pControl[nControlCount].nIndex = i;
  1021. pControl[nControlCount].nID = pData[i].idCommand;
  1022. CRect rect;
  1023. GetItemRect(i, &rect);
  1024. ClientToScreen(&rect);
  1025. pControl[nControlCount].rectOldPos = rect;
  1026. nControlCount++;
  1027. }
  1028. }
  1029. }
  1030. if ((m_dwStyle & CBRS_FLOATING) && (m_dwStyle & CBRS_SIZE_DYNAMIC))
  1031. m_nMRUWidth = sizeResult.cx;
  1032. for (i = 0; i < nCount; i++)
  1033. SetButton(i, &pData[i]); // **PD** renamed from _SetButton
  1034. if (nControlCount > 0)
  1035. {
  1036. for (int i = 0; i < nControlCount; i++)
  1037. {
  1038. CWnd* pWnd = GetDlgItem(pControl[i].nID);
  1039. if (pWnd != NULL)
  1040. {
  1041. CRect rect;
  1042. pWnd->GetWindowRect(&rect);
  1043. CPoint pt = rect.TopLeft() - pControl[i].rectOldPos.TopLeft();
  1044. GetItemRect(pControl[i].nIndex, &rect);
  1045. pt = rect.TopLeft() + pt;
  1046. pWnd->SetWindowPos(NULL, pt.x, pt.y, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER);
  1047. }
  1048. }
  1049. delete[] pControl;
  1050. }
  1051. m_bDelayedButtonLayout = bIsDelayed;
  1052. }
  1053. delete[] pData;
  1054. }
  1055. //BLOCK: Adjust Margins
  1056. {
  1057. CRect rect; rect.SetRectEmpty();
  1058. CalcInsideRect(rect, (dwMode & LM_HORZ));
  1059. sizeResult.cy -= rect.Height();
  1060. sizeResult.cx -= rect.Width();
  1061. CSize size = CControlBar::CalcFixedLayout((dwMode & LM_STRETCH), (dwMode & LM_HORZ));
  1062. sizeResult.cx = max(sizeResult.cx, size.cx);
  1063. sizeResult.cy = max(sizeResult.cy, size.cy);
  1064. }
  1065. return sizeResult;
  1066. }
  1067. CSize COOExToolBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
  1068. {
  1069. DWORD dwMode = bStretch ? LM_STRETCH : 0;
  1070. dwMode |= bHorz ? LM_HORZ : 0;
  1071. return CalcLayout(dwMode);
  1072. }
  1073. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1074. // Macro and other definition.
  1075. // ------------------------------------------------------------------------
  1076. IMPLEMENT_DYNAMIC( COOBmpToolBar, COOExToolBar )
  1077. BEGIN_MESSAGE_MAP( COOBmpToolBar, COOExToolBar )
  1078. //{{AFX_MSG_MAP( COOBmpToolBar )
  1079. //}}AFX_MSG_MAP
  1080. END_MESSAGE_MAP()
  1081. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1082. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1083. // Initialization and destruction method.
  1084. // ------------------------------------------------------------------------
  1085. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1086. // @mfunc:    (IMPLEMENTATION)
  1087. //            <c COOBmpToolBar> 
  1088. //            This is the main constructor.
  1089. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1090. COOBmpToolBar::COOBmpToolBar( void )
  1091. {
  1092. }
  1093. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1094. // @mfunc:    (IMPLEMENTATION)
  1095. //            <c COOBmpToolBar> 
  1096. //            This is the main destructor.
  1097. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1098. COOBmpToolBar::~COOBmpToolBar( void )
  1099. {
  1100. }
  1101. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1102. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1103. // Image list initialization method.
  1104. // ------------------------------------------------------------------------
  1105. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1106. // @mfunc:    (FUNCTIONAL)
  1107. //            <c COOBmpToolBar> 
  1108. //            To set the image list in the control.
  1109. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1110. void COOBmpToolBar::InitImageList( void )
  1111. {
  1112.     // Build the image list.
  1113.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1114.     for ( int i=0; i<NB_POSSIBLE_MODE; i++ )
  1115.     {
  1116.         BuildImageList( m_ImageList[ i ], m_256Image[ i ] );
  1117.     }
  1118.     // Set the image list according to the current mode.
  1119.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1120.     AssignImageList();
  1121. }
  1122. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1123. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1124. // Private Image list method.
  1125. // ------------------------------------------------------------------------
  1126. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1127. // @mfunc:    (FUNCTIONAL)
  1128. //            <c COOBmpToolBar> 
  1129. //            To build an image list based on the given bitmap and size.
  1130. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1131. void COOBmpToolBar::BuildImageList( 
  1132.      CImageList& _rImageList,       // @Parm The image list to build.
  1133.      const CExBitmap& _rBitmap )    // @Parm The bitmap to put in the image list.
  1134. {
  1135.     CBitmap bmpImage;
  1136.     bmpImage.LoadBitmap( _rBitmap.m_nResourceId );
  1137.     _rImageList.Add( &bmpImage, _rBitmap.m_clrTransparent );
  1138. }
  1139. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1140. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1141. // Image list information method.
  1142. // ------------------------------------------------------------------------
  1143. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1144. // @mfunc:    (FUNCTIONAL)
  1145. //            <c COOBmpToolBar> 
  1146. //            To set the small hoover bitmap.
  1147. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1148. void COOBmpToolBar::SetBitmap( 
  1149.      UINT _nBitmap,         // @Parm The bitmap id.
  1150.      ImageMode_ _Mode,      // @Parm The image mode.
  1151.      COLORREF _clrBk,       // @Parm The background color.
  1152.      bool _b256 )           // @Parm The nb of color.
  1153. {
  1154.     // Initialise the bitmap info.
  1155.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1156.     if ( _b256 )
  1157.     {
  1158.         m_256Image[ _Mode ].m_nResourceId = _nBitmap;
  1159.         m_256Image[ _Mode ].m_clrTransparent = _clrBk;
  1160.     }
  1161.     else
  1162.     {
  1163.         m_16Image[ _Mode ].m_nResourceId = _nBitmap;
  1164.         m_16Image[ _Mode ].m_clrTransparent = _clrBk;
  1165.     }
  1166. }
  1167. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1168. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1169. // Usefull protected method.
  1170. // ------------------------------------------------------------------------
  1171. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1172. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1173. // MFC Overloaded method.
  1174. // ------------------------------------------------------------------------
  1175. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1176. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1177. // MFC Message method.
  1178. // ------------------------------------------------------------------------
  1179. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1180. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1181. // Macro and other definition.
  1182. // ------------------------------------------------------------------------
  1183. IMPLEMENT_DYNAMIC( COOIconToolBar, COOExToolBar )
  1184. BEGIN_MESSAGE_MAP( COOIconToolBar, COOExToolBar )
  1185. //{{AFX_MSG_MAP( COOIconToolBar )
  1186. //}}AFX_MSG_MAP
  1187. END_MESSAGE_MAP()
  1188. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1189. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1190. // Initialization and destruction method.
  1191. // ------------------------------------------------------------------------
  1192. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1193. // @mfunc:    (IMPLEMENTATION)
  1194. //            <c COOIconToolBar> 
  1195. //            This is the main constructor.
  1196. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1197. COOIconToolBar::COOIconToolBar( void )
  1198. {
  1199. }
  1200. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1201. // @mfunc:    (IMPLEMENTATION)
  1202. //            <c COOIconToolBar> 
  1203. //            This is the main destructor.
  1204. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1205. COOIconToolBar::~COOIconToolBar( void )
  1206. {
  1207.     // Free the image list associated memory.
  1208.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1209.     for ( int i=0; i<NB_POSSIBLE_MODE; i++ )
  1210.     {
  1211.         if ( m_ImageList[ i ].GetSafeHandle() )
  1212.             m_ImageList[ i ].DeleteImageList();
  1213.     }
  1214. }
  1215. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1216. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1217. // Private usefull method.
  1218. // ------------------------------------------------------------------------
  1219. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1220. // @mfunc:    (IMPLEMENTATION)
  1221. //            <c COOIconToolBar> 
  1222. //            To convert the given icon into grayscale.
  1223. // @rdesc     The gray scale icon.
  1224. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1225. HICON COOIconToolBar::ConvertIconToGrayScale( 
  1226.         HICON _hIcon,           // @Parm The icon to convert.
  1227.         CSize _sizeImage )      // @Parm The icon size.
  1228. {
  1229.     // Validate the given icon.
  1230.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1231.     if ( _hIcon == 0 )
  1232.     {
  1233.         return NULL;
  1234.     }
  1235.     // Create a device context and initialise it.
  1236.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1237.     CDC dcMem;
  1238.     dcMem.CreateCompatibleDC( NULL );
  1239.     dcMem.SetBkMode( TRANSPARENT );
  1240.     // We need to load the icon into the context to initialise as a full color
  1241.     // context.
  1242.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1243.     ICONINFO IconInformation;
  1244.     GetIconInfo( _hIcon, &IconInformation );
  1245.     
  1246.     // Create the bitmap to store the gray image.
  1247.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1248.     CBitmap bmpMem;
  1249.     bmpMem.CreateBitmap( _sizeImage.cx, _sizeImage.cx, 1, 16, NULL );
  1250.     CBitmap* pOldBmp = ( CBitmap* ) dcMem.SelectObject( &bmpMem );
  1251.     // Draw the icon in the context.
  1252.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1253.     dcMem.DrawState( CPoint( 0, 0 ), _sizeImage, ( HICON ) _hIcon, DST_ICON | DSS_NORMAL, ( CBrush* ) NULL );
  1254.     // Retrieve each pixels and set them in gray scale.
  1255.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1256.     for ( int nRow = 0; nRow < _sizeImage.cy; nRow++ )
  1257.     {
  1258.         for ( int nColumn = 0; nColumn < _sizeImage.cx; nColumn++ )
  1259.         {
  1260.             COLORREF clrPixels = dcMem.GetPixel( nColumn, nRow );
  1261.             long lSquareSum = GetRValue( clrPixels ) * GetRValue( clrPixels ) +
  1262.                               GetBValue( clrPixels ) * GetBValue( clrPixels ) +
  1263.                               GetGValue( clrPixels ) * GetGValue( clrPixels );
  1264.             int nGray = ( int ) sqrt( ( ( double ) lSquareSum ) / 3 );
  1265.             dcMem.SetPixel( nColumn, nRow, RGB( nGray, nGray, nGray ) );
  1266.         }
  1267.     }
  1268.     dcMem.SelectObject( pOldBmp );
  1269.     // Set the grayscale bitmap in the icon.
  1270.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1271.     IconInformation.hbmColor = ( HBITMAP ) bmpMem.Detach();
  1272.     // Create it and return.
  1273.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1274.     return CreateIconIndirect( &IconInformation );
  1275. }
  1276. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1277. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1278. // Image list information method.
  1279. // ------------------------------------------------------------------------
  1280. // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1281. // @mfunc:    (FUNCTIONAL)
  1282. //            <c COOIconToolBar> 
  1283. //            To set the button icon.
  1284. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1285. void COOIconToolBar::SetIcon( 
  1286.         UINT _nStandardIcon,        // @Parm The button standard icon.
  1287.         UINT _nDisableIcon,         // @Parm The button disable icon.
  1288.         UINT _nHotIcon )            // @Parm The button icon when the mouse is over.
  1289. {
  1290.     // If the hot icon is 0, use the standard icon.
  1291.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1292.     if ( _nHotIcon == 0 )
  1293.     {
  1294.         _nHotIcon = _nStandardIcon;
  1295.     }
  1296.     
  1297.     // Retrieve the small icon from the resource and add them in the image
  1298.     // list.
  1299.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1300.     {
  1301.         CSize Size = m_SmallIconSize;
  1302.         HICON hStandardIcon = 
  1303.             ( HICON ) ::LoadImage( AfxGetApp()->m_hInstance, 
  1304.                                    MAKEINTRESOURCE( _nStandardIcon ), 
  1305.                                    IMAGE_ICON, Size.cx, Size.cy, 0 );
  1306.         HICON hHotIcon = 
  1307.             ( HICON ) ::LoadImage( AfxGetApp()->m_hInstance, 
  1308.                                    MAKEINTRESOURCE( _nHotIcon ), 
  1309.                                    IMAGE_ICON, Size.cx, Size.cy, 0 );
  1310.         HICON hDisableIcon;
  1311.         if ( _nDisableIcon == 0 )
  1312.         {
  1313.             hDisableIcon = ConvertIconToGrayScale( hStandardIcon, Size );
  1314.         }
  1315.         else
  1316.         {
  1317.             hDisableIcon = 
  1318.             ( HICON ) ::LoadImage( AfxGetApp()->m_hInstance, 
  1319.                                    MAKEINTRESOURCE( _nDisableIcon ), 
  1320.                                    IMAGE_ICON, Size.cx, Size.cy, 0 );
  1321.         }
  1322.         // Add them in the image list.
  1323.         m_ImageList[ SmallHot ].Add( hHotIcon );
  1324.         m_ImageList[ SmallStandard ].Add( hStandardIcon );
  1325.         m_ImageList[ SmallDisable ].Add( hDisableIcon );
  1326.     }
  1327.     // Retrieve the large icon from the resource and add them in the image
  1328.     // list.
  1329.     // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1330.     {
  1331.         CSize Size = m_LargeIconSize;
  1332.         HICON hStandardIcon = 
  1333.             ( HICON ) ::LoadImage( AfxGetApp()->m_hInstance, 
  1334.                                    MAKEINTRESOURCE( _nStandardIcon ), 
  1335.                                    IMAGE_ICON, Size.cx, Size.cy, 0 );
  1336.         HICON hHotIcon = 
  1337.             ( HICON ) ::LoadImage( AfxGetApp()->m_hInstance, 
  1338.                                    MAKEINTRESOURCE( _nHotIcon ), 
  1339.                                    IMAGE_ICON, Size.cx, Size.cy, 0 );
  1340.         HICON hDisableIcon;
  1341.         if ( _nDisableIcon == 0 )
  1342.         {
  1343.             hDisableIcon = ConvertIconToGrayScale( hStandardIcon, Size );
  1344.         }
  1345.         else
  1346.         {
  1347.             hDisableIcon = 
  1348.             ( HICON ) ::LoadImage( AfxGetApp()->m_hInstance, 
  1349.                                    MAKEINTRESOURCE( _nDisableIcon ), 
  1350.                                    IMAGE_ICON, Size.cx, Size.cy, 0 );
  1351.         }
  1352.         // Add them in the image list.
  1353.         m_ImageList[ LargeHot ].Add( hHotIcon );
  1354.         m_ImageList[ LargeStandard ].Add( hStandardIcon );
  1355.         m_ImageList[ LargeDisable ].Add( hDisableIcon );
  1356.     }
  1357. }
  1358. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1359. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1360. // Usefull protected method.
  1361. // ------------------------------------------------------------------------
  1362. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1363. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1364. // MFC Overloaded method.
  1365. // ------------------------------------------------------------------------
  1366. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1367. // Start =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  1368. // MFC Message method.
  1369. // ------------------------------------------------------------------------
  1370. // @end =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=