2017-06-19 6 views
0

私は毎秒新しい画像をパネルに追加するタイマーを持っています。最初に、グローバル変数Graphics gを作成し、コンストラクターでタイマーを作成し、そこでタイマーを開始します。私のPanelメソッドでは、私はGraphicsオブジェクト(g = e.Graphics)を作成し、次に私のタイマーメソッドでは、そのgオブジェクトを使って新しいイメージを描画します。問題何を見つけることができない、ここでコアコードです(とき最初の呼び出しでプログラムが停止した - g.DrawImageを()):Graphics DrawImage - ArgumentException: 'パラメータが無効です。'

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

コードが爆発する箇所にブレークポイントを置き、入力があなたが期待しているものであることを確認します。また、try/catchをAddImageのコードの周りに置くと、例外を調べて、実際に何が起こっているかを見ることができます。私はあなたがVisual Studioのバージョンを使用していると仮定しています。 –

+2

ファイルをルートディレクトリに配置しないでください。 – LarsTech

+0

'Graphics'オブジェクトをキャッシュしないでください! 'Graphics.g = Graphics.FromImage(bmp)'を使用して 'Bitmap bmp'に描画するか、' e.Graphics'パラメータを使ってコントロールの 'Paint'イベントに描画します。 - また、あなたの場所とスピーチパスは疑わしい。 – TaW

答えて

0

あなたはOnPaintオーバーライドであなたの画像を描画する必要がGraphicsオブジェクトがするので、処分する。フォームを再描画するにはRefreshと呼ぶことができます。また、画像へのパスが正しいことを確認してください。

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); 
    } 
} 
関連する問題