Моя нарисованная графика задним числом обрезается, но последующие изменения клипа ... как? - PullRequest
0 голосов
/ 10 ноября 2011

Я не понимаю, как это происходит. Вот мой важный код в последовательном порядке:

protected override void OnPaint(PaintEventArgs e)
{
    g.Clear(backgroundColor);

    CustomCollection.Draw(e.Graphics);
}

// In CustomCollection
public void Draw(Graphics g)
{
    // Here I want to temporarily reset the clip so that I can draw everywhere
    g.ResetClip();
    g.DrawLines(Pens.Red, gridLines);

    foreach (CustomItem item in Items)
    {
        item.Draw(g);
    }
}

// In CustomItem
public void Draw(Graphics g)
{
    GraphicsContainer container = g.BeginContainer();

    // Clip Image to the path
    g.SetClip(path, CombineMode.Intersect);
    g.FillPath(FillBrush, path);
    g.DrawImage(Image, imageRect);
    g.ResetClip();

    g.EndContainer(container);
}

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

Единственное, что я сейчас пытаюсь сделать по-другому, это то, что я хочу рисовать линии сетки, и мне нужно каждый раз рисовать их на всем экране, потому что я выделяю их в зависимости от того, где находится текущий выбранный элемент.

Я понимаю, что приведенный выше код неверен, когда я сбрасываю клип, чтобы нарисовать линии сетки, не восстанавливая потом клип. Я не уверен, как сделать резервную копию клипа, но я попытался создать резервную копию по ссылке и клонировать. Ни один не работал.

Причина, по которой я оставил приведенный выше код как есть, состоит в том, что он подчеркивает проблему, с которой я столкнулся. Глядя на приведенный выше код, вы можете предположить, что я отбрасываю свой регион Clip и каждый раз перерисовываю всю сцену. Но это не то, что происходит. Обрезание все еще происходит, и на самом деле обрезаются линии сетки.

Когда я закомментирую строку item.Draw (g) , мои линии сетки больше не обрезаются. Мне кажется, что это имеет обратную силу, что противоречит всему, что я знаю о GDI +.

Кто-нибудь может помочь?

...