почему прямоугольник перекрытия, нарисованный в CanvasRenderTarget, был виден в win2d? - PullRequest
0 голосов
/ 03 августа 2020

что я пробовал? мой код XAML:

 <Canvas x:Name="can">

 </Canvas>

мой c# код:

   private void Page_Loaded(object sender, RoutedEventArgs e)
    {
        CanvasVirtualControl canvasVirtual = new CanvasVirtualControl();
        canvasVirtual.Width = 1500;
        canvasVirtual.Height = 800;
        canvasVirtual.RegionsInvalidated += CanvasVirtual_RegionsInvalidated;
       //canvasVirtual.Invalidate();
        can.Children.Add(canvasVirtual);
    }

    private void CanvasVirtual_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
    {
        CanvasRenderTarget Offscreen = new CanvasRenderTarget(CanvasDevice.GetSharedDevice(), (float)args.InvalidatedRegions[0].Width, (float)args.InvalidatedRegions[0].Height, 96);
        using (CanvasDrawingSession session = Offscreen.CreateDrawingSession())
        {
            CanvasRenderTarget mouseOverOffscreen = new CanvasRenderTarget(CanvasDevice.GetSharedDevice(), 300, 300, 96);
            CanvasDrawingSession session1;
            using (session1 = mouseOverOffscreen.CreateDrawingSession())
            {
                session1.DrawRectangle(new Rect(0, 0, 300, 300), new Color { A = 255, R = 0, G = 255, B = 0 }, 2);
            }
            session.DrawImage(mouseOverOffscreen, new Rect(100, 100, 300, 300));
            CanvasRenderTarget seleOverOffscreen = new CanvasRenderTarget(CanvasDevice.GetSharedDevice(), 300, 300, 96);
            CanvasDrawingSession session2;
            using (session2 = seleOverOffscreen.CreateDrawingSession())
            {
                session2.DrawRectangle(new Rect(0, 0, 300, 300), new Color { A = 255, R = 255, G = 0, B = 0 }, 2);
            }
            session.DrawImage(seleOverOffscreen, new Rect(200, 200, 300, 300));
        }
        

        using (CanvasDrawingSession session = sender.CreateDrawingSession(new Rect((float)args.InvalidatedRegions[0].X, (float)args.InvalidatedRegions[0].Y, (float)args.InvalidatedRegions[0].Width, (float)args.InvalidatedRegions[0].Height)))
        {
            session.DrawImage(Offscreen);
        }
    }

Я пытаюсь нарисовать два пересекающихся прямоугольника в canvasVirtualControl, используя canvasRenderTarget. Изображения прямоугольников создаются с помощью canvasRenderTarget . Эти два изображения рисуются за пределами экрана, и это за кадром позже используется для рисования в CanvasVirtualControl.

Моя проблема заключалась в том, что при рисовании двух пересекающихся прямоугольников (т. Е. Перекрытие) результат будет примерно таким. enter image description here

I need to erase the rectangle area where it is overlapped,how can i do this?Example,like the below image,

введите описание изображения здесь

1 Ответ

1 голос
/ 03 августа 2020

Это включает в себя расчет путей в Win2D. CanvasGeometry предоставляется в Win2D для комбинированного расчета графики, что может удовлетворить ваши потребности:

Нам нужно создать два CanvasGeometry как два прямоугольника:

var Rect1 = CanvasGeometry.CreateRectangle(sender, 100, 100, 300, 300);
var Rect2 = CanvasGeometry.CreateRectangle(sender, 0, 0, 300, 300);

С помощью метода CanvasGeometry.CombineWith мы можем вычислить объединенную площадь:

var combineGeo = Rect2.CombineWith(Rect1, Matrix3x2.CreateTranslation(Vector2.Zero), CanvasGeometryCombine.Union);

Следующий шаг - нарисовать:

private void CanvasVirtual_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
{
    CanvasRenderTarget Offscreen = new CanvasRenderTarget(CanvasDevice.GetSharedDevice(), (float)args.InvalidatedRegions[0].Width, (float)args.InvalidatedRegions[0].Height, 96);
    using (CanvasDrawingSession session = Offscreen.CreateDrawingSession())
    {
        CanvasRenderTarget mouseOverOffscreen = new CanvasRenderTarget(CanvasDevice.GetSharedDevice(), 300, 300, 96);
        CanvasDrawingSession session1;
        var Rect1 = CanvasGeometry.CreateRectangle(sender, 100, 100, 300, 300);
        var Rect2 = CanvasGeometry.CreateRectangle(sender, 0, 0, 300, 300);
        var combineGeo = Rect2.CombineWith(Rect1, Matrix3x2.CreateTranslation(Vector2.Zero), CanvasGeometryCombine.Union);
        using (session1 = mouseOverOffscreen.CreateDrawingSession())
        {
            session1.DrawGeometry(combineGeo, new Color { A = 255, R = 0, G = 255, B = 0 }, 2);
        }
        session.DrawImage(mouseOverOffscreen, new Rect(100, 100, 300, 300));
        CanvasRenderTarget seleOverOffscreen = new CanvasRenderTarget(CanvasDevice.GetSharedDevice(), 300, 300, 96);
        CanvasDrawingSession session2;
        using (session2 = seleOverOffscreen.CreateDrawingSession())
        {
            session2.DrawGeometry(Rect2, new Color { A = 255, R = 255, G = 0, B = 0 }, 2);
        }
        session.DrawImage(seleOverOffscreen, new Rect(200, 200, 300, 300));
    }


    using (CanvasDrawingSession session = sender.CreateDrawingSession(new Rect((float)args.InvalidatedRegions[0].X, (float)args.InvalidatedRegions[0].Y, (float)args.InvalidatedRegions[0].Width, (float)args.InvalidatedRegions[0].Height)))
    {
        session.DrawImage(Offscreen);
    }
}

Результат визуализации будет отображаться в виде перекрывающихся прямоугольников, которые удалите внутренние пересекающиеся границы (эффект немного отличается от ожидаемого эффекта в слое).

...