2010-09-15 21 views
26

tôi thêm này để mã constructor hình thức của tôi:Winforms đúp Buffering

this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true); 

Nhưng nó vẫn cho thấy hiện vật xấu xí khi nó tải các điều khiển, bất cứ khi nào họ thay đổi (hình thức và thành phần của nó thay đổi (cần cập nhật) thường xuyên) .

Tôi cần làm gì khác?

Trả lời

53

Điều này chỉ có ảnh hưởng đến biểu mẫu, chứ không phải điều khiển con. Nếu bạn có rất nhiều người trong số họ thì thời gian họ cần để thay phiên nhau vẽ bản thân trở nên đáng chú ý, nó để lại một lỗ hình chữ nhật nơi điều khiển đi mà không được lấp đầy cho đến khi kiểm soát con được nó biến.

Điều bạn cần để chống lại điều này là đệm đôi toàn bộ biểu mẫu các điều khiển. Đó là một tùy chọn có sẵn từ Windows XP giúp cờ kiểu WS_EX_COMPOSITED có sẵn. Dán biểu mẫu này vào biểu mẫu của bạn để bật tính năng này:

protected override CreateParams CreateParams { 
    get { 
    CreateParams cp = base.CreateParams; 
    cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED 
    return cp; 
    } 
} 

Nó không tăng tốc độ sơn, nhưng biểu mẫu sẽ chụp nhanh màn hình sau khi trì hoãn. Loại bỏ các hiện vật sơn có thể nhìn thấy. Thực sự khắc phục sự chậm trễ yêu cầu không sử dụng điều khiển. Mà bạn sẽ làm bằng cách sử dụng phương pháp OnPaint để vẽ 'điều khiển' và làm cho sự kiện OnMouseClick thông minh về những gì 'kiểm soát' đã được nhấp bởi người dùng.

+0

WS_EX_COMPOSITED chỉ hoạt động trên chủ đề cổ điển theo win7/vista chứ không phải chủ đề aero. Bất kỳ ai biết giải pháp trong trường hợp này? – KevinBui

+4

@DKhanh - điều này làm việc cho tôi trên Aero –

+0

Nó hoạt động giống như một sự quyến rũ (không phải là một refernce đến Windows 8 quyến rũ, nhưng tôi hy vọng nó cũng hoạt động trên Windows 8, cũng như XP, nếu cần). –