void CMyDialog::DrawCloseButton(CDC *pDC,int enumStatus) { Color clrStart,clrEnd,clrBorder,clrCloseMark; CRect rc; GetClientRect(rc); if (enumStatus==DTS_NORMAL) { clrStart=Color(231,231,231); clrEnd=Color(227,227,227); clrBorder=Color(158,158,158); clrCloseMark=Color(128,128,128); clrStart=Color(219,219,220); clrEnd=Color(190,192,193); } else if (enumStatus==DTS_HOVER) { clrStart=Color(245,28,6); clrEnd=Color(207,9,7); clrBorder=Color(187,5,0); clrCloseMark=Color(255,255,255); } else// if (enumStatus==DTS_CLICKED) { clrStart=Color(207,9,7); clrEnd=Color(245,28,6); clrBorder=Color(187,5,0); clrCloseMark=Color(255,255,255); } m_rcClose.SetRect(rc.right-36,1,rc.right-6,21); GraphicsPath path; int nRadius=4; Point point[5]; point[0]=Point(m_rcClose.right,m_rcClose.bottom-nRadius); point[1]=Point(m_rcClose.right,m_rcClose.top); point[2]=Point(m_rcClose.left,m_rcClose.top); point[3]=Point(m_rcClose.left,m_rcClose.bottom); point[4]=Point(m_rcClose.right-nRadius,m_rcClose.bottom); path.AddLines(point,5); path.AddArc(m_rcClose.right-2*nRadius,m_rcClose.bottom-2*nRadius,2*nRadius,2*nRadius,0,90); LinearGradientBrush linGrBrush( Rect(m_rcClose.left,m_rcClose.top,m_rcClose.Width(),m_rcClose.Height()), clrStart, clrEnd, LinearGradientModeVertical); Graphics gs(pDC->m_hDC); gs.FillPath(&linGrBrush,&path); CPoint ptCenter=m_rcClose.CenterPoint(); if (enumStatus==DTS_CLICKED) { ptCenter.Offset(1,1); } CPen penMark(PS_SOLID,2,clrCloseMark.ToCOLORREF()); CPen *pOldPen=pDC->SelectObject(&penMark); pDC->MoveTo(ptCenter.x-5,ptCenter.y-5); pDC->LineTo(ptCenter.x+5,ptCenter.y+5); pDC->MoveTo(ptCenter.x-5,ptCenter.y+5); pDC->LineTo(ptCenter.x+5,ptCenter.y-5); // CPen penBorder(PS_SOLID,1,clrBorder.ToCOLORREF()); // pDC->SelectObject(&penBorder); // pDC->MoveTo(m_rcClose.left-1,m_rcClose.top); // pDC->LineTo(m_rcClose.left-1,m_rcClose.bottom); pDC->SelectObject(pOldPen); }
BOOL CMyDialog::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default // BOOL bResult=CDialog::OnEraseBkgnd(pDC); if (!m_bHaveStoreBgDC) { CRect rect; GetClientRect(rect); m_bHaveStoreBgDC=TRUE; Color clrStart=Color(230,230,230); Color clrEnd=Color(255,255,255); m_StoreBgDC.DeleteDC(); m_StoreBgDC.CreateCompatibleDC(pDC); CBitmap bmp; bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()); CBitmap *pOldBmp=m_StoreBgDC.SelectObject(&bmp); Graphics myGraphics(m_StoreBgDC.m_hDC); LinearGradientBrush linGrBrush( Rect(0,0,rect.Width(),rect.Height()), clrStart, clrEnd, LinearGradientModeVertical); myGraphics.FillRectangle(&linGrBrush, 0,31,rect.Width(),rect.Height()); Color clrCaptionStart(219,219,220); Color clrCaptionEnd(190,192,193); LinearGradientBrush linGrBrush1( Rect(0,0,rect.Width(),30), clrCaptionStart, clrCaptionEnd, LinearGradientModeVertical); myGraphics.FillRectangle(&linGrBrush1, 0,0,rect.Width(),30); DrawCloseButton(&m_StoreBgDC,DTS_NORMAL); DrawMinButton(&m_StoreBgDC,DTS_NORMAL); CPen MarkPen(PS_SOLID,1,RGB(158,158,158)); CBrush *pOldBrush=(CBrush *)m_StoreBgDC.SelectStockObject(NULL_BRUSH); CPen *pOldPen=m_StoreBgDC.SelectObject(&MarkPen); m_StoreBgDC.RoundRect(m_rcMin.left-1,m_rcMin.top-5,m_rcClose.right+1,m_rcClose.bottom+1,5,5); CPen penBorder(PS_SOLID,1,RGB(150,150,150)); m_StoreBgDC.SelectObject(&penBorder); m_StoreBgDC.MoveTo(0,30); m_StoreBgDC.LineTo(rect.Width(),30); m_StoreBgDC.MoveTo(m_rcClose.left-1,1); m_StoreBgDC.LineTo(m_rcClose.left-1,21); rect.DeflateRect(0,0,1,1); m_StoreBgDC.RoundRect(rect,CPoint(7,5)); m_StoreBgDC.SelectObject(pOldPen); m_StoreBgDC.SelectObject(pOldBrush); rect.bottom=30; HICON hIcon=GetIcon(FALSE); if (hIcon) //画Icon { DrawIconEx(m_StoreBgDC.m_hDC,5,7,hIcon,16,16,0,NULL,DI_NORMAL | DI_COMPAT); rect.left+=21; m_rcIcon.SetRect(5,7,21,23); } CString str; GetWindowText(str); if (str!="") //写标题 { rect.left+=5; rect.top+=4; m_StoreBgDC.SetBkMode(TRANSPARENT); COLORREF OldClr=m_StoreBgDC.SetTextColor(RGB(50,50,50)); CFont font; font.CreatePointFont(100,"雅黑",&m_StoreBgDC); CFont *pOldFont=m_StoreBgDC.SelectObject(&font); m_StoreBgDC.DrawText(str,rect,DT_VCENTER | DT_SINGLELINE); m_StoreBgDC.SelectObject(pOldFont); m_StoreBgDC.SetTextColor(OldClr); font.DeleteObject(); } /* m_StoreBgDC.SelectObject(pOldBmp);*/ bmp.DeleteObject(); } CRect rect; GetClientRect(rect); pDC->BitBlt(0,0,rect.Width(),rect.Height(),&m_StoreBgDC,0,0,SRCCOPY); return TRUE; }
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { //从lpDrawItemStruct获取控件的相关信息 CRect rect = lpDrawItemStruct->rcItem; CDC *pDC=CDC::FromHandle(lpDrawItemStruct->hDC); int nSaveDC=pDC->SaveDC(); UINT state = lpDrawItemStruct->itemState; TCHAR strText[MAX_PATH + 1]; ::GetWindowText(m_hWnd, strText, MAX_PATH); BOOL bFocus=m_bOver; //按钮是否被选中(点击或tab或默认) CString strImgPath = "" ; //获取按钮的状态 if (state & ODS_FOCUS || state & ODS_SELECTED || state & ODS_DEFAULT) { bFocus = TRUE; } if (m_bIsDrawImgBtn) { if (bFocus) //有焦点或鼠标经过 { strImgPath = m_strPathHover; } else { strImgPath = m_strPathNormal; } Graphics gs(pDC->m_hDC); Image img(strImgPath.AllocSysString()); gs.DrawImage(&img,0,0,rect.Width(),rect.Height()); } else { Color clrStart,clrEnd; COLORREF clrBorder; if (bFocus) { clrStart=m_clrTodStartHover; clrEnd=m_clrBottomEndHover; clrBorder=m_clrBorderHover; } else { clrStart=m_clrTodStartNormal; clrEnd=m_clrBottomEndNormal; clrBorder=m_clrBorderNormal; } int cxBorder=GetSystemMetrics(SM_CXEDGE); int cyBorder=GetSystemMetrics(SM_CYEDGE); Graphics myGraphics(pDC->m_hDC); LinearGradientBrush linGrBrush( Rect(0,0,rect.Width()/*-cxBorder*/,rect.Height()/*-cyBorder*/), clrStart,//Color(255, 238, 238, 238), clrEnd,//Color(200, 208,208,208), LinearGradientModeVertical); myGraphics.FillRectangle(&linGrBrush, 1,1,rect.Width()-cxBorder,rect.Height()-cyBorder); // CRgn rgn; // rgn.CreateRoundRectRgn(rect.left,rect.top,rect.right,rect.bottom,2,2); // myGraphics.FillRegion(&linGrBrush,&Region((HRGN)rgn.m_hObject)); CPen pen; pen.CreatePen(PS_SOLID,1,clrBorder);//RGB(162,203,236) pDC->SelectObject(&pen); pDC->SelectStockObject(NULL_BRUSH); pDC->RoundRect(&rect,CPoint(3,3)); // pDC->SetPixel(rect.right-2,rect.bottom-2,clrEnd.ToCOLORREF()); } //显示按钮的文本 if (strText!=NULL) { CFont* pFont = GetFont(); CFont* pOldFont = pDC->SelectObject(pFont); CSize szExtent = pDC->GetTextExtent(strText, lstrlen(strText)); CPoint pt( rect.CenterPoint().x - szExtent.cx / 2+1, rect.CenterPoint().y - szExtent.cy / 2+1); if (state & ODS_SELECTED) pt.Offset(1, 1); int nMode = pDC->SetBkMode(TRANSPARENT); //输出首字母带下划线效果文本 if (state & ODS_DISABLED) pDC->DrawState(pt, szExtent, strText, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL); else pDC->DrawState(pt, szExtent, strText, DSS_NORMAL, TRUE, 0, (HBRUSH)NULL); pDC->SelectObject(pOldFont); pDC->SetBkMode(nMode); } pDC->RestoreDC(nSaveDC); }