2010-03-04 28 views
22

Trong C# WinForms - Tôi vẽ một biểu đồ dạng đường trong thời gian thực dựa trên dữ liệu nhận được qua cổng nối tiếp sau mỗi 500 ms.Biểu mẫu bắt buộc để vẽ lại?

Logic e.Graphics.DrawLine nằm trong trình xử lý OnPaint của biểu mẫu.

Khi tôi nhận dữ liệu từ cổng nối tiếp, tôi cần phải gọi một thứ gì đó khiến biểu mẫu vẽ lại để trình xử lý OnPaint được gọi. Tôi đã thử điều này.Refresh và this.Invalidate, và những gì xảy ra là tôi mất bất cứ điều gì đã được rút ra trước đó trên biểu mẫu.

Có cách nào khác để đạt được điều này mà không làm mất những gì đã được vẽ trên biểu mẫu của bạn không?

Trả lời

20

Vấn đề là bạn nên nghĩ đến việc lưu trữ dữ liệu bản vẽ của mình ở đâu đó. Như đã nói, một bitmap đệm là một giải pháp. Tuy nhiên, nếu bạn không có quá nhiều thứ để vẽ, đôi khi sẽ dễ dàng hơn và tốt hơn để lưu trữ dữ liệu bản vẽ của bạn trong một biến hoặc một mảng và vẽ lại mọi thứ trong sự kiện OnPaint.

Giả sử bạn nhận được một số dữ liệu điểm cần được thêm vào biểu đồ. Firs của tất cả các bạn tạo một danh sách điểm:

List<Point> points = new List<Point>(); 

Sau đó, mỗi lần bạn sẽ có được một điểm mới bạn thêm nó vào danh sách và làm mới các hình thức:

points.Add(newPoint); 
this.Refresh(); 

Trong trường hợp OnPaint đặt đoạn mã sau :

private void Form_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawLines(Pens.Red, points); 
} 

Điều này hoạt động khá nhanh lên tới 100 000 điểm và sử dụng ít bộ nhớ hơn nhiều so với giải pháp bitmap đệm. Nhưng bạn nên quyết định cách nào để sử dụng theo độ phức tạp của bản vẽ.

+0

Cảm ơn - hoạt động tốt. Câu hỏi nhanh - Tôi vẽ biểu đồ đường này theo thời gian thực - cuối cùng tôi sẽ vượt quá chiều rộng tối đa có sẵn trên màn hình, vì vậy tôi sẽ muốn các đường tôi vẽ trên biểu mẫu dịch chuyển sang bên trái, nhường chỗ cho các tọa độ mới được vẽ. Có bất cứ đề nghị nào cho việc làm như thế này hả? Về cơ bản tôi đang phát triển một ứng dụng loại EKG đơn giản. – Chris

+2

Có rất nhiều cách để thực hiện việc này. Ví dụ, bạn có thể sử dụng e.Graphics.TranslateTransform (-x, 0); Điều này làm cho tất cả các đồ họa của bạn được rút ra thay đổi trái x pixel. – Zenya

0

cách mặc định để xử lý việc này là tạo bitmap bộ nhớ và vẽ trên đó rồi đặt thuộc tính hình ảnh của hộp hình ảnh thành bitmap bộ nhớ.

5

Khi chạy lại, bạn cần phải đệm biểu mẫu của bạn (vì dường như bạn đang loại bỏ dữ liệu sau khi bạn vẽ nó).

này về cơ bản là thế nào tôi sẽ làm điều đó:

private Bitmap buffer; 

// When drawing the data: 
if (this.buffer == null) 
{ 
    this.buffer = new Bitmap(this.ClientSize.Width, this.ClientSize.Height); 
} 

// then draw on buffer 
// then refresh the form 
this.Refresh(); 

protected override void OnPaint(PaintEventArgs e) 
{ 
    if (this.buffer != null) 
    { 
     e.Graphics.DrawImage(this.buffer); 
    } 
} 

Điều đó nói rằng, có thể bạn muốn lưu trữ dữ liệu của bạn, do đó bạn có thể thay đổi kích thước của bộ đệm khi thay đổi kích thước hình thức và sau đó vẽ lại các dữ liệu cũ trên đó.

0

Bạn sẽ cần phải lưu trữ dữ liệu lịch sử ở đâu đó và chỉ cần sơn lại.

Điều đó sẽ dễ dàng hơn nhiều so với việc lưu vào bộ nhớ đệm và cắt bớt ảnh bitmap.

1

Giải pháp có thể là this.Invalidate()

Các vấn đề liên quan