2013-05-28 15 views
5

Ho creato un controllo utente Windows Form, ho trascinato, lasciato cadere un pannello al suo interno e sul pannello ho disegnato il grafico nell'evento Paint di Panel.Panel Control Paint Evento non funzionante per User Control

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

Quando ho trascinare questo controllo utente su una WinForm, si chiama questo evento vernice di controllo utente dalla forma finestre, ma durante la chiamata a questo evento viene mostrato il grafico, ma dopo qualche tempo il grafico diventa vuota.

Ho provato Invalidate(true), Update(), Refresh() tutti questi metodi ma erano inutili.

realtà mostra la metà del grafico sulla forma e dopo la prossima lo stesso evento vernice viene licenziato poi mostra il grafico completo che ho bisogno, ma in realtà io voglio il primo evento Paint invece di grafici metà mostrando il grafico completo.

+3

Come si disegna in 'DrawWaveForm()' senza passare un oggetto 'Graphics'? – Andy

+0

@Andy scusate solo che ho dimenticato di aggiungerlo grazie per mostrare il mio stupido errore aggiornare anche il codice grazie ancora ........ –

+0

Questo problema è risolto correggendo quell'errore? –

risposta

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

Non si dispone l'oggetto System.Drawing in questo codice. Forse anche in altro codice. Questo può passare inosservato per molto tempo, il garbage collector tende a nascondere il problema. Ma se non viene eseguito abbastanza spesso, il sistema operativo può diventare scontroso con l'utilizzo di così tanti handle GDI e non permetterà al tuo programma di crearne altri. La quota è di 10.000 maniglie, un numero molto grande ma facilmente consumabile se si rivernicia spesso. Tipico quando si disegna un grafico costantemente aggiornato per esempio. Quello che succede dopo varia, a metà tra un'eccezione e notando che il tuo programma non dipinge più correttamente.

Utilizzare sempre la dichiarazione utilizzando nel codice pittura per evitare questo tipo di guasto:

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