Nó không phải là loại nhấp nháy mà đệm kép có thể giải quyết. Cũng không phải BeginUpdate hoặc SuspendLayout. Bạn có quá nhiều điều khiển, BackgroundImage có thể làm cho nó nhiều trở nên tồi tệ hơn .
Nó bắt đầu khi UserControl tự vẽ. Nó vẽ BackgroundImage, để lại các lỗ hổng nơi các cửa sổ điều khiển trẻ em đi vào. Mỗi điều khiển trẻ em sau đó sẽ nhận được một thông báo để vẽ chính nó, chúng sẽ điền vào lỗ với nội dung cửa sổ của chúng. Khi bạn có nhiều điều khiển, những lỗ hổng đó sẽ hiển thị cho người dùng trong một thời gian. Chúng thường có màu trắng, tương phản xấu với Hình ảnh nền khi trời tối. Hoặc chúng có thể có màu đen nếu biểu mẫu có thuộc tính Opacity hoặc TransparencyKey, tương phản không tốt với bất kỳ thứ gì.
Đây là một hạn chế khá cơ bản của Windows Forms, nó bị mắc kẹt với cách Windows hiển thị các cửa sổ. Đã được sửa chữa bởi WPF btw, nó không sử dụng cửa sổ cho điều khiển trẻ em. Những gì bạn muốn là đệm kép toàn bộ biểu mẫu, bao gồm cả các điều khiển con. Điều đó có thể, hãy kiểm tra mã của tôi trong chủ đề này để biết giải pháp. Tuy nhiên, nó có tác dụng phụ và không thực sự làm tăng tốc độ vẽ. Mã rất đơn giản, hãy dán mã này vào biểu mẫu của bạn (không phải do người dùng kiểm soát):
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
Có nhiều điều bạn có thể làm để cải thiện tốc độ vẽ, đến mức hiện tượng nhấp nháy không còn đáng chú ý nữa. Bắt đầu bằng cách giải quyết BackgroundImage. Họ có thể thực sự đắt tiền khi hình ảnh nguồn lớn và cần được thu nhỏ để phù hợp với điều khiển. Thay đổi thuộc tính BackgroundImageLayout thành "Tile". Nếu điều đó giúp tăng tốc đáng kể, hãy quay lại chương trình vẽ của bạn và thay đổi kích thước hình ảnh để phù hợp hơn với kích thước điều khiển thông thường. Hoặc viết mã trong phương thức OnResize () của UC để tạo bản sao có kích thước thích hợp của hình ảnh để không phải thay đổi kích thước mỗi khi điều khiển sửa lại. Sử dụng định dạng pixel Format32bppPArgb cho bản sao đó, nó hiển thị nhanh hơn khoảng 10 lần so với bất kỳ định dạng pixel nào khác.
Điều tiếp theo bạn có thể làm là ngăn không cho các lỗ trở nên quá rõ ràng và tương phản xấu với hình ảnh. Bạn có thể tắt cờ kiểu WS_CLIPCHILDREN cho UC, cờ ngăn UC sơn trong khu vực mà trẻ điều khiển. Dán mã này vào mã của UserControl:
protected override CreateParams CreateParams {
get {
var parms = base.CreateParams;
parms.Style &= ~0x02000000; // Turn off WS_CLIPCHILDREN
return parms;
}
}
Giờ đây, các điều khiển con sẽ tự tô lên trên hình nền. Bạn vẫn có thể thấy chúng tự vẽ từng cái một, nhưng lỗ đen hoặc trắng trung gian xấu xí sẽ không thể nhìn thấy được.
Cuối cùng nhưng không kém phần quan trọng, giảm số lượng trẻ kiểm soát luôn là một cách tiếp cận tốt để giải quyết các vấn đề vẽ chậm. Ghi đè sự kiện OnPaint () của UC và vẽ những gì hiện được hiển thị trong một đứa trẻ. Riêng Label và PictureBox rất lãng phí. Thuận tiện cho việc trỏ và nhấp chuột nhưng giải pháp thay thế trọng lượng nhẹ của chúng (vẽ một chuỗi hoặc một hình ảnh) chỉ mất một dòng mã trong phương thức OnPaint () của bạn.
UpdateStyles
sau khi đặt chúng? Nó được ghi chép không tốt, nhưng đôi khi có thể cần thiết.