2016-08-11 44 views
1

私は基本的なウィンドウゲームをC#で作成していますが、画面の基本ビットマップを作成できません。私は、画面の上にパネルを持っていると私はそれを描くことができるようにしたいので、私は次のコードを使用しています:これは、それは私にエラーを与えて実行したときにC#bitmap - パラメータが無効です

public partial class GameWIndow : Form 
{ 
    public GameWIndow() 
    { 
     InitializeComponent(); 
    } 





    private void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     Bitmap buffer; 
     buffer = new Bitmap(Width, Height); 
     Task.Factory.StartNew(() => 
     { 
      using (Graphics g = Graphics.FromImage(buffer)) 
      { 
       g.FillRectangle(new SolidBrush(Color.PaleGoldenrod), 10, 10, 100, 100); 
      } 
      this.Invoke(new Action(() => 
      { 
       this.BackgroundImage = buffer; 
      })); 
     }); 
    } 

ラインのための「パラメータが有効ではありません」を

buffer = new Bitmap(Width, Height); 

幅と高さが900と700 respectivlyあり、そして両方の整数。

私がこれを完全に間違って実行しているという問題がある場合は、これを実現するにはどうすればよいでしょうか。

-------- -------編集

私はあなたのコメントを見ていると、それは私が上記の行っていることは非常に恐ろしいようですので、私は別のアプローチを試みたが、それがはるかに良いかどうかはわかりません。

private Game game; 
    private Thread renderThread; 
    private Stopwatch stopwatch = new Stopwatch(); 

    public GameWindow() 
    { 
     InitializeComponent(); 

     //Starts game 
     game = new Game(); 

     //Starts rendering 
     this.DoubleBuffered = true; 
     renderThread = new Thread(new ThreadStart(draw)); 
     renderThread.Start(); 
    } 

    //Runs when screen is asked to refresh 
    private void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     //Sends graphics to game class where it draws game 
     game.draw(e.Graphics); 

    } 

    private void draw() 
    { 
     stopwatch.Start(); 

     while (true) 
     { 

      //If 1/60th of a sec has passed 
      if (stopwatch.ElapsedMilliseconds > 1000D/60D) 
      { 

       stopwatch.Restart(); 
       Invalidate(); 

      } 
     } 

    } 

上記のコードは正常に実行されません、私はなぜ非常にわからない、と誰かがそれを助けることができれば、私はそれをいただければ幸いです。しかし、私の大きな問題は、それを修正する方法ではありませんが、これが効果的な、または "正しい"方法を描くことさえあれば。

+0

問題は完全に間違っている可能性があります。なぜ私はあなたがそのエラーを取得しているのかは分かりませんが、作成されたスレッド以外のスレッドからGUIを変更することは禁止されています。 (もっと詳しく読むと、間違いなくこのエラーが発生するのではありませんが、ルールはそのまま適用されます) – adv12

+1

何をしようとしていますか?これは少し疑わしいようです。 'PaintEventArgs'にはすでに描画するべき' Graphics'のインスタンスが含まれています。 – vcsjones

+0

そのコントロールにダブルバッファースタイルを有効にした場合、最も簡単な方法で 'Paint'イベント処理コードを書くことができます。 –

答えて

0

@TaWが示唆しているように、多くの問題があります。私はこれがWinFormsアプリケーションのPaintイベントハンドラであると仮定します。それは重要な情報です。

Paintイベントハンドラは、フォームコンテンツ内の何かが再描画を必要とするたびに、OSによって呼び出されます。 PaintEventArgsは、描画する必要があるClipRectangleを提供し、描画するコンテキストはGraphicsです。あなたはあなたのハンドラの中だけに描画するべきです。他の処理を実行したり、スレッドを開始したり、I/Oを実行したりしてはなりません。イメージをロードするかI/Oを実行する必要がある場合は、ハンドラの外側でそれを実行し、結果をフォームプロパティに保存し、描画する四角形を無効にしてから、保存されたプロパティを使用してペイントハンドラを描画します。これは次のようになります。

private void Panel1_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawImage(_buffer, _position); 
} 

_bufferは何ですか? Imageハンドラの外側に入力します。 _position?ハンドラの外側で更新する場所。

ペイントハンドラ内にバッファ、Brush、またはイメージを割り当てないでください。それらをハンドラの外側に作成して再利用します。長いプロセスやネットワーク接続の結果でコントロールを更新する必要がある場合は、ハンドラの外側にTaskまたはBackgroundWorkerを作成し、補完ルーチンで結果を保存し、コントロールを無効にします。ハンドラで保存された結果を使用します。何らかのアニメーションを実行する必要がある場合は、すべてのアニメーションフレームを事前に作成し、タイマーを使用してディスプレイを無効にし、ハンドラーに正しいフレームを描画します。

WinFormグ​​ラフィックスは大きな話題です。本を入手するか、チュートリアルに従う必要があります。

関連する問題