Я не понимаю, как это происходит. Вот мой важный код в последовательном порядке:
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 +.
Кто-нибудь может помочь?