c # Winforms: Обновление части графического интерфейса (содержит 1 или более элементов управления) - PullRequest
1 голос
/ 28 мая 2009

У меня есть элемент управления, который может перекрывать несколько пользовательских элементов управления C # в моем графическом интерфейсе. Этот элемент управления имеет полупрозрачный фон для «серого» выделения частей графического интерфейса, и класс выглядит примерно так:

public greyOutControl: UserControl
{
    // Usual stuff here

    protected overide OnPaint()
    {
        paintBackround();

        base.OnPaint();
    }
}

В настоящее время элемент управления иногда зацикливается и постоянно перерисовывает фон, в результате чего полупрозрачный цвет выглядит все менее и менее прозрачным.

Моя идея борьбы с этим заключается в следующем (в общих чертах):

1) Определите, что контролирует greyOutControl поверх 2) вызовите Refresh () для этих элементов управления, чтобы обновить отображение 3) продолжить рисование greyOutControl.

У меня вопрос: как определить, какие элементы управления перекрывают greyOutControl? Или можно обновить только ту часть графического интерфейса, которая покрывает greyOutControl?

Ответы [ 3 ]

2 голосов
/ 28 мая 2009

Почему вы не отслеживаете свои прозрачные элементы управления и не рисуете их после отрисовки всех остальных элементов управления? Окрашивание чего-либо в верхней части Z-порядка не должно вызывать перекрашивание других элементов управления.

0 голосов
/ 09 декабря 2010

Решение этой проблемы, которое я нашел, состояло в том, чтобы программно сделать снимок экрана с наложенной областью, а затем использовать это изображение в качестве фона для наложенного элемента управления. Затем это позволяет поместить альфа-оверлей на изображение в методе OnPaint () и элементе управления для правильного рисования.

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

0 голосов
/ 28 мая 2009

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

...