windows.forms.panel дважды вызывает onPaint - PullRequest
0 голосов
/ 15 мая 2011

У меня есть панель с несколькими панелями внутри.Я переопределил OnPaint на главной панели следующим образом:

    protected override void OnPaint(PaintEventArgs e)
    {
        Graphics graph = e.Graphics;
        graph.Clear(Color.Black);
        InvokePaintBackground(this, e);

        graph.ScaleTransform(scale, scale);

        foreach (childPanel child in childPanels)
        {
            child.onPaint(this, e);
        }

        graph.ResetTransform();
    }

У меня проблема в том, что функция onPaint первого элемента управления (элемент управления в точке 0) вызывается дважды, поэтому я получаю две версиидочерней панели, одна с масштабированием, а другая без.Второй onPaint, похоже, вызывается самим дочерним элементом управления.

Как мне не допустить этого?

Ответы [ 3 ]

1 голос
/ 15 мая 2011

С какой стати вы звоните OnPaint на дочерний элемент управления? Windows будет управлять вызовами рисования самостоятельно. Вы никогда не должны вызывать их напрямую, особенно с графическим контекстом, который вы получили от отдельного вызова рисования!

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

1 голос
/ 15 мая 2011

Это потому, что все Control объекты рисуют самостоятельно и метод вызывается автоматически в Windows. Решение состоит в том, чтобы вообще не полагаться на такую ​​функциональность - избавиться от панелей или установить Visible на false.

0 голосов
/ 15 мая 2011

Это врожденное поведение.Вы можете просто использовать переменную private bool secondCall; и выполнять масштабирование только при втором вызове.

...