2017-06-19 5 views
0

Ich habe Timer, der jede Sekunde ein neues Bild auf dem Panel hinzufügt. Zuerst erstelle ich meine globale Variable Graphics g, erstelle Timer im Konstruktor und starte den Timer dort. In meiner Panel-Methode erstelle ich ein Graphics-Objekt (g = e.Graphics) und verwende dann in meiner Timer-Methode dieses g-Objekt, um ein neues Bild zu zeichnen. Kann nicht finden, was das Problem ist, hier ist der Kern-Code (Programm stoppt, wenn beim ersten Anruf - g.DrawImage()):Graphics DrawImage - ArgumentException: 'Parameter ist nicht gültig.'

public partial class MyClass: Form 
{ 
private Timer addImage; 

private Image img; 

private Graphics g; 
private Point pos; 

public MyClass() 
{ 
    InitializeComponent(); 

    img = Image.FromFile("C:/image.png"); 
    pos = new Point(100, 100); 

    addImage = new Timer() 
    { 
     Enabled = true, 
     Interval = 3000, 
    }; 
    addImage.Tick += new EventHandler(AddImage); 
    addImage.Start(); 
} 

private void MyPanel_Paint(object sender, PaintEventArgs e) 
{ 
    g = e.Graphics; 
} 

private void AddImage(Object myObject, EventArgs myEventArgs) 
{ 
    g.DrawImage(img, pos); // ArgumentException: 'Parameter is not valid.' 

    MyPanel.Invalidate(); 
} 
} 
+0

Setzen Sie einen Haltepunkt, wo der Code explodiert und überprüfen Sie, ob Ihre Eingaben genau das sind, was Sie erwarten. Versuchen Sie auch, den Code in AddImage zu umgehen, damit Sie die Exception untersuchen und sehen können, was wirklich passiert. Ich nehme an, dass Sie eine Version von Visual Studio verwenden. –

+2

Dateien sollten niemals im Stammverzeichnis abgelegt werden. – LarsTech

+0

Versuchen Sie niemals ein 'Graphics' Objekt zu cachen! Zeichnen Sie entweder mit Hilfe eines 'Graphics g = Graphics.FromImage (bmp)' oder im 'Paint' -Ereignis eines Steuerelements in eine' Bitmap bmp', verwenden Sie den 'e.Graphics' Parameter. - Außerdem: Position und Geschwindigkeit Ihrer Pfad ist verdächtig. – TaW

Antwort

0

Sie haben Ihr Bild in der OnPaint Überschreibung zu ziehen, weil das Graphics Objekt entsorgt werden. Um das Formular neu zu zeichnen, rufen Sie Refresh. Achte auch darauf, dass dein Pfad zum Bild korrekt ist.

public partial class MyClass : Form 
{ 
    private readonly Image _image; 
    private readonly Point _position; 
    private bool _isImageVisible; 

    public MyClass() 
    { 
     InitializeComponent(); 

     _image = Image.FromFile(@"C:\img.png"); 
     _position = new Point(100, 100); 

     var addImageCountdown = new Timer 
     { 
      Enabled = true, 
      Interval = 3000, 
     }; 
     addImageCountdown.Tick += new EventHandler(AddImage); 
     addImageCountdown.Start(); 
    } 

    private void AddImage(Object myObject, EventArgs myEventArgs) 
    { 
     _isImageVisible = true; 
     Refresh(); 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     if(_isImageVisible) 
     { 
      e.Graphics.DrawImage(_image, _position); 
     } 
     base.OnPaint(e); 
    } 
} 
Verwandte Themen