2015-05-25 18 views
6

Tôi muốn chương trình của mình liên tục thay đổi màu nền phông chữ, nhưng tôi muốn nó hoạt động trơn tru nên tôi đã cố sửa đổi biến Màu Color custom; và sử dụng nó cho màu nền của biểu mẫu this.BackColor = custom; nhưng không 't làm việc và tôi không biết làm thế nào để làm cho nó hoạt động, đây là mã hoàn chỉnh:Thay đổi màu mẫu liên tục

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

Nó sẽ hoạt động, nhưng có thể thay đổi quá nhanh. – Shaharyar

+0

khi tôi chạy nó nó chỉ apears bán minh bạch –

+0

Cửa sổ này có hình thức không? – Enigmativity

Trả lời

1

Để bắt đầu, mã hiện tại của bạn không làm việc, nhưng không phải vì bất kỳ vấn đề luồng (mặc dù điều đó không cần phải được giải quyết).

Vấn đề là những dòng này không bao giờ bị đánh:

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

Logic trong while vòng của bạn chỉ cần không làm việc.

Các giá trị mà bạn tạo ra là những bộ:

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

Sau đó nó chỉ lặp đi lặp lại cố gắng để tạo ra những giá trị, nhưng không bao giờ có thể thoát ra khỏi vòng lặp while (contr < 255 && contg == 0).

Bây giờ, giả sử đó thực sự là những gì bạn muốn thì tôi đề nghị cách tiếp cận tốt nhất để làm điều này là sử dụng Khung phản ứng của Microsoft. Chỉ cần nugget "Rx-WinForms" và sau đó bạn có thể viết mã này:

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); 

Vì vậy ranges là một mảng của IObservable<Color>. Gọi số .Concat() trên ranges chuyển từ IObservable<Color>[] sang IObservable<Color>. Các .Zip liên kết mỗi giá trị với một bộ đếm thời gian đếm trong gia số 10ms (bạn có thể thay đổi giá trị nếu bạn muốn). Gọi số .Repeat() chỉ lặp lại vòng lặp liên tục - kiểu như while (true). Sau đó, .ObserveOn(this) buộc đăng ký có thể quan sát được chạy trên chuỗi giao diện người dùng.

Cuối cùng, .Subscribe(...) thực sự chạy quan sát và cập nhật BackColor của biểu mẫu.

Những điều tốt đẹp về vấn đề này là bạn có thể dừng việc đăng ký bất cứ lúc nào bằng cách gọi .Dispose() trên thuê bao:

subscription.Dispose(); 

Đó dọn dẹp tất cả các chủ đề và các bộ đếm thời gian. Đó là một giải pháp rất gọn gàng.

5

rất đơn giản bạn không có sự chậm trễ. do điều này Link thêm

Thread.Sleep(1000); 

tất cả điều này sẽ xảy ra trên một chuỗi riêng biệt! hoặc giao diện người dùng của bạn sẽ bị mắc kẹt

Check This

+1

Cảm ơn, nó hoạt động tốt –

+0

@Fernando Belous chào mừng bạn đến stackoverflow nếu câu trả lời giúp bạn không phải bình luận chỉ đánh dấu nó là câu trả lời đúng để người khác biết đó là giải pháp của bạn. và bạn hoan nghênh! – Nahum

Các vấn đề liên quan