Direct2D中能否单独设置圆角矩形各角的圆角半径?
在Direct2D中单独设置圆角矩形各角半径的方法
首先解释你困惑的radiusX和radiusY:
这两个参数定义的是圆角的椭圆半轴尺寸,并非正圆半径。CreateRoundedRectangleGeometry()生成的圆角矩形,四个角都会复用这组参数生成椭圆弧——当radiusX和radiusY相等时,就是我们常见的正圆圆角;如果两者不等,四个角的圆角会是对应比例的椭圆弧,且所有角的形状完全一致。
关于单独设置每个角的圆角半径:
Direct2D的CreateRoundedRectangleGeometry()接口本身不支持这种需求。如果需要让四个角使用不同的圆角参数(比如某两个角是圆角、另外两个是直角,或者各角圆角大小不同),确实必须通过CreatePathGeometry()手动构建路径来实现。
下面是一个简单的示例代码,演示如何手动创建一个各角圆角不同的矩形(以宽100、高100的矩形为例:左上角圆角10x10,右上角圆角5x5,右下角无圆角,左下角圆角15x15):
ID2D1PathGeometry* pathGeometry = nullptr; HRESULT hr = factory->CreatePathGeometry(&pathGeometry); if (SUCCEEDED(hr)) { ID2D1GeometrySink* sink = nullptr; hr = pathGeometry->Open(&sink); if (SUCCEEDED(hr)) { sink->SetFillMode(D2D1_FILL_MODE_WINDING); // 起点:左上角圆角的结束点 D2D1_POINT_2F startPoint = D2D1::Point2F(10.0f, 0.0f); sink->BeginFigure(startPoint, D2D1_FIGURE_BEGIN_FILLED); // 绘制上边直线到右上角圆角起点 sink->AddLine(D2D1::Point2F(90.0f, 0.0f)); // 添加右上角椭圆弧 sink->AddArc(D2D1::ArcSegment( D2D1::Point2F(100.0f, 5.0f), D2D1::SizeF(5.0f, 5.0f), 0.0f, D2D1_SWEEP_DIRECTION_CLOCKWISE, D2D1_ARC_SIZE_SMALL )); // 绘制右边直线到右下角 sink->AddLine(D2D1::Point2F(100.0f, 100.0f)); // 右下角无圆角,直接绘制直线到左下角 sink->AddLine(D2D1::Point2F(0.0f, 100.0f)); // 添加左下角椭圆弧 sink->AddArc(D2D1::ArcSegment( D2D1::Point2F(15.0f, 85.0f), D2D1::SizeF(15.0f, 15.0f), 0.0f, D2D1_SWEEP_DIRECTION_CLOCKWISE, D2D1_ARC_SIZE_SMALL )); // 绘制左边直线回到起点 sink->AddLine(startPoint); sink->EndFigure(D2D1_FIGURE_END_CLOSED); sink->Close(); sink->Release(); } } // 使用pathGeometry完成绘制后,记得释放资源 // pathGeometry->Release();
内容的提问来源于stack exchange,提问作者Ngdgvcb
相关产品推荐
相关产品推荐

