SkinMenu.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // SkinMenu.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. //#include "dialog.h"
  5. #include "SkinMenu.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CSkinMenu
  13. IMPLEMENT_DYNCREATE(CSkinMenu, CMenu)
  14. CSkinMenu::CSkinMenu()
  15. {
  16. //VERIFY(CreateMenu());
  17. }
  18. CSkinMenu::~CSkinMenu()
  19. {
  20. Detach();
  21. ASSERT(m_hMenu == NULL); // defaul CMenu::~CMenu will destroy
  22. }
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CSkinMenu message handlers
  25. void CSkinMenu::DrawItem( LPDRAWITEMSTRUCT lpDIS)
  26. {
  27. CDC *pDC=CDC::FromHandle(lpDIS->hDC) ;
  28. CRect rect(lpDIS->rcItem);
  29. CString strText((LPCSTR)lpDIS->itemData);
  30. //设定背景色
  31. CBrush brush(m_crFlatBK);
  32. pDC->FillRect(&rect, &brush);
  33. CRect rcGray=rect;
  34. rcGray.right =rcGray.left +28;
  35. pDC->FillSolidRect(&rcGray, m_crFlatGray);
  36. //设定显示模式
  37. pDC->SetBkMode(TRANSPARENT);
  38. CBrush br(m_crBtnShadow);
  39. //选中
  40. if ((lpDIS->itemState & ODS_SELECTED) &&
  41. (lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
  42. {
  43. CBrush brush(m_crFlatHighLight);
  44. rect.DeflateRect(1,1) ;
  45. pDC->FrameRect(&rect, &br);
  46. rect.DeflateRect(1,1) ;
  47. pDC->FillRect(&rect, &brush);
  48. }
  49. BOOL bChecked =lpDIS->itemState & ODS_CHECKED;
  50. BOOL bSelected=lpDIS->itemState & ODS_SELECTED;
  51. if (bChecked)
  52. {
  53. COLORREF cr;
  54. if (bSelected)
  55. cr=AlphaColor(m_crFlatHighLight,AlphaColor(m_crFlatHighLight,m_crFlatBK,140),140);
  56. else
  57. cr=AlphaColor(m_crFlatHighLight,m_crFlatBK,140);
  58. rcGray.DeflateRect(3,3);
  59. pDC->SetBkMode(TRANSPARENT);
  60. pDC->SetTextColor(RGB(0,0,0));
  61. pDC->FrameRect(&rcGray, &br);
  62. rcGray.DeflateRect(1,1);
  63. pDC->FillSolidRect(&rcGray, cr);
  64. pDC->DrawText("√",&rcGray,DT_EXPANDTABS|DT_VCENTER|DT_CENTER|DT_SINGLELINE);
  65. }
  66. //文字
  67. if(bSelected)
  68. pDC->SetTextColor(m_crFlatHighLightText);
  69. else
  70. pDC->SetTextColor(RGB(0,0,0));
  71. CRect rcText=rect;
  72. rcText.left =28+3;
  73. CFont *ofont;
  74. ofont = pDC->SelectObject(AfxGetMainWnd()->GetFont() );
  75. pDC->DrawText(strText,rcText,DT_LEFT|DT_SINGLELINE|DT_VCENTER);
  76. pDC->SelectObject(ofont);
  77. }
  78. void CSkinMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
  79. {
  80. CDC *pDC =AfxGetMainWnd()->GetDC();
  81. CString strText((LPCSTR)lpMIS->itemData);
  82. CSize size;
  83. size=pDC->GetTextExtent(strText);
  84. lpMIS->itemWidth = size.cx +24+4;
  85. lpMIS->itemHeight =24+4;
  86. AfxGetMainWnd()->ReleaseDC(pDC);
  87. }
  88. //透明效果
  89. COLORREF CSkinMenu::AlphaColor(COLORREF crUp,COLORREF crDown,int nAlpha)
  90. {
  91. //Alpha通道,Alpha取值范围从0到255
  92. return RGB((GetRValue(crUp)*(255-nAlpha)+GetRValue(crDown)*nAlpha)/255, \
  93. (GetGValue(crUp)*(255-nAlpha)+GetGValue(crDown)*nAlpha)/255,\
  94. (GetBValue(crUp)*(255-nAlpha)+GetBValue(crDown)*nAlpha)/255);
  95. }