2010-05-05 2 views
1

Voici les fonctions GDI Chord() fournies par MFC:Comment implémenter la fonction Chord avec GDIplus?

BOOL Chord(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4); 

BOOL Chord(LPCRECT lpRect, POINT ptStart, POINT ptEnd); 

Il me semble qu'une telle méthode est privided par GDI + (la classe Graphics), alors comment puis-je mettre ma propre fonction d'accords (avec le même prototype exact)? Au fait, je ne comprends tout simplement pas pourquoi MS ne les fournit tout simplement pas.

Merci.

Répondre

0
BOOL GDIplusChord(HDC hDC, INT x1, INT y1, INT x2, INT y2, INT x3, INT y3, INT x4, INT y4) 
{ 
    Graphics graphics(hDC); 
    CRect rectBound(x1, y1, x2, y2); 
    rectBound.NormalizeRect(); 
    Rect ellipseRect(rectBound.left, rectBound.top, rectBound.Width(), rectBound.Height()); 

    //////////////////////////////////////////////////////////////////////////////// 
    // For testing only. 
    BYTE  byAlpha = 200; 
    SolidBrush fillBrush(Color(byAlpha, 0, 0, 255)); 
    Pen   redPen(Color(byAlpha, 255, 0, 0), 3); 
    //////////////////////////////////////////////////////////////////////////////// 
    Status ret = InvalidParameter; 

    if (x3 == x4 && y3 == y4) 
    { 
     // If the starting point and ending point of the curve are the same, a complete ellipse should be drawn. 
     ret = graphics.FillEllipse(&fillBrush, ellipseRect); 
     ret = graphics.DrawEllipse(&redPen, ellipseRect); 
     return Gdiplus::Ok == ret; 
    } 

    CPoint ptCenter(rectBound.CenterPoint()); 

#define PI 3.1415926 

    REAL startAngle = atan2(y3-ptCenter.y, x3-ptCenter.x) * 180.0f/PI; 
    REAL sweepAngle = (atan2(y4-ptCenter.y, x4-ptCenter.x) * 180.0f/PI) - startAngle - 360.0f; 
    if (sweepAngle < -360.0f) 
     sweepAngle += 360.0f; 

    GraphicsPath path; 
    path.StartFigure(); 
    path.AddArc(ellipseRect, startAngle, sweepAngle); 
    path.CloseFigure(); 

    ret = graphics.FillPath(&fillBrush, &path); 
    ret = graphics.DrawPath(&redPen, &path); 

    return Gdiplus::Ok == ret; 
} 
Questions connexes