Uwp 为CompositionClip使用复杂路径
UWP/WinUI中的Visuals可以对其应用a,这是的实例。Uwp 为CompositionClip使用复杂路径,uwp,c++-winrt,winui,windows-composition-api,direct-composition,Uwp,C++ Winrt,Winui,Windows Composition Api,Direct Composition,UWP/WinUI中的Visuals可以对其应用a,这是的实例。CompositionClip的一种类型是a,它可以具有从类派生的多种类型。我正在寻找一个具有圆形矩形形状但具有不同椭圆角半径的剪辑,如下所示 这将非常适合于,但该类有一个限制,即它支持在所有四个角上具有相同的椭圆半径,不允许不同的半径。这样就剩下了由实例定义的。这就是我走到死胡同的地方 此CompositionPath实现接口。我想不出如何使用这个igometrysource2d接口来构建一个包含直线和曲线的复杂路径。在线搜索导
CompositionClip
的一种类型是a,它可以具有从类派生的多种类型。我正在寻找一个具有圆形矩形形状但具有不同椭圆角半径的剪辑,如下所示
这将非常适合于,但该类有一个限制,即它支持在所有四个角上具有相同的椭圆半径,不允许不同的半径。这样就剩下了由实例定义的。这就是我走到死胡同的地方
此CompositionPath
实现接口。我想不出如何使用这个igometrysource2d
接口来构建一个包含直线和曲线的复杂路径。在线搜索导致使用该接口的文章太多,而使用的是从- 我们如何使用
和IGeometrySource2D
创建复杂形状?如果不可行,那么CompositionPath
- 对于
语言投影,是否有任何与之等价的C++/WinRT
CanvasPathGeometry
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);
这似乎有效
现在,,下一步是删除
CanvasPath
等的Win2D
依赖项,并使用ID2D1Geometry
和其他接口提供IGeomterySource2D
,因为我不希望将NuGet包作为项目依赖项。从对象创建一个CompositionPath
它同时实现了igometrysource2d
和igometrysource2dinterop
IgometrySource2dInterop.GetGeometry
要求使用可使用“常规”C/C++实现的Direct2D几何体(ID2D1Geometry
)。在大多数示例中,您会发现这是使用Win2D完成的(这是只为UWP保留的,这是一个愚蠢的设计决策)。正如您所提到的,也许您可以通过CanvasPathGeometry来完成,您可以通过组合这些方法来绘制这样的形状,例如AddSrc()和AddLine()方法。我们正在就您的问题咨询其他工程师,可能会有一些延迟。@SimonMourier您能告诉我有关IgometrySource2dInterop
的参考/文档吗?我找不到任何东西,除了很少有提到这个界面的问题。这是新的微软,全是开源的,但没有全部的文档。定义位于Windows SDK中的C:\Program Files(x86)\Windows Kits\10\Include\10.0.19041.0\winrt\Windows.graphics.interop.h,您可以在Win2D中找到参考: