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

第一次发博客而且目前水平有限,就发个今天写的小函数吧,希望对新手有帮助!

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);//先填充后绘制路径效果比较明显
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮世

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值