利用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);//先填充后绘制路径效果比较明显
}
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);//先填充后绘制路径效果比较明显
}
相关文章推荐
- HTML5 JS Canvas利用贝塞尔曲线绘制圆角矩形
- C#利用GDI+绘制旋转文字,矩形内可以根据布局方式排列文本
- 【转】VB6 GDI+ 入门教程(3)——笔、刷子、矩形、椭圆绘制
- 利用GDI+在Winfrom绘制验证码
- 【一天一个canvas】绘制一个线性渐变的矩形(五)
- 绘制一个周期内的余弦曲线
- Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
- GDI+绘制圆角矩形
- 安卓杂记(四)利用自定义的PolyBezier()函数将一系列散点绘制成光滑曲线(二)
- C# GDI+ 绘制圆角实心矩形
- Delphi下的GDI+编程[6] 绘制矩形-DrawRectangle
- Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
- HTML5 在canvas绘制一个矩形
- 创建一个 Rectangle类,添加width和lenght两个成员变量 在 Rectangle类中添加两种方法分别计算矩形的周长和面积 编程利用Rectangle输出一个矩形的周长和面积
- 创建一个Rectangle类,添加width和height两个成员变量 在Rectangle中添加两种方法分别计算矩形的周长和面积 编程利用Rectangle输出一个矩形的周
- Android利用canvas画各种图形(点、直线、弧、圆、扁圆、文字、矩形、多边形、曲线、圆角矩形)
- Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
- GDI+绘制一个关闭按钮
- GDI+绘制的一个Report Designer原型
- 【一天一个canvas】绘制一个简单的矩形框(四)