2015-05-25 3 views
6

Я хочу, чтобы моя программа постоянно меняла цвет фона шрифта, но я хочу, чтобы он прошел гладко, поэтому я попытался изменить переменную цвета Color custom; и использовать ее для цвет фона в форме this.BackColor = custom;, но это не так. Я работаю, и я не знаю, как это сделать, вот полный код:Меняем цвет формы постоянно

private void Principal_Load(object sender, EventArgs e) 
{ 
    Color custom; 
    int contr = 0, contg = 0, contb = 0; 
    do 
    { 
      while (contr < 255 && contg == 0) 
      { 
       if (contb != 0) 
       { 
        contb--; 
       } 
       contr++; 
       while (contg < 255 && contb == 0) 
       { 
        if (contr != 0) 
        { 
         contr--; 
        } 
        contg++; 
        while (contb < 255 && contr == 0) 
        { 
         if (contg != 0) 
         { 
          contg--; 
         } 
         contb++; 
        } 
       } 
      } 
      custom = Color.FromArgb(contr, contg, contb); 
      this.BackColor = custom; 
    } while (true); 
} 
+1

Это будет работать, но, вероятно, слишком быстро меняется. – Shaharyar

+0

, когда я запускаю его, это только кажется полупрозрачным. –

+0

Являются ли эти окна? – Enigmativity

ответ

1

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

Вопрос заключается в том, что эти строки никогда не попасть:

custom = Color.FromArgb(contr, contg, contb); 
this.BackColor = custom; 

Логика в ваших while петли просто не работают.

Значения, производит набор:

(0, 0, 1), (0, 0, 2) ... (0, 0, 255), (0, 254, 1), (0, 253, 2) ... (0, 1, 254) 

Затем он просто повторил пытается произвести эти ценности, но никогда не может выйти из цикла while (contr < 255 && contg == 0).

Теперь, предполагая, что это на самом деле то, что вы хотели, я предлагаю, чтобы лучший подход к этому - использование Reactive Framework от Microsoft. Всего самородок «Rx-WinForms», а затем вы можете написать этот код:

var ranges = new[] 
{ 
    Observable.Range(1, 255).Select(x => Color.FromArgb(0, 0, x)), 
    Observable.Range(1, 254).Select(x => Color.FromArgb(0, 255 - x, x)), 
}; 

var query = 
    ranges 
     .Concat() 
     .Zip(Observable.Interval(TimeSpan.FromMilliseconds(100.0)), (x, i) => x) 
     .Repeat() 
     .ObserveOn(this); 

var subscription = query.Subscribe(c => this.BackColor = c); 

ranges Так является массивом IObservable<Color>. Вызов .Concat() на ranges включает его от IObservable<Color>[] до IObservable<Color>. .Zip связывает каждое значение с таймером, отсчитываемым с шагом в 10 мс (вы можете изменить значение, если хотите). Вызов .Repeat() просто повторяет цикл непрерывно - вроде как while (true). Затем .ObserveOn(this) заставляет наблюдаемую подписку запускаться в потоке пользовательского интерфейса.

Наконец, .Subscribe(...) фактически запускает наблюдаемый и обновляет форму BackColor.

Хорошая вещь о том, что вы можете остановить подписку в любое время, позвонив .Dispose() по подписке:

subscription.Dispose(); 

Это очищает все потоки и таймера. Это очень аккуратное решение.

5

очень простой, у вас нет задержек. в связи с этим Link добавить

Thread.Sleep(1000); 

все это должно произойти в отдельном потоке! или ваш пользовательский интерфейс будет застрял

Check This

+1

Спасибо, это сработало отлично –

+0

@Fernando Belous приветствуем stackoverflow, если ответ помог вам не прокомментировать, просто отметьте его как правильный ответ, чтобы другие знали, что это тот, кто решил вашу проблему. и вы приветствуете! – Nahum

Смежные вопросы