0

VisualUWP/WinUI 中的 s 可以Clip对它们应用一个CompositionClip. 其中一种类型CompositionClip是 a GeometricClip,它可以具有Geometry从类派生的各种类型CompositionGeometry。我正在寻找一个具有圆角矩形形状但具有不同椭圆角半径的剪辑,如下所示

在此处输入图像描述

这将非常适合,CompositionRoundedRectangleGeometry但该类有一个限制,即它支持在所有四个角上具有相同的椭圆半径,不允许不同的半径。所以剩下CompositionPathGeometryPath就是由一个CompositionPath实例定义的。这是我走到了死胡同的地方。

CompositionPath 实现IGeometrySource2D接口。我不知道如何使用这个IGeometrySource2D界面来构造一条带有线条和曲线的复杂路径。在线搜索导致这篇文章也避开了使用该接口,而是使用围绕CanvasPathGeometry它构建的类Windows Community Toolkit,如果我理解正确,仅适用于C#根据GitHub 页面的项目,并且对我不起作用,因为我需要一些东西在 C++ 中。

所以问题是:

  • 我们如何使用IGeometrySource2DCompositionPath创建复杂的形状?如果不可行,那么
  • 语言投影有什么等价CanvasPathGeometry物吗?C++/WinRT

PS我知道WinUI 3提供RectangleClip(根据this answer)适用于我的情况,但在UWP中不可用,所以这对我来说不是一个可行的解决方案。

编辑:

Win2D.UWP根据评论中共享的建议/指针,这是使用 NuGet 包的尝试。

auto visual = _compositor->CreateSpriteVisual();
visual->Size = float2(500.0f);
visual->Offset = float3(50, 50, 0);
visual->Brush = _compositor->CreateColorBrush(Colors::Red);

auto canvasPathBuilder = ref new CanvasPathBuilder(ref new CanvasDevice());
canvasPathBuilder->BeginFigure(radius.topLeft.x, 0);
canvasPathBuilder->AddLine(visual->Size.x - radius.topRight.x, 0);
canvasPathBuilder->AddArc(float2(visual->Size.x , radius.topRight.y ), radius.topRight.x, radius.topRight.y,
    0, CanvasSweepDirection::Clockwise, CanvasArcSize::Small);
canvasPathBuilder->AddLine(visual->Size.x, visual->Size.y - radius.bottomRight.y);
canvasPathBuilder->AddArc(float2(visual->Size.x - radius.bottomRight.x, visual->Size.y), radius.bottomRight.x, radius.bottomRight.y,
    0, CanvasSweepDirection::Clockwise, CanvasArcSize::Small);
canvasPathBuilder->AddLine(radius.bottomLeft.x, visual->Size.y);
canvasPathBuilder->AddArc(float2(0, visual->Size.y - radius.bottomLeft.y), radius.bottomLeft.x, radius.bottomLeft.y,
    0, CanvasSweepDirection::Clockwise, CanvasArcSize::Small);
canvasPathBuilder->AddLine(0, radius.topLeft.y);
canvasPathBuilder->AddArc(float2(radius.topLeft.x, 0), radius.topLeft.x, radius.topLeft.y,
     0, CanvasSweepDirection::Clockwise, CanvasArcSize::Small);
canvasPathBuilder->EndFigure(CanvasFigureLoop::Closed);

auto canvasGeometry = CanvasGeometry::CreatePath(canvasPathBuilder);
auto compositionPath = ref new CompositionPath(canvasGeometry);
auto pathGeometry = _compositor->CreatePathGeometry();
pathGeometry->Path = compositionPath;
visual->Clip = _compositor->CreateGeometricClip(pathGeometry);

这似乎有效

Win2DRoundedRecangle

现在,下一步将努力删除对et al的Win2D依赖,并使用其他接口来提供,因为我不希望将 NuGet 包作为项目依赖CanvasPathID2D1GeometryIGeomterySource2D

4

0 回答 0