2013-05-28 25 views
5

Tôi đã tạo một Windows Forms User Control, tôi kéo, thả một bảng điều khiển bên trong nó và trên bảng điều khiển tôi vẽ biểu đồ trong sự kiện Paint của Panel.Panel Control Paint Sự kiện không hoạt động cho điều khiển người dùng

private void pnlViewer_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.TranslateTransform(pnlViewer.AutoScrollPosition.X, pnlViewer.AutoScrollPosition.Y); 
    e.Graphics.FillRectangle(Brushes.Black, Screen.PrimaryScreen.Bounds); 
    //**draw Y Axis** 
    int y; 
    for (int i = 0; i <= 50; i++) 
    { 
     y = (i * cellHeight) + cellHeight; 
     e.Graphics.DrawLine(new Pen(Color.FromArgb(50, 50, 50)), 
          new Point(0, y), new Point(pageWidth, y)); 
    } 
    //**draw X Axis** 
    int x; 
    for (int i = 0; i < 50; i++) 
    { 
     x = (i * cellWidth) + ribbonWidth; 
     e.Graphics.DrawLine(new Pen(Color.FromArgb(50, 50, 50)), 
          new Point(x, 0), new Point(x, pageHeight)); 
    } 
    DrawWaveForm(e.Graphics); **// Here the actual data of graph will draw** 
} 

Khi tôi kéo điều khiển người dùng này lên một WinForm, nó gọi sự kiện sơn này của User Control từ hình thức cửa sổ, nhưng khi gọi sự kiện này đồ thị được hiển thị nhưng sau một thời gian biểu đồ trở nên trống.

Tôi đã thử Invalidate(true), Update(), Refresh() tất cả các phương pháp như vậy nhưng chúng không được sử dụng.

Thực tế nó hiển thị một nửa biểu đồ trên biểu mẫu và sau đó là biểu đồ đầy đủ mà tôi yêu cầu, nhưng thực sự tôi muốn có sự kiện Paint đầu tiên thay vì một nửa biểu đồ hiển thị biểu đồ đầy đủ.

+3

Làm thế nào để bạn vẽ trong 'DrawWaveForm()' mà không đi một 'đối tượng Graphics'? – Andy

+0

@Andy xin lỗi tôi chỉ cần quên thêm nó nhờ để hiển thị sai lầm ngớ ngẩn của tôi cũng cập nhật mã nhờ những người một lần nữa ........ –

+0

Điều này có được giải quyết ngay bây giờ bằng cách sửa lỗi đó? –

Trả lời

3
e.Graphics.DrawLine(new Pen(Color.FromArgb(50, 50, 50)), 
         new Point(0, y), new Point(pageWidth, y)); 

Bạn không loại bỏ đối tượng System.Drawing trong mã này. Có thể trong mã khác nữa. Điều này có thể không được chú ý trong một thời gian dài, bộ thu gom rác có xu hướng che giấu vấn đề. Nhưng nếu nó không chạy đủ thường thì hệ điều hành có thể bị hờn dỗi về bạn bằng cách sử dụng quá nhiều xử lý GDI và nó sẽ không cho phép chương trình của bạn tạo thêm bất kỳ thứ gì trong số chúng. Hạn ngạch là 10.000 tay cầm, một số lượng rất lớn nhưng dễ tiêu thụ nếu bạn thường xuyên sơn lại. Điển hình khi bạn vẽ một đồ thị liên tục cập nhật chẳng hạn. Điều gì xảy ra tiếp theo khác nhau, một nơi nào đó giữa một ngoại lệ và nhận thấy rằng chương trình của bạn không vẽ chính xác nữa.

Luôn luôn sử dụng câu lệnh sử dụng trong mã sơn để tránh chế độ thất bại này:

using (var pen = new Pen(Color.FromArgb(50, 50, 50))) { 
    e.Graphics.DrawLine(pen, new Point(0, y), new Point(pageWidth, y)); 
} 
Các vấn đề liên quan