ToolBarXP.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. // ToolBarXP.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ToolBarXP.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CToolBarXP
  12. CToolBarXP::CToolBarXP()
  13. {
  14. m_clrBack = RGB(239, 237, 222);
  15. m_clrHot = RGB(193, 210, 238);
  16. m_clrChecked = m_clrHot;
  17. m_clrSelected = m_clrChecked;
  18. m_clrLine = RGB(49, 106, 197);
  19. m_bDrawLine = TRUE;
  20. }
  21. CToolBarXP::~CToolBarXP()
  22. {
  23. }
  24. BEGIN_MESSAGE_MAP(CToolBarXP, CToolBarCtrl)
  25. //{{AFX_MSG_MAP(CToolBarXP)
  26. //}}AFX_MSG_MAP
  27. ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
  28. END_MESSAGE_MAP()
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CToolBarXP message handlers
  31. BOOL CToolBarXP::LoadToolBar(UINT nID)
  32. {
  33. if(!m_hWnd)return FALSE;
  34. HRSRC hRsrc = ::FindResource(AfxGetInstanceHandle(), MAKEINTRESOURCE(nID), RT_TOOLBAR);
  35. if (hRsrc == NULL)
  36. return FALSE;
  37. HGLOBAL hGlobal = LoadResource(AfxGetInstanceHandle(), hRsrc);
  38. if (hGlobal == NULL)
  39. return FALSE;
  40. TOOLBAR_DATA* pData = (TOOLBAR_DATA*)LockResource(hGlobal);
  41. if (pData == NULL)
  42. return FALSE;
  43. BOOL bResult;
  44. TBBUTTON tbb;
  45. memset(&tbb,0,sizeof(TBBUTTON));
  46. tbb.iString = -1;
  47. int iImage = 0;
  48. for (int i = 0; i < pData->wItemCount; i++)
  49. {
  50. tbb.fsState = TBSTATE_ENABLED;
  51. tbb.idCommand = pData->items()[i];
  52. if(tbb.idCommand == 0)
  53. {
  54. tbb.fsStyle = TBSTYLE_SEP;
  55. tbb.iBitmap = -1;
  56. }
  57. else
  58. {
  59. tbb.fsStyle = TBSTYLE_BUTTON;
  60. tbb.iBitmap = iImage++;
  61. }
  62. bResult = AddButtons(1,&tbb);
  63. if(!bResult)return FALSE;
  64. }
  65. if(bResult)
  66. {
  67. TBADDBITMAP tbab;
  68. tbab.hInst = AfxGetInstanceHandle();
  69. tbab.nID = nID;
  70. SendMessage(TB_ADDBITMAP,(WPARAM)pData->wItemCount,(LPARAM)&tbab);
  71. }
  72. UnlockResource(hGlobal);
  73. FreeResource(hGlobal);
  74. return bResult;
  75. }
  76. //////////////////////////////////////////////////////////////////////////
  77. // Process CustomDraw notification, the drawing code is all from here
  78. void CToolBarXP::OnCustomDraw( NMHDR * pNotifyStruct, LRESULT* pResult )
  79. {
  80. NMTBCUSTOMDRAW *pnmcd = (NMTBCUSTOMDRAW *)pNotifyStruct;
  81. CDC dc;
  82. dc.Attach(pnmcd->nmcd.hdc);
  83. switch (pnmcd->nmcd.dwDrawStage)
  84. {
  85. case CDDS_PREPAINT:
  86. *pResult = CDRF_NOTIFYITEMDRAW;
  87. break;
  88. case CDDS_ITEMPREPAINT:
  89. PreDrawItem(&dc, pnmcd->nmcd.rc, pnmcd->nmcd.uItemState);
  90. *pResult = TBCDRF_NOEDGES;
  91. break;
  92. case CDDS_ITEMPOSTPAINT:
  93. break;
  94. }
  95. dc.Detach();
  96. }
  97. void CToolBarXP::PreDrawItem(CDC *pDC, const RECT &rect, UINT uState)
  98. {
  99. CRect rcDraw = rect;
  100. if (uState & CDIS_HOT)
  101. {
  102. CPen pen(PS_SOLID, 1, m_clrLine);
  103. CPen *pOldPen = pDC->SelectObject(&pen);
  104. CBrush brush(m_clrHot);
  105. CBrush *pOldBr = pDC->SelectObject(&brush);
  106. pDC->Rectangle(&rect);
  107. pDC->SelectObject(pOldBr);
  108. pDC->SelectObject(pOldPen);
  109. }
  110. else if (uState & CDIS_CHECKED)
  111. {
  112. CPen pen(PS_SOLID, 1, m_clrLine);
  113. CPen *pOldPen = pDC->SelectObject(&pen);
  114. CBrush brush(m_clrChecked);
  115. CBrush *pOldBr = pDC->SelectObject(&brush);
  116. pDC->Rectangle(&rect);
  117. pDC->SelectObject(pOldBr);
  118. pDC->SelectObject(pOldPen);
  119. }
  120. else if (uState & CDIS_SELECTED)
  121. {
  122. CPen pen(PS_SOLID, 1, m_clrLine);
  123. CPen *pOldPen = pDC->SelectObject(&pen);
  124. CBrush brush(m_clrSelected);
  125. CBrush *pOldBr = pDC->SelectObject(&brush);
  126. pDC->Rectangle(&rect);
  127. pDC->SelectObject(pOldBr);
  128. pDC->SelectObject(pOldPen);
  129. }
  130. }