您的位置:首页 > 其它

利用GDI+、贝塞尔曲线绘制一个带曲线的矩形

2014-03-27 22:03 543 查看
第一次发博客而且目前水平有限,就发个今天写的小函数吧,希望对新手有帮助!

void DrawBigRectGraph(CDC* pDC, CRect& rc)

{

const int splitHeigtSeg = 8;

const int splitWidthSeg = 5;

Graphics graphics(pDC->GetSafeHdc());

GraphicsPath path;

CPoint ptCurveSpt = CPoint(rc.TopLeft().x, rc.TopLeft().y+rc.Height()*7/splitHeigtSeg);

CPoint ptCurveEpt = CPoint(rc.TopLeft().x+rc.Width()*3/splitWidthSeg, rc.TopLeft().y+rc.Height()*6/splitHeigtSeg);

CPoint firstCtrlPt = CPoint(rc.TopLeft().x+rc.Width()/splitWidthSeg, rc.TopLeft().y+rc.Height());

CPoint secondCtrlPt = CPoint(rc.TopLeft().x+rc.Width()/splitWidthSeg, rc.TopLeft().y+rc.Height()*6/splitHeigtSeg);

graphics.SetSmoothingMode(Gdiplus::SmoothingModeHighQuality);//抗锯齿

path.AddLine(rc.TopLeft().x, rc.TopLeft().y, ptCurveSpt.x, ptCurveSpt.y);

path.AddBezier(ptCurveSpt.x, ptCurveSpt.y, firstCtrlPt.x, firstCtrlPt.y, secondCtrlPt.x, secondCtrlPt.y, ptCurveEpt.x, ptCurveEpt.y);

path.AddLine(ptCurveEpt.x, ptCurveEpt.y, rc.BottomRight().x, ptCurveEpt.y);

path.AddLine(rc.BottomRight().x, ptCurveEpt.y, rc.TopLeft().x + rc.Width(), rc.BottomRight().y-rc.Height());

path.AddLine(rc.TopLeft().x + rc.Width(), rc.BottomRight().y-rc.Height(), rc.TopLeft().x, rc.TopLeft().y);

LinearGradientBrush pathBrush(Rect(rc.TopLeft().x, rc.TopLeft().y, rc.Width(), rc.Height()), Color::Blue, Color::Red

, LinearGradientMode::LinearGradientModeVertical);

//graphics.FillPath(&pathBrush, &path);

graphics.FillRegion(&pathBrush, &Region(&path));

graphics.DrawPath(&Pen(Color::Black, 2), &path);//先填充后绘制路径效果比较明显

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐