COOLMENU.CPP
上传用户:lianyisd
上传日期:2019-11-03
资源大小:5188k
文件大小:7k
源码类别:

midi

开发平台:

Visual C++

  1. // CoolMenu.cpp: implementation of the CCoolMenu class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "CoolMenu.h"
  6. #define RGB_BUTTON_BLACK    (GetSysColor(COLOR_WINDOWFRAME))
  7. #define RGB_BUTTON_WHITE    (GetSysColor(COLOR_BTNHIGHLIGHT))
  8. #define RGB_BUTTON_LIGHT    (GetSysColor(COLOR_BTNFACE))
  9. #define RGB_BUTTON_DARK     (GetSysColor(COLOR_BTNSHADOW))
  10. #define RGB_MENU_FACE       (GetSysColor(COLOR_MENU))
  11. #define RGB_MENUTEXT_BACK   (GetSysColor(COLOR_HIGHLIGHT))
  12. #define RGB_MENU_TEXT       (GetSysColor(COLOR_MENUTEXT))
  13. #define RGB_DEFINE_BLUE     (RGB(0,210,60))
  14. //////////////////////////////////////////////////////////////////////
  15. // Construction/Destruction
  16. //////////////////////////////////////////////////////////////////////
  17. CCoolMenu::CCoolMenu()
  18. {
  19. m_iMenuWidth=100;
  20. m_iMenuHeight=33;
  21. m_nIconSize=32;
  22. m_iItemNum=0;
  23. m_iUpHeight=0;
  24.     m_iBackImageWidth=30;
  25. m_clrMenuStart=RGB(0,110,180);
  26.     m_clrMenuEnd = RGB_MENU_FACE;
  27. m_clrBarStart=RGB(0,220,180);
  28.     m_clrBarEnd = RGB_MENU_FACE;
  29. }
  30. CCoolMenu::~CCoolMenu()
  31. {
  32. }
  33. void CCoolMenu::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct)
  34. CDCHandle DC= lpDrawItemStruct->hDC;
  35. CDCHandle * pDC= &DC;
  36. CRect  rc=lpDrawItemStruct->rcItem;
  37. UINT  ID=lpDrawItemStruct->itemID;
  38. // DWORD  Data=lpDrawItemStruct->itemData;
  39. int nThisID = m_MenuItemList.FindItemIndexByID(ID);
  40.     int nImageID = m_MenuItemList.FindItemImageByID (ID);
  41. if(ID==MF_SEPARATOR)
  42. {
  43. CRect  rect;
  44. rect.left=rc.left+m_iBackImageWidth;
  45. rect.right=rc.right;
  46. rect.top=rc.top+int((rc.bottom-rc.top)/2.0);
  47. rect.bottom=rc.bottom;
  48. pDC->DrawEdge(rect,EDGE_ETCHED,BF_TOP);
  49. m_iUpHeight+=rc.Height()-rect.Height();
  50. }
  51. else
  52. {
  53. pDC->SetBkMode(TRANSPARENT);
  54. CRect  ImageRect,TextRect;
  55. CRect  BkRect;
  56. ImageRect=rc;
  57. ImageRect.left+=m_iBackImageWidth+2;
  58. ImageRect.right=ImageRect.left+m_nIconSize;  
  59. TextRect=rc;
  60.          TextRect.left=ImageRect.right;
  61.  
  62.         BkRect=rc;
  63.  BkRect.left =m_iBackImageWidth+1 ;
  64. if(lpDrawItemStruct->itemState==ODS_SELECTED)
  65. {
  66. // pDC->FillSolidRect(&BkRect,RGB_DEFINE_BLUE);
  67.          DrawGradient(pDC, &BkRect,m_clrMenuStart, m_clrMenuEnd,FALSE);
  68. if (nImageID >=0 )
  69.      pDC->Draw3dRect(&ImageRect,RGB_BUTTON_WHITE,RGB_BUTTON_DARK);
  70. // pDC->Draw3dRect(&TextRect,RGB_DEFINE_BLUE,RGB_DEFINE_BLUE);
  71. }
  72. else
  73. {
  74.   pDC->FillSolidRect(&BkRect,RGB_MENU_FACE);
  75. // pDC->Draw3dRect(&ImageRect,RGB_MENU_FACE,RGB_MENU_FACE);
  76. // pDC->Draw3dRect(&TextRect,RGB_MENU_FACE,RGB_MENU_FACE);
  77. }
  78. //绘制图象
  79.   int  x,y;
  80.   x=ImageRect.left+int((ImageRect.Width()-m_iImageWidth)/2.0);
  81.   y=ImageRect.top+int((ImageRect.Height()-m_iImageWidth)/2.0);
  82. if (nImageID >=0)
  83.        m_ImageList.Draw(pDC->m_hDC ,nImageID,CPoint(x,y),ILD_TRANSPARENT);
  84.  TextRect.left+=5;
  85. CString strMenuText=m_MenuItemList.FindItemTextByID (ID);
  86.    pDC->DrawText(_T(strMenuText),strMenuText.GetLength (),
  87.   &TextRect,DT_LEFT|DT_SINGLELINE|DT_VCENTER);
  88. }
  89. //绘制背景图
  90.  //  if (lpDrawItemStruct->itemAction & ODA_DRAWENTIRE)
  91.  // m_BackImageList.Draw(pDC,item.m_iIndex,CPoint(rc.left,rc.top),ILD_TRANSPARENT);
  92. if ( nThisID == m_iItemNum)  //最后一个MenuItem
  93. {
  94.      CRect RectBar(0,0,m_iBackImageWidth,rc.bottom );
  95.         DrawGradient( pDC, &RectBar,m_clrBarEnd, m_clrBarStart,TRUE);
  96. }
  97. void CCoolMenu::SetBackImage(UINT nID,int cx,int row)
  98. {
  99. // COLORREF  cl=GetSysColor(COLOR_MENU);
  100. // m_BackImageList.Create(nID,m_iMenuHeight,row,cl);
  101. m_iBackImageHeight=m_iMenuHeight;
  102. m_iMenuHeight=cx;
  103. m_iBackImageWidth=21;
  104. }
  105. void CCoolMenu::SetImage(UINT nID, int cx, int row)
  106. {
  107. COLORREF  cl=GetSysColor(COLOR_MENU);
  108. m_ImageList.Create(nID,cx,row,cl);
  109. m_iImageWidth=cx;
  110. }
  111. void CCoolMenu::MeasureItem(LPMEASUREITEMSTRUCT  lpMeasureItemStruct)
  112.      if(lpMeasureItemStruct->itemID==MF_SEPARATOR)
  113.      lpMeasureItemStruct->itemHeight = 10;
  114.      else
  115.      lpMeasureItemStruct->itemHeight = m_iMenuHeight;
  116.     lpMeasureItemStruct->itemWidth  = m_iMenuWidth;
  117. void CCoolMenu::AppendCoolMenu(UINT nID, CString text , int nImageID/*=-1*/)
  118. {
  119. if(nID==MF_SEPARATOR)
  120. AppendMenu(MF_SEPARATOR|MF_OWNERDRAW, nID,(LPCTSTR)text);
  121. else
  122. AppendMenu(MF_ENABLED | MF_OWNERDRAW, nID,(LPCTSTR)text);
  123.   MenuItem  item;
  124.   item.m_strMenuText=text;
  125.   item.m_iIndex=m_iItemNum;
  126. item.m_iID =nID;
  127. item.m_iImageID = nImageID;
  128. m_MenuItemList.Add (item);
  129.   m_iItemNum+=1;
  130.   int nWidth=text.GetLength () * 8 + m_iImageWidth + m_nIconSize+60 ;
  131.   m_iMenuWidth = ( m_iMenuWidth > nWidth)  ? m_iMenuWidth : nWidth ;
  132. }
  133. void CCoolMenu::DrawGradient(CDCHandle * pDC, CRect * pRect , COLORREF clrStart , 
  134.      COLORREF clrEnd,BOOL bVertice /*=FALSE */)
  135. {
  136. RECT rectFill;    // Rectangle for filling band
  137. float fStep;              // How wide is each band?
  138. CBrush brush; // Brush to fill in the bar
  139. int r, g, b; // First distance, then starting value
  140. float rStep, gStep, bStep; // Step size for each color
  141. // Get the color differences
  142. r = (GetRValue(clrEnd) - GetRValue(clrStart));
  143. g = (GetGValue(clrEnd) - GetGValue(clrStart));
  144. b =  (GetBValue(clrEnd) - GetBValue(clrStart));
  145. // Make the number of steps equal to the greatest distance
  146. int nSteps = max(abs(r), max(abs(g), abs(b)));
  147. // Determine how large each band should be in order to cover the
  148. // client with nSteps bands (one for every color intensity level)
  149.    if (bVertice )
  150.    fStep = (float) pRect->Height() / (float)nSteps;
  151.    else
  152.    fStep = (float) pRect->Width() / (float)nSteps;
  153. // Calculate the step size for each color
  154. rStep = r/(float)nSteps;
  155. gStep = g/(float)nSteps;
  156. bStep = b/(float)nSteps;
  157. // Reset the colors to the starting position
  158. r = GetRValue(clrStart);
  159. g = GetGValue(clrStart);
  160. b = GetBValue(clrStart);
  161. rectFill= *pRect;
  162. // Start filling bands
  163. for (int i= 0; i < nSteps; i++) 
  164. {
  165.   if( bVertice)
  166.   {
  167.   rectFill.top    =  pRect->top  + (int)(i * fStep);
  168.   rectFill.bottom =  pRect->top   + (int)( (i+1) * fStep );
  169.   }
  170.   else
  171.   {
  172.   rectFill.left  =  pRect->left + (int)(i * fStep);
  173.   rectFill.right =  pRect->left + (int) ( (i+1) * fStep );
  174.   }
  175.   //CDC::FillSolidRect is faster, but it does not handle 8-bit color depth
  176. // VERIFY(brush.CreateSolidBrush(RGB(r+rStep*i, g + gStep*i, b + bStep *i)));
  177.   //   pDC->FillRect(&rectFill,&brush);
  178.         pDC->FillSolidRect(&rectFill,RGB(r+rStep*i, g + gStep*i, b + bStep *i) );
  179. // VERIFY(brush.DeleteObject());
  180. }
  181. }