2013-05-28 25 views
5

Bir Windows Forms Kullanıcı Denetimi oluşturdum, bir panelin içine sürükleyip bıraktım, panelin üzerine Panel'in Paint olayı çizdim. Panel Denetimi Boya Olayı Kullanıcı Denetimi için çalışmıyor

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** 
} 

Bir WinForm üzerine kullanıcının kontrolünü sürükleyip

, bu pencere formundan Kullanıcı Kontrol bu boya olayı çağırır ancak bu olaya çağrısında grafiği gösterilmektedir ancak bir süre sonra grafik boş olur.

Invalidate(true), Update(), Refresh() tüm bu yöntemleri denedim, ancak hiçbir işe yaramadı.

Aslında, grafiğin formun yarısı üzerinde olduğunu ve sonraki boya olayının tetiklendikten sonra tam ihtiyacım olan grafiği göstermesine karşın, aslında tam grafiği gösteren yarım grafik yerine ilk Paint olayını istiyorum.

+3

:

her zaman bu başarısızlık modu önlemek için boyama kodunda kullanılarak deyimi kullanılır? – Andy

+0

@Andy özür dilerim, benim de aptal hatayı göstermem için teşekkürlerimi ekledim. Teşekkürler …… –

+0

Bu hatayı düzelterek şimdi çözüldü mü? –

cevap

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

Bu kodda System.Drawing nesnesini atmıyorsunuz. Muhtemelen diğer kodlarda da. Bu uzun bir süre fark edilmeden gidebilir, çöp toplayıcı sorunu gizleme eğilimindedir. Ancak, eğer yeterince çalışmazsa, işletim sistemi bu kadar çok sayıda GDI tutamaçlarını kullanmanız konusunda küstahlaşabilir ve programınızın bunlardan daha fazlasını oluşturmasına izin vermez. Kota 10,000 tutaç, çok büyük bir sayı ama sık sık yeniden çizerseniz kolayca tüketilir. Örneğin, sürekli bir güncelleme grafiği çizdiğinizde normaldir. Bir sonraki aşamada, bir istisna ile programınızın artık düzgün bir şekilde boyamadığını fark etmek arasında bir değişiklik var. Eğer() `a Graphics` nesnesi geçmeden DrawWaveForm` çizmek nasıl

using (var pen = new Pen(Color.FromArgb(50, 50, 50))) { 
    e.Graphics.DrawLine(pen, new Point(0, y), new Point(pageWidth, y)); 
} 
İlgili konular