// SkinMenu.cpp : implementation file // #include "stdafx.h" //#include "dialog.h" #include "SkinMenu.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CSkinMenu IMPLEMENT_DYNCREATE(CSkinMenu, CMenu) CSkinMenu::CSkinMenu() { //VERIFY(CreateMenu()); } CSkinMenu::~CSkinMenu() { Detach(); ASSERT(m_hMenu == NULL); // defaul CMenu::~CMenu will destroy } ///////////////////////////////////////////////////////////////////////////// // CSkinMenu message handlers void CSkinMenu::DrawItem( LPDRAWITEMSTRUCT lpDIS) { CDC *pDC=CDC::FromHandle(lpDIS->hDC) ; CRect rect(lpDIS->rcItem); CString strText((LPCSTR)lpDIS->itemData); //设定背景色 CBrush brush(m_crFlatBK); pDC->FillRect(&rect, &brush); CRect rcGray=rect; rcGray.right =rcGray.left +28; pDC->FillSolidRect(&rcGray, m_crFlatGray); //设定显示模式 pDC->SetBkMode(TRANSPARENT); CBrush br(m_crBtnShadow); //选中 if ((lpDIS->itemState & ODS_SELECTED) && (lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))) { CBrush brush(m_crFlatHighLight); rect.DeflateRect(1,1) ; pDC->FrameRect(&rect, &br); rect.DeflateRect(1,1) ; pDC->FillRect(&rect, &brush); } BOOL bChecked =lpDIS->itemState & ODS_CHECKED; BOOL bSelected=lpDIS->itemState & ODS_SELECTED; if (bChecked) { COLORREF cr; if (bSelected) cr=AlphaColor(m_crFlatHighLight,AlphaColor(m_crFlatHighLight,m_crFlatBK,140),140); else cr=AlphaColor(m_crFlatHighLight,m_crFlatBK,140); rcGray.DeflateRect(3,3); pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(0,0,0)); pDC->FrameRect(&rcGray, &br); rcGray.DeflateRect(1,1); pDC->FillSolidRect(&rcGray, cr); pDC->DrawText("√",&rcGray,DT_EXPANDTABS|DT_VCENTER|DT_CENTER|DT_SINGLELINE); } //文字 if(bSelected) pDC->SetTextColor(m_crFlatHighLightText); else pDC->SetTextColor(RGB(0,0,0)); CRect rcText=rect; rcText.left =28+3; CFont *ofont; ofont = pDC->SelectObject(AfxGetMainWnd()->GetFont() ); pDC->DrawText(strText,rcText,DT_LEFT|DT_SINGLELINE|DT_VCENTER); pDC->SelectObject(ofont); } void CSkinMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMIS) { CDC *pDC =AfxGetMainWnd()->GetDC(); CString strText((LPCSTR)lpMIS->itemData); CSize size; size=pDC->GetTextExtent(strText); lpMIS->itemWidth = size.cx +24+4; lpMIS->itemHeight =24+4; AfxGetMainWnd()->ReleaseDC(pDC); } //透明效果 COLORREF CSkinMenu::AlphaColor(COLORREF crUp,COLORREF crDown,int nAlpha) { //Alpha通道,Alpha取值范围从0到255 return RGB((GetRValue(crUp)*(255-nAlpha)+GetRValue(crDown)*nAlpha)/255, \ (GetGValue(crUp)*(255-nAlpha)+GetGValue(crDown)*nAlpha)/255,\ (GetBValue(crUp)*(255-nAlpha)+GetBValue(crDown)*nAlpha)/255); }