dagogi Ответов: 2

Затухание цвета фона нескольких элементов управления


Привет ребята,

у меня есть 4 текстовых поля в моих формах windows, где пользователь должен вводить текст.
Поэтому, если одно из текстовых полей пусто, я хочу одновременно изменить цвет фона всех пустых текстовых полей с белого на красный и обратно.

Что я уже пробовал:

for (int i = 0; i < 255; i++)
     {
         foreach (var myControl in myDailyToDoControlList)
         {
             if (myControl.Text == "")
             {
                 myControl.BackColor =
                 System.Drawing.Color.FromArgb(255, 255 - i, 255 - i);
                 myControl.Refresh();
             }
         }


     }

     for (int i = 0; i < 255;i++ )
     {
         foreach (var myControl in myDailyToDoControlList)
         {
             if (myControl.Text == "")
             {
                 myControl.BackColor =
                 System.Drawing.Color.FromArgb(255, 0 + i, 0 + i);
                 myControl.Refresh();
             }
         }

     }


Я имею в виду, что это прекрасно работает, но это очень медленное решение. Это занимает очень много времени.
Поэтому я изменил его на этот:

for (int i = 0; i < 255; )
     {
         foreach (var myControl in myDailyToDoControlList)
         {
             if (myControl.Text == "")
             {
                 ((Control)myControl).BackColor =
                 System.Drawing.Color.FromArgb(255, 255 - i, 255 - i);
                 myControl.Refresh();
             }
         }

         i+=5;
     }

     for (int i = 0; i < 255;)
     {
         foreach (var myControl in myDailyToDoControlList)
         {
             if (myControl.Text == "")
             {
                 ((Control)myControl).BackColor =
                 System.Drawing.Color.FromArgb(255, 0 + i, 0 + i);
                 myControl.Refresh();
             }
         }
         i+=5;

     }


Я удалил i++ в операторе for и увеличил его на 5 в конце цикла for. И да, это быстрее, но это уродливо. :)
Поэтому я просто спрашиваю, есть ли еще одно более быстрое решение, может быть, с потоковой передачей или что-то в этом роде? Или вы думаете, что мое решение-хорошее?

Спасибо.
дагоги

CHill60

Резьба не будет иметь никакого значения, так как это все равно должно быть сделано в потоке пользовательского интерфейса - реальный вопрос заключается в том, почему вы хотите выцветить цвет? Просто установите его на фиксированный цвет "это текстовое поле нуждается в вводе данных" - мгновенный

0x01AA

Что значит "медленно"? Если я сделаю это на своем ноутбуке, то время затухания с шагом 1 будет меньше 2 сек. Если бы это было быстрее, вы почти не видите эффекта затухания.

С другой стороны, должен признаться, я ожидал, что это будет гораздо быстрее. Я ожидал, что никто даже не заметит эффекта затухания...

Кстати, из-за нелинейной чувствительности вы можете легко работать в диапазоне от 255 до 55 для "затухания" и наоборот для "затухания".

2 Ответов

Рейтинг:
1

Maciej Los

Прекратите освежать элементы управления внутри петель!

Имейте в виду, что MSDN документация[^] гласить:
Forces the control to invalidate its client area and immediately redraw itself and any child controls.

Я бы предложил обновить основной контейнер, например форму.

С другой стороны, вы можете создать, скажем, "базовую форму", которая будет шаблоном для других форм. Итак, в BaseForm:
protected override void OnLoad(EventArgs e)
{
    //your logic here
    base.OnLoad(e);
}


В других формах:
public partial class OtherForm : BaseForm
{
    //
}


Рейтинг:
0

0x01AA

Пожалуйста, смотрите также мои комментарии к этому вопросу.

Я попробовал то же самое в собственном приложении c++ W32 (c++ Builder). Как я и ожидал, в данном случае это происходит так быстро, что вы не можете распознать "выцветание цвета".
Поэтому я заглянул в справочный источник текстового поля c# Winform опорный источник[^] а также к Контроль.SetStyle(ControlStyles, Boolean) Метод (System.Окна.Формы) | Microsoft Docs[^].

Я бы предположил, что вы можете ускорить процесс, если вы производите от TextBox и используете SetStyle для изменения поведения рисования.

Заключительное слово
С моей точки зрения, в целом не очень стоит этим заниматься, но очень интересно погрузиться в глубины .net ;)


[Редактировать]
Я попробовал использовать UserControl, производный от TextBox, и не смог ускорить затухание. Здесь ультимативный взлом.

ПРЕДУПРЕЖДЕНИЕ Я бы никогда не сделал этого в производственном коде.

// Create a solid brush. The color here is irrelevant
using (SolidBrush shadowBrush = new SolidBrush(Color.Red))
{

    for (int i = 0; i < 255; i++)
    {
        foreach (var myControl in myDailyToDoControlList)
        {
            if (myControl.Text == "")
            {
                shadowBrush.Color = System.Drawing.Color.FromArgb(255, 255 - i, 255 - i);
                Rectangle r = myControl.ClientRectangle;
                Graphics g = myControl.CreateGraphics();
                g.FillRectangle(shadowBrush, r.X, r.Y, r.Width, r.Height);
            }
        }
    }

    for (int i = 0; i < 255; i++)
    {
        foreach (var myControl in myDailyToDoControlList)
        {
            if (myControl.Text == "")
            {
                shadowBrush.Color = System.Drawing.Color.FromArgb(255, 0 + i, 0 + i);
                Rectangle r = myControl.ClientRectangle;
                Graphics g = myControl.CreateGraphics();
                g.FillRectangle(shadowBrush, r.X, r.Y, r.Width, r.Height);
            }
        }

    }
}