RTToolBar.cpp
上传用户:qhonly
上传日期:2013-06-10
资源大小:487k
文件大小:11k
源码类别:

界面编程

开发平台:

Visual C++

  1. // RTToolBar.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "RTToolBar.h"
  5. #include "RTTools.h"
  6. #include "RTMenu.h"
  7. #include "RTDraw.h"
  8. // CRTToolBar
  9. IMPLEMENT_DYNAMIC(CRTToolBar, CToolBar)
  10. CRTToolBar::CRTToolBar()
  11. {
  12. }
  13. CRTToolBar::~CRTToolBar()
  14. {
  15. }
  16. BOOL CRTToolBar::EnableSkin(BOOL IsEnable)
  17. {
  18. BOOL temp = m_IsEnableSkin;
  19. m_IsEnableSkin = IsEnable;
  20. return temp;
  21. }
  22. BEGIN_MESSAGE_MAP(CRTToolBar, CToolBar)
  23. ON_WM_ERASEBKGND()
  24. ON_WM_PAINT()
  25. END_MESSAGE_MAP()
  26. CBitmap* CRTToolBar::m_ToolBarBitamp[4] = {NULL,NULL,NULL,NULL};
  27. UINT     CRTToolBar::m_ToolBarBitmapDrawMode[4] = {0,0,0,0};
  28. BOOL     CRTToolBar::m_IsEnableSkin = TRUE;
  29. // CRTToolBar 消息处理程序
  30. BOOL CRTToolBar::OnEraseBkgnd(CDC* pDC)
  31. {
  32. if(!m_IsEnableSkin)return CToolBar::OnEraseBkgnd(pDC);
  33. if(m_ToolBarBitamp[0] != NULL)
  34. {
  35. CRect rtWnd;
  36. GetWindowRect(&rtWnd);
  37. rtWnd.SetRect(0,0,rtWnd.Width(),rtWnd.Height());
  38. CRTDraw::RTDrawBitmap(pDC,&rtWnd,m_ToolBarBitamp[0],m_ToolBarBitmapDrawMode[0]);
  39. return TRUE;
  40. }
  41. return CToolBar::OnEraseBkgnd(pDC);
  42. }
  43. BOOL CRTToolBar::SetBitmap(CBitmap* ToolBarBitmap[],UINT DrawMode[])
  44. {
  45. for(int i = 0; i < 4; i ++)
  46. {
  47. m_ToolBarBitamp[i] = ToolBarBitmap[i];
  48. m_ToolBarBitmapDrawMode[i] = DrawMode[i];
  49. }
  50. return TRUE;
  51. }
  52. BOOL CRTToolBar::LoadToolBar (UINT nIDResource)
  53. {
  54.     if ( !CToolBar::LoadToolBar (nIDResource) )
  55.     {
  56.         return false;
  57.     }
  58. if(!m_IsEnableSkin)return TRUE;
  59.     SendMessage (TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_DRAWDDARROWS);
  60.     return true;
  61. }
  62. BOOL CRTToolBar::InsertControl (int nIndex, CWnd& Ctrl)
  63. {
  64.     TBBUTTON tbbutton;
  65.     int nCount = (int)DefWindowProc (TB_BUTTONCOUNT, 0, 0);
  66.     CWindowRect rcCtrl (Ctrl);
  67.     tbbutton.iBitmap = rcCtrl.Width();
  68.     tbbutton.idCommand = Ctrl.GetDlgCtrlID();
  69.     tbbutton.fsState = 0;
  70.     tbbutton.fsStyle = TBSTYLE_SEP;
  71.     tbbutton.bReserved[0] = 0;
  72.     tbbutton.bReserved[1] = 0;
  73.     tbbutton.iString = -1;
  74.     tbbutton.dwData = NULL;
  75.     if ( nIndex < 0 || nIndex > nCount )
  76.     {
  77.         nIndex = nCount;
  78.     }
  79.     if ( GetToolBarCtrl().InsertButton (nIndex, &tbbutton) )
  80.     {
  81.         m_bDelayedButtonLayout = true;
  82.         return true;
  83.     }
  84.     return false;
  85. }
  86. LRESULT CRTToolBar::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  87. {
  88. LRESULT lRes = CToolBar::WindowProc(message, wParam, lParam);
  89. if(!m_IsEnableSkin)return lRes;
  90.     if ( m_bCheckVisibility && message == TB_GETBUTTON )
  91.     {
  92.         TBBUTTON* pButton = (TBBUTTON*)lParam;
  93.         if ( IS_CONTROL(*pButton) )
  94.         {
  95.             if ( m_bCheckVisibility == 1 )
  96. pButton->fsState |=  TBSTATE_HIDDEN;
  97.             else                           
  98. pButton->fsState &= ~TBSTATE_HIDDEN;
  99.         }
  100.     }
  101.     return lRes;
  102. }
  103. void CRTToolBar::OnPaint()
  104. {
  105. if(!m_IsEnableSkin)return CToolBar::OnPaint();
  106. if ( m_bDelayedButtonLayout )
  107.     {
  108.         Layout();
  109.     }
  110.     CPaintDC cpDC (this);
  111. cpDC.SetBkMode(TRANSPARENT);
  112. CFont* pOldFont =  cpDC.SelectObject (CFont::FromHandle ((HFONT)GetStockObject (DEFAULT_GUI_FONT)));
  113. CRect rcClip;
  114. cpDC.GetClipBox(&rcClip);
  115.     CPoint ptCursor;
  116.     ::GetCursorPos (&ptCursor);
  117.     ScreenToClient (&ptCursor);
  118.     CClientRect rcClient (this);
  119.     HIMAGELIST m_hImageList = (HIMAGELIST)DefWindowProc (TB_GETIMAGELIST, 0, 0);
  120.     TBBUTTON tbbutton;
  121.     int nCount = (int)DefWindowProc (TB_BUTTONCOUNT, 0, 0);
  122.     int nHotItem = GetToolBarCtrl().GetHotItem();
  123.     for ( int i = 0; i < nCount; i++ )
  124.     {
  125.         VERIFY(DefWindowProc (TB_GETBUTTON, i, (LPARAM)&tbbutton));
  126.         if ( !IS_VISIBLE(tbbutton) )
  127.         {
  128.             continue;
  129.         }
  130.         CRect rcButton;
  131.         VERIFY(DefWindowProc (TB_GETITEMRECT, i, (LPARAM)&rcButton));
  132.         if ( !CRect().IntersectRect (rcClip, rcButton) )
  133.         {
  134.             continue;
  135.         }
  136.         bool bOver = nHotItem == i && IS_ENABLED(tbbutton);
  137.         bool bPressed = false;
  138.         if ( IS_INDETERMINATE(tbbutton) )
  139.         {
  140. CPenDC pen(cpDC.m_hDC, ::GetSysColor (COLOR_3DDKSHADOW));
  141.             cpDC.MoveTo (rcButton.left, rcButton.bottom);
  142.             cpDC.LineTo (rcButton.left, rcButton.top);
  143.             cpDC.LineTo (rcButton.right-1, rcButton.top);
  144.             cpDC.LineTo (rcButton.right-1, rcButton.bottom-1);
  145.             cpDC.LineTo (rcButton.left, rcButton.bottom-1);
  146.             bOver = true;
  147.         }
  148. //focus
  149.         else if ( bOver || IS_CHECKED(tbbutton) )
  150.         {
  151.             bPressed = KEYDOWN(VK_LBUTTON) && rcButton.PtInRect (ptCursor);
  152.             if ( IS_DROPDOWN(tbbutton) && bPressed )
  153.             {
  154.                 bPressed = ptCursor.x < rcButton.right-13;
  155.                 if ( bPressed )
  156.                 {
  157.                     rcButton.right -= 13;
  158.                 }
  159.             }
  160. COLORREF crHighLight = ::GetSysColor (COLOR_HIGHLIGHT);
  161. CPenDC pen (cpDC, crHighLight);
  162. CBrushDC brush (cpDC, bPressed||(bOver&&IS_CHECKED(tbbutton)) ? HLS_TRANSFORM (crHighLight, +50, -50) : (bOver ? HLS_TRANSFORM (crHighLight, +70, -57) : HLS_TRANSFORM (crHighLight, +80, -66)));
  163. if(bPressed && m_ToolBarBitamp[BMP_DOWN]!= NULL)
  164. {
  165. CRTDraw::RTDrawBitmap(&cpDC,&rcButton,m_ToolBarBitamp[BMP_DOWN],m_ToolBarBitmapDrawMode[BMP_DOWN]);
  166. }
  167. else if(!bPressed && m_ToolBarBitamp[BMP_FOCUS] != NULL)
  168. {
  169. CRTDraw::RTDrawBitmap(&cpDC,&rcButton,m_ToolBarBitamp[BMP_FOCUS],m_ToolBarBitmapDrawMode[BMP_FOCUS]);
  170. }
  171. else
  172. {
  173. cpDC.Rectangle (&rcButton);
  174. }
  175. if ( IS_DROPDOWN(tbbutton) )
  176. {
  177. if ( bPressed )
  178. {
  179. int nLeft = rcButton.left;
  180. rcButton.left = rcButton.right-1;
  181. rcButton.right += 13;
  182. if(m_ToolBarBitamp[BMP_DOWN] != NULL)
  183. {
  184. CRTDraw::RTDrawBitmap(&cpDC,rcButton,m_ToolBarBitamp[2],m_ToolBarBitmapDrawMode[BMP_DOWN]);
  185. }
  186. else
  187. {
  188. cpDC.Rectangle (&rcButton);
  189. brush.Color (HLS_TRANSFORM (crHighLight, +70, -66));
  190. cpDC.Rectangle (&rcButton);
  191. }
  192. rcButton.left = nLeft;
  193. }
  194. else
  195. {
  196. if(m_ToolBarBitamp[BMP_FOCUS] != NULL)
  197. {
  198. CRTDraw::RTDrawBitmap(&cpDC,rcButton,m_ToolBarBitamp[BMP_FOCUS],m_ToolBarBitmapDrawMode[BMP_FOCUS]);
  199. }
  200. else
  201. {
  202. cpDC.MoveTo (rcButton.right-14, rcButton.top);
  203. cpDC.LineTo (rcButton.right-14, rcButton.bottom);
  204. }
  205. }
  206. }
  207.         }
  208. //分隔条
  209.         if ( IS_SEPARATOR(tbbutton) )
  210.         {
  211.             CPenDC pen (cpDC, HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), -15, 0));
  212.             if ( IS_WRAP(tbbutton) )
  213.             {
  214.                 cpDC.MoveTo (rcClient.left+2, rcButton.bottom-4);
  215.                 cpDC.LineTo (rcClient.right-2, rcButton.bottom-4);
  216.             }
  217.             else
  218.             {
  219.                 cpDC.MoveTo ((rcButton.right+rcButton.left)/2-1, rcButton.top+2);
  220.                 cpDC.LineTo ((rcButton.right+rcButton.left)/2-1, rcButton.bottom-2);
  221.             }
  222.         }
  223.         else if ( !IS_CONTROL(tbbutton) )
  224.         {
  225.             if ( IS_DROPDOWN(tbbutton) )
  226.             {
  227. CPenDC pen (cpDC.m_hDC, ( bOver && !IS_INDETERMINATE(tbbutton) ) ? RGB(0,0,0) : ::GetSysColor (IS_ENABLED(tbbutton) ? COLOR_BTNTEXT : COLOR_GRAYTEXT));
  228.                 cpDC.MoveTo (rcButton.right-9, (rcButton.top+rcButton.bottom)/2-1);
  229.                 cpDC.LineTo (rcButton.right-4, (rcButton.top+rcButton.bottom)/2-1);
  230.                 cpDC.MoveTo (rcButton.right-8, (rcButton.top+rcButton.bottom)/2);
  231.                 cpDC.LineTo (rcButton.right-5, (rcButton.top+rcButton.bottom)/2);
  232.                 cpDC.SetPixel (rcButton.right-7, (rcButton.top+rcButton.bottom)/2+1, pen.Color());
  233.                 rcButton.right -= 14;
  234.             }
  235.             if ( tbbutton.iBitmap >= 0 )
  236.             {
  237.                 if ( !IS_ENABLED(tbbutton) || (bOver && !bPressed) )
  238.                 {
  239.                     HICON hIcon = ImageList_ExtractIcon (NULL, m_hImageList, tbbutton.iBitmap);
  240.                     cpDC.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)));
  241.                     DestroyIcon (hIcon);
  242.                 }
  243.                 if ( IS_ENABLED(tbbutton) )
  244.                 {
  245.                     ::ImageList_Draw (m_hImageList, tbbutton.iBitmap, cpDC.m_hDC,
  246.                                       rcButton.left + ( (bOver && !bPressed) ? 2 : 3 ), rcButton.top + ( (bOver && !bPressed) ? 2 : 3 ), ILD_TRANSPARENT);
  247.                 }
  248.             }
  249.         }
  250.     }
  251. }
  252. CSize CRTToolBar::CalcDynamicLayout (int nLength, DWORD dwMode)
  253. {
  254. if(!m_IsEnableSkin)return CToolBar::CalcDynamicLayout(nLength,dwMode);
  255.     bool bHideControls = (dwMode & LM_VERTDOCK) == LM_VERTDOCK;
  256.     m_bCheckVisibility = (BYTE)(bHideControls ? 1 : 2);
  257.     CSize size = CToolBar::CalcDynamicLayout (nLength, dwMode);
  258.     m_bCheckVisibility = false;
  259.     if ( dwMode & LM_COMMIT )
  260.     {
  261.         TBBUTTON tbbutton;
  262.         int nCount = (int)DefWindowProc (TB_BUTTONCOUNT, 0, 0);
  263.         for ( int i = 0; i < nCount; i++ )
  264.         {
  265.             VERIFY(DefWindowProc (TB_GETBUTTON, i, (LPARAM)&tbbutton));
  266.             if ( !IS_CONTROL(tbbutton) )
  267.             {
  268.                 continue;
  269.             }
  270.             CWnd* pWnd = GetDlgItem (tbbutton.idCommand);
  271.             if ( pWnd == NULL )
  272.             {
  273.                 continue;
  274.             }
  275.             if ( bHideControls )
  276.             {
  277.                 GetToolBarCtrl().HideButton (tbbutton.idCommand, true);
  278.                 pWnd->ShowWindow (SW_HIDE);
  279.             }
  280.             else
  281.             {
  282.                 GetToolBarCtrl().HideButton (tbbutton.idCommand, false);
  283.                 // Update control position
  284.                 CRect rcControl;
  285.                 VERIFY (DefWindowProc (TB_GETITEMRECT, i, (LPARAM)&rcControl));
  286.                 rcControl.DeflateRect (1, 1);
  287.                 
  288.                 CWindowRect rcCtrl (pWnd);
  289.                 int         nNoSize = 0;
  290.                 if ( rcControl.Width() == rcCtrl.Width() )
  291.                 {
  292.                     nNoSize = SWP_NOSIZE;
  293.                 }
  294.                 pWnd->SetWindowPos (NULL, rcControl.left, rcControl.top, rcControl.Width(), rcControl.Height(),
  295.                                     nNoSize|SWP_NOACTIVATE|SWP_NOZORDER|SWP_SHOWWINDOW);
  296.             }
  297.         }
  298.     }
  299.     return size;
  300. }
  301. void CRTToolBar::OnButtonDropDown (NMHDR* lpnmhdr, LRESULT* plResult)
  302. {
  303. if(!m_IsEnableSkin)return;
  304.     LPNMTOOLBAR lpnmtb = (LPNMTOOLBAR)lpnmhdr;
  305.     *plResult = TBDDRET_DEFAULT;
  306.     if ( !m_pDockSite->SendMessage (WM_COMMAND, DROPDOWN(lpnmtb->iItem)) )
  307.     {
  308.         *plResult = TBDDRET_TREATPRESSED;
  309.     }
  310. }
  311. void CRTToolBar::TrackPopupMenu (int nID, CMenu* pMenu)
  312. {
  313.     CRect rcTBItem;
  314.     int nTBIndex = CommandToIndex (nID);
  315.     TPMPARAMS tpmp = { sizeof TPMPARAMS };
  316.     
  317.     GetItemRect (nTBIndex, rcTBItem);
  318.     ClientToScreen (rcTBItem);
  319.     CopyRect (&tpmp.rcExclude, rcTBItem);
  320.     rcTBItem.OffsetRect (4, 0);
  321.     CRTMenu::SetMRUMenuBarItem (rcTBItem);
  322.     SetButtonStyle (nTBIndex, GetButtonStyle (nTBIndex)|TBBS_INDETERMINATE);
  323.     UpdateWindow();
  324.     ::TrackPopupMenuEx (pMenu->GetSafeHmenu(), TPM_LEFTBUTTON, tpmp.rcExclude.left, tpmp.rcExclude.bottom, GetParentFrame()->GetSafeHwnd(), &tpmp);
  325.     SetButtonStyle (nTBIndex, GetButtonStyle (nTBIndex)&~TBBS_INDETERMINATE);
  326. }