ToolBarXP.cpp
上传用户:ckg1000
上传日期:2013-01-26
资源大小:630k
文件大小:11k
源码类别:

CAD

开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //
  3. // ToolBarXP.cpp: implementation of the CToolBarXP class.
  4. //
  5. ///////////////////////////////////////////////////////////////////////////////
  6. #include "stdafx.h"
  7. #include "ToolBarXP.h"
  8. #include "Tools.h"
  9. #include "Draw.h"
  10. #include "MenuXP.h"
  11. #ifdef _DEBUG
  12. #undef THIS_FILE
  13. static char THIS_FILE[]=__FILE__;
  14. #define new DEBUG_NEW
  15. #endif
  16. // From <afximpl.h>
  17. struct AUX_DATA
  18. {
  19. int _unused1, _unused2;
  20. int _unused3, _unused4;
  21. int cxBorder2, cyBorder2;
  22. };
  23. extern __declspec(dllimport) AUX_DATA afxData;
  24. class INIT_afxData
  25. {
  26. public:
  27.     INIT_afxData ()
  28.     {
  29.         afxData.cxBorder2 = afxData.cyBorder2 = 0;
  30.     }
  31. } g_afxData2;
  32. ///////////////////////////////////////////////////////////////////////////////
  33. CToolBarXP::CToolBarXP () : m_bCheckVisibility (false)
  34. {
  35. }
  36. ///////////////////////////////////////////////////////////////////////////////
  37. BOOL CToolBarXP::LoadToolBar (UINT nIDResource)
  38. {
  39.     if ( !CToolBar::LoadToolBar (nIDResource) )
  40.     {
  41.         return false;
  42.     }
  43.     SetBorders (CRect(1,3,6,4));
  44.     SendMessage (TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_DRAWDDARROWS);
  45.     return true;
  46. }
  47. ///////////////////////////////////////////////////////////////////////////////
  48. bool CToolBarXP::InsertControl (int nIndex, CWnd& Ctrl)
  49. {
  50.     TBBUTTON tbbutton;
  51.     int nCount = DefWindowProc (TB_BUTTONCOUNT, 0, 0);
  52.     CWindowRect rcCtrl (Ctrl);
  53.     tbbutton.iBitmap = rcCtrl.Width();
  54.     tbbutton.idCommand = Ctrl.GetDlgCtrlID();
  55.     tbbutton.fsState = 0;
  56.     tbbutton.fsStyle = TBSTYLE_SEP;
  57.     tbbutton.bReserved[0] = 0;
  58.     tbbutton.bReserved[1] = 0;
  59.     tbbutton.iString = -1;
  60.     tbbutton.dwData = NULL;
  61.     if ( nIndex < 0 || nIndex > nCount )
  62.     {
  63.         nIndex = nCount;
  64.     }
  65.     if ( GetToolBarCtrl().InsertButton (nIndex, &tbbutton) )
  66.     {
  67.         m_bDelayedButtonLayout = true;
  68.         return true;
  69.     }
  70.     return false;
  71. }
  72. ///////////////////////////////////////////////////////////////////////////////
  73. void CToolBarXP::TrackPopupMenu (int nID, CMenu* pMenu)
  74. {
  75.     CRect rcTBItem;
  76.     int nTBIndex = CommandToIndex (nID);
  77.     TPMPARAMS tpmp = { sizeof TPMPARAMS };
  78.     
  79.     GetItemRect (nTBIndex, rcTBItem);
  80.     ClientToScreen (rcTBItem);
  81.     CopyRect (&tpmp.rcExclude, rcTBItem);
  82.     rcTBItem.OffsetRect (4, 0);
  83.     CMenuXP::SetMRUMenuBarItem (rcTBItem);
  84.     SetButtonStyle (nTBIndex, GetButtonStyle (nTBIndex)|TBBS_INDETERMINATE);
  85.     UpdateWindow();
  86.     ::TrackPopupMenuEx (pMenu->GetSafeHmenu(), TPM_LEFTBUTTON, tpmp.rcExclude.left, tpmp.rcExclude.bottom, GetParentFrame()->GetSafeHwnd(), &tpmp);
  87.     SetButtonStyle (nTBIndex, GetButtonStyle (nTBIndex)&~TBBS_INDETERMINATE);
  88. }
  89. ///////////////////////////////////////////////////////////////////////////////
  90. LRESULT CToolBarXP::DefWindowProc (UINT nMsg, WPARAM wParam, LPARAM lParam)
  91. {
  92.     LRESULT lRes = CToolBar::DefWindowProc (nMsg, wParam, lParam);
  93.     if ( m_bCheckVisibility && nMsg == TB_GETBUTTON )
  94.     {
  95.         TBBUTTON* pButton = (TBBUTTON*)lParam;
  96.         if ( IS_CONTROL(*pButton) )
  97.         {
  98.             if ( m_bCheckVisibility == 1 ) pButton->fsState |=  TBSTATE_HIDDEN;
  99.             else                           pButton->fsState &= ~TBSTATE_HIDDEN;
  100.         }
  101.     }
  102.     return lRes;
  103. }
  104. ///////////////////////////////////////////////////////////////////////////////
  105. CSize CToolBarXP::CalcDynamicLayout (int nLength, DWORD dwMode)
  106. {
  107.     bool bHideControls = (dwMode & LM_VERTDOCK) == LM_VERTDOCK;
  108.     m_bCheckVisibility = (BYTE)(bHideControls ? 1 : 2);
  109.     CSize size = CToolBar::CalcDynamicLayout (nLength, dwMode);
  110.     m_bCheckVisibility = false;
  111.     if ( dwMode & LM_COMMIT )
  112.     {
  113.         TBBUTTON tbbutton;
  114.         int nCount = DefWindowProc (TB_BUTTONCOUNT, 0, 0);
  115.         for ( int i = 0; i < nCount; i++ )
  116.         {
  117.             VERIFY(DefWindowProc (TB_GETBUTTON, i, (LPARAM)&tbbutton));
  118.             if ( !IS_CONTROL(tbbutton) )
  119.             {
  120.                 continue;
  121.             }
  122.             CWnd* pWnd = GetDlgItem (tbbutton.idCommand);
  123.             if ( pWnd == NULL )
  124.             {
  125.                 continue;
  126.             }
  127.             if ( bHideControls )
  128.             {
  129.                 GetToolBarCtrl().HideButton (tbbutton.idCommand, true);
  130.                 pWnd->ShowWindow (SW_HIDE);
  131.             }
  132.             else
  133.             {
  134.                 GetToolBarCtrl().HideButton (tbbutton.idCommand, false);
  135.                 // Update control position
  136.                 CRect rcControl;
  137.                 VERIFY (DefWindowProc (TB_GETITEMRECT, i, (LPARAM)&rcControl));
  138.                 rcControl.DeflateRect (1, 1);
  139.                 
  140.                 CWindowRect rcCtrl (pWnd);
  141.                 int         nNoSize = 0;
  142.                 if ( rcControl.Width() == rcCtrl.Width() )
  143.                 {
  144.                     nNoSize = SWP_NOSIZE;
  145.                 }
  146.                 pWnd->SetWindowPos (NULL, rcControl.left, rcControl.top, rcControl.Width(), rcControl.Height(),
  147.                                     nNoSize|SWP_NOACTIVATE|SWP_NOZORDER|SWP_SHOWWINDOW);
  148.             }
  149.         }
  150.     }
  151.     return size;
  152. }
  153. ///////////////////////////////////////////////////////////////////////////////
  154. BEGIN_MESSAGE_MAP(CToolBarXP, CToolBar)
  155.     //{{AFX_MSG_MAP(CToolBarXP)
  156.     ON_WM_PAINT()
  157.     ON_NOTIFY_REFLECT(TBN_DROPDOWN, OnButtonDropDown)
  158.     //}}AFX_MSG_MAP
  159. END_MESSAGE_MAP()
  160. IMPLEMENT_DYNAMIC(CToolBarXP, CToolBar)
  161. ///////////////////////////////////////////////////////////////////////////////
  162. // Paint the toolbar
  163. void CToolBarXP::OnPaint ()
  164. {
  165.     if ( m_bDelayedButtonLayout )
  166.     {
  167.         Layout();
  168.     }
  169.     CPaintDC cpDC (this);
  170.     CBufferDC cDC (cpDC);
  171.     CRect rcClip;
  172.     cDC.GetClipBox (rcClip);
  173.     cDC.SetBkMode (TRANSPARENT);
  174.     cDC.SelectObject (CFont::FromHandle ((HFONT)GetStockObject (DEFAULT_GUI_FONT)));
  175.     cDC.FillSolidRect (rcClip, HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), 20, 0));
  176.     CPoint ptCursor;
  177.     ::GetCursorPos (&ptCursor);
  178.     ScreenToClient (&ptCursor);
  179.     CClientRect rcClient (this);
  180.     HIMAGELIST m_hImageList = (HIMAGELIST)DefWindowProc (TB_GETIMAGELIST, 0, 0);
  181.     TBBUTTON tbbutton;
  182.     int nCount = DefWindowProc (TB_BUTTONCOUNT, 0, 0);
  183.     int nHotItem = GetToolBarCtrl().GetHotItem();
  184.     for ( int i = 0; i < nCount; i++ )
  185.     {
  186.         VERIFY(DefWindowProc (TB_GETBUTTON, i, (LPARAM)&tbbutton));
  187.         if ( !IS_VISIBLE(tbbutton) )
  188.         {
  189.             continue;
  190.         }
  191.         CRect rcButton;
  192.         VERIFY(DefWindowProc (TB_GETITEMRECT, i, (LPARAM)&rcButton));
  193.         if ( !CRect().IntersectRect (rcClip, rcButton) )
  194.         {
  195.             continue;
  196.         }
  197.         bool bOver = nHotItem == i && IS_ENABLED(tbbutton);
  198.         bool bPressed = false;
  199.         if ( IS_INDETERMINATE(tbbutton) )
  200.         {
  201.             CPenDC pen (cDC, ::GetSysColor (COLOR_3DDKSHADOW));
  202.             cDC.MoveTo (rcButton.left, rcButton.bottom);
  203.             cDC.LineTo (rcButton.left, rcButton.top);
  204.             cDC.LineTo (rcButton.right-1, rcButton.top);
  205.             cDC.LineTo (rcButton.right-1, rcButton.bottom-1);
  206.             cDC.LineTo (rcButton.left, rcButton.bottom-1);
  207.             bOver = true;
  208.         }
  209.         else if ( bOver || IS_CHECKED(tbbutton) )
  210.         {
  211.             bPressed = KEYDOWN(VK_LBUTTON) && rcButton.PtInRect (ptCursor);
  212.             if ( IS_DROPDOWN(tbbutton) && bPressed )
  213.             {
  214.                 bPressed = ptCursor.x < rcButton.right-13;
  215.                 if ( bPressed )
  216.                 {
  217.                     rcButton.right -= 13;
  218.                 }
  219.             }
  220.             COLORREF crHighLight = ::GetSysColor (COLOR_HIGHLIGHT);
  221.             CPenDC pen (cDC, crHighLight);
  222.             CBrushDC brush (cDC, bPressed||(bOver&&IS_CHECKED(tbbutton)) ? HLS_TRANSFORM (crHighLight, +50, -50) : (bOver ? HLS_TRANSFORM (crHighLight, +70, -57) : HLS_TRANSFORM (crHighLight, +80, -66)));
  223.             cDC.Rectangle (&rcButton);
  224.             if ( IS_DROPDOWN(tbbutton) )
  225.             {
  226.                 if ( bPressed )
  227.                 {
  228.                     int nLeft = rcButton.left;
  229.                     rcButton.left = rcButton.right-1;
  230.                     rcButton.right += 13;
  231.                     brush.Color (HLS_TRANSFORM (crHighLight, +70, -66));
  232.                     cDC.Rectangle (&rcButton);
  233.                     rcButton.left = nLeft;
  234.                 }
  235.                 else
  236.                 {
  237.                     cDC.MoveTo (rcButton.right-14, rcButton.top);
  238.                     cDC.LineTo (rcButton.right-14, rcButton.bottom);
  239.                 }
  240.             }
  241.         }
  242.         if ( IS_SEPARATOR(tbbutton) )
  243.         {
  244.             CPenDC pen (cDC, HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), -15, 0));
  245.             if ( IS_WRAP(tbbutton) )
  246.             {
  247.                 cDC.MoveTo (rcClient.left+2, rcButton.bottom-4);
  248.                 cDC.LineTo (rcClient.right-2, rcButton.bottom-4);
  249.             }
  250.             else
  251.             {
  252.                 cDC.MoveTo ((rcButton.right+rcButton.left)/2-1, rcButton.top+2);
  253.                 cDC.LineTo ((rcButton.right+rcButton.left)/2-1, rcButton.bottom-2);
  254.             }
  255.         }
  256.         else if ( !IS_CONTROL(tbbutton) )
  257.         {
  258.             if ( IS_DROPDOWN(tbbutton) )
  259.             {
  260.                 CPenDC pen (cDC, ( bOver && !IS_INDETERMINATE(tbbutton) ) ? RGB(0,0,0) : ::GetSysColor (IS_ENABLED(tbbutton) ? COLOR_BTNTEXT : COLOR_GRAYTEXT));
  261.                 cDC.MoveTo (rcButton.right-9, (rcButton.top+rcButton.bottom)/2-1);
  262.                 cDC.LineTo (rcButton.right-4, (rcButton.top+rcButton.bottom)/2-1);
  263.                 cDC.MoveTo (rcButton.right-8, (rcButton.top+rcButton.bottom)/2);
  264.                 cDC.LineTo (rcButton.right-5, (rcButton.top+rcButton.bottom)/2);
  265.                 cDC.SetPixel (rcButton.right-7, (rcButton.top+rcButton.bottom)/2+1, pen.Color());
  266.                 rcButton.right -= 14;
  267.             }
  268.             if ( tbbutton.iBitmap >= 0 )
  269.             {
  270.                 if ( !IS_ENABLED(tbbutton) || (bOver && !bPressed) )
  271.                 {
  272.                     HICON hIcon = ImageList_ExtractIcon (NULL, m_hImageList, tbbutton.iBitmap);
  273.                     cDC.DrawState (CPoint (rcButton.left + ( bOver ? 4 : 3 ), rcButton.top + ( bOver ? 4 : 3 )), m_sizeImage, hIcon, DSS_MONO, CBrush (bOver ? (IS_INDETERMINATE(tbbutton) ? HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), -20, 0) : HLS_TRANSFORM (::GetSysColor (COLOR_HIGHLIGHT), +50, -66)) : HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), -27, 0)));
  274.                     DestroyIcon (hIcon);
  275.                 }
  276.                 if ( IS_ENABLED(tbbutton) )
  277.                 {
  278.                     ::ImageList_Draw (m_hImageList, tbbutton.iBitmap, cDC.m_hDC,
  279.                                       rcButton.left + ( (bOver && !bPressed) ? 2 : 3 ), rcButton.top + ( (bOver && !bPressed) ? 2 : 3 ), ILD_TRANSPARENT);
  280.                 }
  281.             }
  282.         }
  283.     }
  284. }
  285. ///////////////////////////////////////////////////////////////////////////////
  286. void CToolBarXP::OnButtonDropDown (NMHDR* lpnmhdr, LRESULT* plResult)
  287. {
  288.     LPNMTOOLBAR lpnmtb = (LPNMTOOLBAR)lpnmhdr;
  289.     *plResult = TBDDRET_DEFAULT;
  290.     if ( !m_pDockSite->SendMessage (WM_COMMAND, DROPDOWN(lpnmtb->iItem)) )
  291.     {
  292.         *plResult = TBDDRET_TREATPRESSED;
  293.     }
  294. }