2008-09-15 34 views
8

Tôi muốn tạo điều khiển tùy chỉnh trong C#. Nhưng mỗi lần tôi phải vẽ lại hoàn toàn khả năng điều khiển của mình, nó sẽ nhấp nháy, ngay cả khi tôi sử dụng tính năng đệm đôi (vẽ lên Hình ảnh trước tiên, và làm nhòe nó).Làm thế nào để loại bỏ nhấp nháy trong điều khiển tùy chỉnh Windows.Forms khi cuộn?

Làm cách nào để loại bỏ nhấp nháy khi tôi phải vẽ lại hoàn toàn?

Trả lời

13

Bạn có thể thử đặt những điều sau vào hàm dựng của mình sau cuộc gọi InitiliseComponent.

SetStyle(ControlStyles.OptimizedDoubleBuffer | 
     ControlStyles.UserPaint | 
     ControlStyles.AllPaintingInWmPaint, true); 

EDIT:

Nếu bạn đang đem lại cho này một đi, nếu bạn có thể, loại bỏ mã đệm đôi của riêng bạn và chỉ có sự kiểm soát vẽ bản thân để đáp ứng với các phương pháp ảo thích hợp được gọi.

+0

Tôi thường đặt công cụ đó vào trước Application.Run nhưng tôi nghĩ đây là giải pháp tốt nhất cho vấn đề này. – Quibblesome

+0

Tôi đồng ý. Tôi cũng đã tìm thấy một url tốt trong một câu hỏi liên quan đến nhấp nháy khác. http://www.codeproject.com/KB/graphics/DoubleBuffering.aspx – user7305

+0

Tôi đã thử soooo mant giải pháp khác nhau nhưng điều này sửa chữa nó !! 1 cho nói để đặt nó sau khi InitializeComponent(); !! xoxoxo – Emily

0

Bạn nói rằng bạn đã thử đệm đôi, nhưng sau đó bạn nói vẽ vào Hình ảnh trước và xóa nó. Bạn đã thử thiết lập DoubleBuffered = true trong constructor hơn là tự mình làm với một Image?

1

Nó có thể là tốt, đủ để chỉ cần gọi

SetStyle(ControlStyles::UserPaint | ControlStyles::AllDrawingInWmPaint, true); 

Các nhấp nháy bạn đang nhìn thấy rất có thể bởi vì Windows rút nền tảng của sự kiểm soát đầu tiên (thông qua WM_ERASEBKGND), sau đó yêu cầu kiểm soát của bạn để làm bất cứ điều gì thu hút bạn cần để thực hiện (thông qua WM_PAINT). Bằng cách vô hiệu hóa sơn nền và làm tất cả các bức tranh trong ghi đè OnPaint của bạn có thể loại bỏ các vấn đề trong 99% các trường hợp mà không cần phải sử dụng tất cả bộ nhớ cần thiết cho đệm đôi.

8

Tôi đã lấy từ chương trình C# đang hoạt động. Các áp phích khác có lỗi cú pháp và được sao chép rõ ràng từ C++ thay vì C#

SetStyle(ControlStyles.OptimizedDoubleBuffer | 
         ControlStyles.UserPaint | 
         ControlStyles.AllPaintingInWmPaint, true); 
Các vấn đề liên quan