it-swarm-vi.tech

Làm thế nào để tôi gọi sự kiện Paint?

Chương trình của tôi vẽ văn bản trên bảng điều khiển, nhưng nếu tôi muốn xóa văn bản, tôi phải sơn lại.

Làm cách nào để gọi (nâng) sự kiện Paint bằng tay?

43
Ivan Prodanov

Phương thức Unlimitedate () sẽ gây ra sự sơn lại.

Liên kết MSDN

41
Matthew Vines

Trong phương thức Biểu mẫu hoặc Kiểm soát của bạn, bạn có 3 lựa chọn:

this.Invalidate();  // request a delayed Repaint by the normal MessageLoop system    
this.Update();      // forces Repaint of invalidated area 
this.Refresh();     // Combines Invalidate() and Update()

Thông thường, bạn chỉ cần gọi Invalidate() và để hệ thống kết hợp điều đó với các cập nhật màn hình khác. Nếu bạn đang vội, bạn nên gọi Refresh() nhưng sau đó bạn sẽ gặp rủi ro rằng nó sẽ được sơn lại nhiều lần liên tiếp vì các điều khiển khác (đặc biệt là Phụ huynh) Vô hiệu. 

Cách thông thường mà Windows (Win32 và WinForms.Net) xử lý việc này là đợi MessageQueue chạy trống và sau đó xử lý tất cả các vùng màn hình không hợp lệ. Điều đó là hiệu quả bởi vì khi một cái gì đó thay đổi thường xếp thành những thứ khác (điều khiển) cũng thay đổi. 

Kịch bản phổ biến nhất cho Update () là khi bạn thay đổi một thuộc tính (giả sử là nhãn1.Text, sẽ làm mất hiệu lực Nhãn) trong vòng lặp for và vòng lặp đó đang tạm thời chặn Vòng lặp Thông báo. Bất cứ khi nào bạn sử dụng nó, bạn nên tự hỏi nếu bạn không nên sử dụng một Chủ đề thay thế. Nhưng câu trả lời không phải lúc nào cũng có. 

85
Henk Holterman

Tôi tìm thấy Unlimitedate () tạo quá nhiều nhấp nháy. Đây là tình huống của tôi. Một điều khiển tùy chỉnh Tôi đang phát triển rút ra toàn bộ nội dung thông qua việc xử lý Paint event.

this.Paint += this.OnPaint;

Trình xử lý này gọi một thói quen tùy chỉnh thực hiện bức tranh thực tế.

private void OnPaint(object sender, PaintEventArgs e)
{
    this.DrawFrame(e.Graphics);
}

Để mô phỏng cuộn tôi muốn sơn lại điều khiển của mình mỗi khi con trỏ di chuyển trong khi nhấn nút chuột trái. Lựa chọn đầu tiên của tôi là sử dụng Unlimitedate () như sau.

private void RedrawFrame()
{
    var r = new Rectangle(
        0, 0, this.Width, this.Height);

    this.Invalidate(r);
    this.Update();
}

Điều khiển cuộn OK nhưng nhấp nháy vượt xa mọi mức độ thoải mái. Vì vậy, tôi đã quyết định, thay vì sơn lại điều khiển, gọi trực tiếp phương thức DrawFrame () của tôi sau khi xử lý sự kiện MouseMove . Điều đó tạo ra một cuộn mượt mà không nhấp nháy.

private void RedrawFrame()
{
    var g = Graphics.FromHwnd(this.Handle);
    this.DrawFrame(g);
}

Cách tiếp cận này có thể không áp dụng cho tất cả các tình huống, nhưng cho đến nay nó rất phù hợp với tôi.

6
user2529145

Tôi nghĩ bạn cũng có thể gọi Refresh().

5
Brian

Gọi control.invalidate và sự kiện Paint sẽ được nâng lên.

4
Otávio Décio

Làm mới có lẽ cũng sẽ làm cho mã dễ đọc hơn nhiều, tùy thuộc vào ngữ cảnh.

3
Simon Nunn

sử dụng Control.InvokePaint bạn cũng có thể sử dụng nó để đệm đôi thủ công

0
TheNegative