2009-05-04 1 views
16

Tôi có một bảng điều khiển có một bánh xe roulette trên đó, và tôi cần phải tăng gấp đôi đệm bảng, để nó dừng nhấp nháy. Ai có thể giúp tôi không?Làm cách nào để tăng gấp đôi bộ đệm trong Bảng điều khiển C#?

~ T-Fox

EDIT:

Có, tôi đã cố gắng đó.

bảng điều khiển1.doublebuffered không tồn tại, chỉ this.doublebuffered. Và tôi không cần phải đệm Form, chỉ cần Panel.

+1

Panel * * có thuộc tính DoubleBuffered (JP liên kết với tài liệu cho nó). Lưu ý rằng thuộc tính được bảo vệ, đó là lý do tại sao bạn không thể truy cập được. Tạo một lớp con của Panel và đặt nó trong hàm tạo. – Andy

+1

Có lẽ đây không phải là vấn đề cho người khác, nhưng việc đặt giá trị trong 'InitializeComponent' làm cho nhà thiết kế gặp sự cố; như đã đề cập bởi @Andy, hãy làm điều đó trong hàm tạo. – Dan

Trả lời

5

Bảng biểu mẫu có số DoubleBuffered property.

Chỉnh sửa: Tôi nên nhận thấy rằng nó đã được bảo vệ. Những người khác đã mô tả cách phân loại nó. :)

22

Bạn cần phải xuất phát từ Bảng điều khiển hoặc Hộp ảnh.

Có các phân nhánh tùy thuộc vào cách bạn chọn bật bộ đệm.

Nếu bạn đặt cờ này.DoubleBuffer thì bạn sẽ ổn.

Nếu bạn cập nhật theo cách thủ công các kiểu thì bạn phải tự vẽ biểu mẫu trong WM_PAINT.

Nếu bạn thực sự cảm thấy tham vọng, bạn có thể duy trì và vẽ bộ đệm sau của riêng bạn dưới dạng Bitmap.


using System.Windows.Forms; 

public class MyDisplay : Panel 
{ 
    public MyDisplay() 
    { 
     this.DoubleBuffered = true; 

     // or 

     SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
     SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
     UpdateStyles(); 
    } 
} 
+0

Cảm ơn bạn đã đăng câu trả lời. –

+0

AFAIK PictureBox là bộ đệm đôi anyway .. – TaW

5

Bạn có thể làm cho DoubleBuffered công -Property trong một lớp học derivided của Panel:

public class DoubleBufferedPanel : Panel 
{   
    [DefaultValue(true)] 
    public new bool DoubleBuffered 
    { 
     get 
     { 
      return base.DoubleBuffered; 
     } 
     set 
     { 
      base.DoubleBuffered = value; 
     } 
    } 
} 
+7

Vì không có điểm trong việc sử dụng lớp này ngoại trừ * với * đệm đôi, tôi sẽ làm cho nó đơn giản hơn: 'class DoubleBufferedPanel: Panel {public DoubleBufferedPanel(): base() { DoubleBuffered = true; }} '. –

+0

Rất đơn giản, thực sự. Sau khi thêm một lớp lót này vào dự án của tôi, tất cả những gì tôi phải làm, đã đi đến Nhà thiết kế và thay đổi kiểu dữ liệu của bảng điều khiển được đề cập ở hai nơi và tất cả đều tốt ngay bây giờ .. Rất tuyệt! – TaW

9

Một cách khác để làm điều này là để gọi các thành viên doublebuffered, sử dụng phương pháp InvokeMember:

typeof(Panel).InvokeMember("DoubleBuffered", BindingFlags.SetProperty  
      | BindingFlags.Instance | BindingFlags.NonPublic, null, 
      panel2, new object[] { true }); 

Bằng cách thực hiện theo cách này, bạn không phải tạo một lớp con