1. 程式人生 > >利用GDI+、貝塞爾曲線繪製一個帶曲線的矩形

利用GDI+、貝塞爾曲線繪製一個帶曲線的矩形

{
    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);//先填充後繪製路徑效果比較明顯
}