void GPDrawShadowText( Graphics& gc, CString& strTxtIn, CRect& rcIn, Gdiplus::Font& fontIn, ARGB BrushClrIn, ARGB PenClrIn , ARGB shadowPenClrIn /*= 0xff000000*/, ARGB shadowBrushClrIn /*= 0xff000000*/, int nOffXIn /*= 2*/, int nOffYIn /*= 2*/, StringFormat* fmtIn /*= NULL*/ ) { Gdiplus::Font& gcfont = fontIn; FontFamily fmy; gcfont.GetFamily(&fmy); int nfontStyle = gcfont.GetStyle(); REAL dFontSize = gcfont.GetSize(); Rect rcText = CRect2Rect(rcIn); StringFormat fmt; fmt.SetAlignment(StringAlignmentCenter); fmt.SetTrimming(StringTrimmingEllipsisWord); fmt.SetLineAlignment(StringAlignmentCenter); StringFormat& fmtUse = fmtIn == NULL? fmt:*fmtIn; GraphicsContainer gcContainer = gc.BeginContainer(); gc.SetSmoothingMode(SmoothingModeAntiAlias); CComBSTR btrTxtIn(strTxtIn); GraphicsPath textPath; textPath.AddString(btrTxtIn, -1, &fmy, nfontStyle, dFontSize, rcText, &fmtUse); Matrix mx; mx.Translate(nOffXIn, nOffYIn); textPath.Transform(&mx); Pen textPen(ARGB2Color(shadowPenClrIn), 1); SolidBrush textbrush(ARGB2Color(shadowBrushClrIn)); textPen.SetLineJoin(LineJoinRound); if (shadowBrushClrIn != 0) { gc.FillPath(&textbrush, &textPath); } if (shadowPenClrIn != 0) { gc.DrawPath(&textPen, &textPath); } mx.Invert(); textPath.Transform(&mx); textPen.SetColor(ARGB2Color(PenClrIn)); textbrush.SetColor(ARGB2Color(BrushClrIn)); if (BrushClrIn != 0) { gc.FillPath(&textbrush, &textPath); } if (PenClrIn != 0) { gc.DrawPath(&textPen, &textPath); } gc.EndContainer(gcContainer); }
TexturePod OverlayText(string message) { InitializeGdi(); PezConfig cfg = PezGetConfig(); // Skip GDI text generation if the string is unchanged: if (message == oc.PreviousMessage) return oc.MessageTexture; oc.PreviousMessage = message; // Create the GDI+ drawing context and set it up: Graphics* gfx = Graphics::FromImage(oc.GdiBitmap); gfx->Clear(Color::Transparent); gfx->SetSmoothingMode(SmoothingModeAntiAlias); gfx->SetInterpolationMode(InterpolationModeHighQualityBicubic); // Select a font: FontFamily fontFamily(L"Trebuchet MS"); const float fontSize = 14; PointF origin(10.0f, 10.0f); StringFormat format(StringAlignmentNear); // Create a path along the outline of the glyphs: GraphicsPath path; path.AddString( wstring(message.begin(), message.end()).c_str(), -1, &fontFamily, FontStyleRegular, fontSize, origin, &format); // Draw some glow to steer clear of crappy AA: for (float width = 0; width < 3; ++width) { Pen pen(Color(64, 0, 0, 0), width); pen.SetLineJoin(LineJoinRound); gfx->DrawPath(&pen, &path); } // Fill the glyphs: SolidBrush brush(Color(50, 100, 200)); gfx->FillPath(&brush, &path); // Lock the raw pixel data and pass it to OpenGL: BitmapData data; oc.GdiBitmap->LockBits(0, ImageLockModeRead, PixelFormat32bppARGB, &data); _ASSERT(data.Stride == sizeof(unsigned int) * cfg.Width); glBindTexture(GL_TEXTURE_2D, oc.MessageTexture.Handle); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, cfg.Width, cfg.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data.Scan0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); oc.GdiBitmap->UnlockBits(&data); return oc.MessageTexture; }
void CArcView::Draw(CDC* pDC, const std::vector<CElement*>& selection, CElement* highlight) { computeCollisionPoints(FALSE); computeEnclosingRect(FALSE); Graphics g = pDC->GetSafeHdc(); g.SetSmoothingMode(SmoothingModeAntiAlias); Color theColor = ColorToDraw(selection, highlight); Pen pen(theColor, static_cast<Gdiplus::REAL>(penWidth)); GraphicsPath arc; Point currentPoint(*pathPoints.begin()); for(auto it=pathPoints.begin() + 1; it != pathPoints.end(); ++it) { arc.AddLine(currentPoint, *it); currentPoint = *it; } //Annotation de poids if(arcModel->getValuation() != 1) { //Déterminer le point de mi-chemin PointF pathAnnotationPoint = annotationPoint((double(valPosition))/100, valDistance); //Elements de dessin pour chaine de caracteres CString weight; weight.Format(_T("%d"), arcModel->getValuation()); FontFamily fontFamily(L"Arial"); Font maxfont(&fontFamily, 16, FontStyleRegular, UnitPixel); StringFormat stringFormat; SolidBrush brush(ColorToDraw(selection, highlight)); //Décalage à effectuer //Peut-être aurait-il suffit de modifier le StringFormat ? RectF boundingBox; g.MeasureString(weight,-1,&maxfont,pathAnnotationPoint,&stringFormat,&boundingBox); pathAnnotationPoint.X -= boundingBox.Width/2; pathAnnotationPoint.Y += boundingBox.Height/2; //Translation + Symétrie axiale d'axe des abscisses g.TranslateTransform(0, pathAnnotationPoint.Y * 2); Matrix matrix; matrix.SetElements(1, 0, 0, -1, 0, 0); g.MultiplyTransform(&matrix); //Affichage du poids de l'arc g.DrawString(weight, -1, &maxfont, pathAnnotationPoint, &stringFormat, &brush); g.ResetTransform(); } //Dessiner le chemin avec une flèche au bout pen.SetCustomEndCap(arrowCap); pen.SetLineJoin(LineJoinRound); g.DrawPath(&pen, &arc); }
void CRectangle::DrawRoundRect(Graphics& graph,CRect rc) { Pen penDraw(m_crColor,(float)m_nWidth); INT offsetX = (rc.right - rc.left) * 20/100; INT offsetY = (rc.bottom - rc.top) * 20/100; GraphicsPath pt; pt.AddArc(rc.right - offsetX, rc.top, offsetX, offsetY, 270, 90); pt.AddArc(rc.right - offsetX, rc.bottom - offsetY, offsetX, offsetY, 0, 90); pt.AddArc(rc.left, rc.bottom - offsetY, offsetX, offsetY, 90, 90); pt.AddArc(rc.left, rc.top, offsetX, offsetY, 180, 90); pt.AddLine(rc.left + offsetX, rc.top, rc.right - offsetX/2, rc.top); graph.DrawPath(&penDraw,&pt); }
void DrawItemShape::OnPaint( Graphics &g ) { if(isChangeRegion()) { ResetRegion(); } auto region = getRegion(); SolidBrush brush(DrawTools::ColorNormal); if (m_isFillPath) { if (StateNormal == m_state) { g.FillRegion(&brush, region.get()); } else if (StateHovered == m_state) { g.FillRegion(&SolidBrush(DrawTools::ColorHovered), region.get()); } else if (StateDisable == m_state) { g.FillRegion(&SolidBrush(DrawTools::ColorDisable), region.get()); } else if (StateDown == m_state) { g.FillRegion(&SolidBrush(DrawTools::ColorDown), region.get()); } else if (StateError == m_state) { g.FillRegion(&SolidBrush(DrawTools::ColorError), region.get()); } else { g.FillRegion(&SolidBrush(m_fillColor), region.get()); } } if (m_isDrawPath) { GraphicsPath path; path.StartFigure(); for(auto itter = m_lines.begin();itter != m_lines.end() ; itter++ ) { (*itter)->getPath(path); } path.CloseFigure(); g.DrawPath(&Pen(m_drawColor),&path); } }
void IGTabBar::drawTab (HDC hdc, UINT nSize, bool bSelected, bool bOver, const wchar_t *pcwTitle) { Graphics graphics (hdc); Color colBackground (Color (GetRValue (m_cBackGround), GetGValue (m_cBackGround), GetBValue (m_cBackGround))); SolidBrush solBrushBackground (colBackground); graphics.FillRectangle (&solBrushBackground, Rect (0, 0, nSize, BUTTON_HEIGHT - 1)); SolidBrush solBrushTab (bSelected ? IGTAB_COLORBACKGND : IGTAB_COLOR_UNSELECTED); GraphicsPath pathBorder; pathBorder.StartFigure(); pathBorder.AddArc (Rect (0, 0, IGTAB_CORNERDIAM, IGTAB_CORNERDIAM), 180.0f, 90.0f); pathBorder.AddArc (Rect (nSize - IGTAB_CORNERDIAM, 0, IGTAB_CORNERDIAM, IGTAB_CORNERDIAM), -90.0f, 90.0f); pathBorder.AddLine (Point (nSize, BUTTON_HEIGHT + (bSelected ? 1 : 0)), Point (0, BUTTON_HEIGHT + (bSelected ? 1 : 0))); graphics.FillPath (&solBrushTab, &pathBorder); if (bOver) { PathGradientBrush pthGrBrush (&pathBorder); pthGrBrush.SetCenterPoint (PointF (0.7f * (float)nSize, 0.3f * (float)BUTTON_HEIGHT)); pthGrBrush.SetCenterColor (IGTAB_COLOR_FRAMEIN); Color colors[] = {IGTAB_COLOR_FRAMEOUT}; int count = 1; pthGrBrush.SetSurroundColors (colors, &count); graphics.FillPath (&pthGrBrush, &pathBorder); } FontFamily fontFamily(L"Times New Roman"); Font font(&fontFamily, 16, FontStyleRegular, UnitPixel); PointF pointF(20.0f, 5.0f); SolidBrush solidFontBrush (bSelected ? IGTAB_COLOR_FONTENABLED : IGTAB_COLOR_FONTDISABLED); StringFormat format(StringFormat::GenericDefault()); format.SetAlignment (StringAlignmentCenter); graphics.DrawString (pcwTitle, -1, &font, RectF (0.0f, 0.0f, (float)nSize, (float)BUTTON_HEIGHT), &format, &solidFontBrush); Pen penBorder (IGTAB_COLORBORDER, 1); GraphicsPath pathBorderOut; pathBorderOut.StartFigure(); pathBorderOut.AddArc (Rect (0, 0, IGTAB_CORNERDIAM + 1, IGTAB_CORNERDIAM + 1), 180.0f, 90.0f); pathBorderOut.AddArc (Rect (nSize - IGTAB_CORNERDIAM - 2, 0, IGTAB_CORNERDIAM + 1, IGTAB_CORNERDIAM + 1), -90.0f, 90.0f); pathBorderOut.AddLine (Point (nSize - 1, BUTTON_HEIGHT + (bSelected ? 1 : 0)), Point (0, BUTTON_HEIGHT + (bSelected ? 1 : 0))); pathBorderOut.CloseFigure(); graphics.DrawPath (&penBorder, &pathBorderOut); }
BOOL GDIPluseExt::DrawRoundRect(Graphics& gp,CRect rect,Color boardscolor,Color FillPathcolor,int radius) { //边框路径 GraphicsPath Path; MakeRoundRectPath(&Path,rect,radius); SolidBrush solidBrush(FillPathcolor); gp.SetSmoothingMode(SmoothingModeAntiAlias); gp.SetInterpolationMode(InterpolationModeHighQualityBicubic); gp.FillPath(&solidBrush, &Path); //画边框 for(int i=1; i < 4; ++i) { Pen pen(boardscolor, (REAL)i); pen.SetLineJoin(LineJoinRound); gp.DrawPath(&pen, &Path); } return TRUE; }
/* ** Draws the meter on the double buffer ** */ bool CMeterLine::Draw(Graphics& graphics) { int maxSize = m_GraphHorizontalOrientation ? m_H : m_W; if (!CMeter::Draw(graphics) || maxSize <= 0) return false; double maxValue = 0.0; int counter = 0; // Find the maximum value if (m_Autoscale) { double newValue = 0; std::vector< std::vector<double> >::const_iterator i = m_AllValues.begin(); counter = 0; for (; i != m_AllValues.end(); ++i) { double scale = m_ScaleValues[counter]; std::vector<double>::const_iterator j = (*i).begin(); for (; j != (*i).end(); ++j) { double val = (*j) * scale; newValue = max(newValue, val); } ++counter; } // Scale the value up to nearest power of 2 if (newValue > DBL_MAX / 2.0) { maxValue = DBL_MAX; } else { maxValue = 2.0; while (maxValue < newValue) { maxValue *= 2.0; } } } else { if (m_Measure) { maxValue = m_Measure->GetMaxValue(); std::vector<CMeasure*>::const_iterator i = m_Measures.begin(); for (; i != m_Measures.end(); ++i) { double val = (*i)->GetMaxValue(); maxValue = max(maxValue, val); } } if (maxValue == 0.0) { maxValue = 1.0; } } int x = GetX(); int y = GetY(); // Draw the horizontal lines if (m_HorizontalLines) { // Calc the max number of lines we should draw int maxLines = m_H / 4; // one line per 4 pixels is max int numOfLines; // Check the highest power of 2 that fits in maxLines int power = 2; while (power < maxLines) { power *= 2; } numOfLines = ((int)maxValue % power) + 1; Pen pen(m_HorizontalColor); REAL Y; for (int j = 0; j < numOfLines; ++j) { Y = (REAL)((j + 1) * m_H / (numOfLines + 1)); Y = y + m_H - Y - 1; graphics.DrawLine(&pen, (REAL)x, Y, (REAL)(x + m_W - 1), Y); // GDI+ } } // Draw all the lines if (m_GraphHorizontalOrientation) { const REAL W = m_W - 1.0f; counter = 0; std::vector< std::vector<double> >::const_iterator i = m_AllValues.begin(); for (; i != m_AllValues.end(); ++i) { // Draw a line REAL X, oldX; const double scale = m_ScaleValues[counter] * W / maxValue; int pos = m_CurrentPos; oldX = (REAL)((*i)[pos] * scale); oldX = min(oldX, W); oldX = max(oldX, 0.0f); oldX = x + (m_GraphStartLeft ? oldX : W - oldX); // Cache all lines GraphicsPath path; if (!m_Flip) { for (int j = y + 1, R = y + m_H; j < R; ++j) { ++pos; if (pos >= m_H) pos = 0; X = (REAL)((*i)[pos] * scale); X = min(X, W); X = max(X, 0.0f); X = x + (m_GraphStartLeft ? X : W - X); path.AddLine(oldX, (REAL)(j - 1), X, (REAL)j); oldX = X; } } else { for (int j = y + m_H, R = y + 1; j > R; --j) { ++pos; if (pos >= m_H) pos = 0; X = (REAL)((*i)[pos] * scale); X = min(X, W); X = max(X, 0.0f); X = x + (m_GraphStartLeft ? X : W - X); path.AddLine(oldX, (REAL)(j - 1), X, (REAL)(j - 2)); oldX = X; } } // Draw cached lines Pen pen(m_Colors[counter], (REAL)m_LineWidth); pen.SetLineJoin(LineJoinBevel); graphics.DrawPath(&pen, &path); ++counter; } } else { const REAL H = m_H - 1.0f; counter = 0; std::vector< std::vector<double> >::const_iterator i = m_AllValues.begin(); for (; i != m_AllValues.end(); ++i) { // Draw a line REAL Y, oldY; const double scale = m_ScaleValues[counter] * H / maxValue; int pos = m_CurrentPos; oldY = (REAL)((*i)[pos] * scale); oldY = min(oldY, H); oldY = max(oldY, 0.0f); oldY = y + (m_Flip ? oldY : H - oldY); // Cache all lines GraphicsPath path; if (!m_GraphStartLeft) { for (int j = x + 1, R = x + m_W; j < R; ++j) { ++pos; if (pos >= m_W) pos = 0; Y = (REAL)((*i)[pos] * scale); Y = min(Y, H); Y = max(Y, 0.0f); Y = y + (m_Flip ? Y : H - Y); path.AddLine((REAL)(j - 1), oldY, (REAL)j, Y); oldY = Y; } } else { for (int j = x + m_W, R = x + 1; j > R; --j) { ++pos; if (pos >= m_W) pos = 0; Y = (REAL)((*i)[pos] * scale); Y = min(Y, H); Y = max(Y, 0.0f); Y = y + (m_Flip ? Y : H - Y); path.AddLine((REAL)(j - 1), oldY, (REAL)(j - 2), Y); oldY = Y; } } // Draw cached lines Pen pen(m_Colors[counter], (REAL)m_LineWidth); pen.SetLineJoin(LineJoinBevel); graphics.DrawPath(&pen, &path); ++counter; } } return true; }
BOOL GDIPluseExt::DrawBoardsText(Graphics& gp,PointF startpf,CString strText,CString strFont,INT nfontsize,Color textcolor,Color boardscolor) { gp.SetSmoothingMode(SmoothingModeAntiAlias); gp.SetInterpolationMode(InterpolationModeHighQualityBicubic); #ifdef _UNICODE StringFormat strformat; FontFamily fontFamily(strFont); GraphicsPath path; path.AddString(strText,strText.GetLength(), &fontFamily, FontStyleRegular, (REAL)nfontsize, startpf, &strformat ); for(int i=1; i < 4; ++i) { Pen pen(boardscolor, (REAL)i); pen.SetLineJoin(LineJoinRound); gp.DrawPath(&pen, &path); } SolidBrush textBrush(textcolor); gp.FillPath(&textBrush, &path); #else //字符转换 int font_len = strFont.GetLength(); WCHAR* pfont_w = new WCHAR[font_len]; MultiByteToWideChar(CP_ACP,0,strFont.GetBuffer(),-1,pfont_w,font_len); strFont.ReleaseBuffer(); //字符转换 int text_len = strText.GetLength(); WCHAR* ptext_w = new WCHAR[text_len]; MultiByteToWideChar(CP_ACP,0,strText.GetBuffer(),-1,ptext_w,text_len); strText.ReleaseBuffer(); FontFamily fontFamily(pfont_w); Font font(&fontFamily, (REAL)nfontsize, FontStyleRegular, UnitPixel); GraphicsPath path; StringFormat strformat; path.AddString(ptext_w,wcsnlen_s(ptext_w,text_len), &fontFamily, font.GetStyle(), font.GetSize(), startpf, &strformat ); for(int i=1; i < 4; ++i) { Pen pen(boardscolor,(REAL)i); pen.SetLineJoin(LineJoinRound); gp.DrawPath(&pen, &path); } SolidBrush textBrush(textcolor); gp.FillPath(&textBrush, &path); DEL_P(ptext_w); DEL_P(pfont_w); #endif return TRUE; }