Here are the GDI functions Chord() provided by MFC:
BOOL Chord( int x1, int y开发者_高级运维1, int x2, int y2, int x3, int y3, int x4, int y4 );
BOOL Chord( LPCRECT lpRect, POINT ptStart, POINT ptEnd );
It seems to me that no such method is privided by GDI+ (the Graphics class), so how do I implement my own Chord function (with the exact same prototype) ?
By the way, I just don't understand why does MS just don't provide them.
Thanks.
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;
}
精彩评论