2010-05-05 89 views
1

下面是GDI函數和絃()由MFC提供:如何使用GDIplus實現Chord功能?

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); 

在我看來,沒有這樣的方法是由GDI +(Graphics類)privided,讓我怎麼實現自己的和絃功能(帶完全相同的原型)?

順便說一句,我只是不明白爲什麼MS只是不提供它們。

謝謝。

回答

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; 
}