2016-11-11 11 views
0

それに描か:グリッドでのPictureBoxにCellPaintイベントを追加しますが、私はこのようなピクチャボックス上のグリッドを作成

private void PictureBoxPaint(object sender, PaintEventArgs e) 
     { 
      Graphics g = e.Graphics; 
      int numOfCellsWidth = 50; 
      int numOfCellsHeight = 600; 
      int cellSize = 20; 
      Pen p = new Pen(Color.Black); 

      for (int y = 0; y < numOfCellsHeight; ++y) 
      { 
       g.DrawLine(p, 0, y * cellSize, numOfCellsHeight * cellSize, y * cellSize);      
      } 

      for (int x = 0; x < numOfCellsWidth; ++x) 
      { 
       g.DrawLine(p, x * cellSize, 0, x * cellSize, numOfCellsHeight * cellSize); 
      } 
     } 

をそして、これは、それがどのように見えるかです:
enter image description here

は私が前にtableLayoutPanelと協力し、リストの変更時にセルの色が変わるように配列のリストにバインドできるCellPaintイベントがありました。これは私が持っていたものです:

private void tableLayoutPanelMainGrid_CellPaint(object sender, TableLayoutCellPaintEventArgs e) 
{ 
    if (mainVisualization.mainGrid != null) 
     if (mainVisualization.mainGrid.cellList != null) 
      using (var b = new SolidBrush(mainVisualization.mainGrid.cellList[e.Column, e.Row].color)) 
       e.Graphics.FillRectangle(b, e.CellBounds); 
} 

どうすればこれらの2つを組み合わせることができますか?

+1

あなたのPictureBoxPaint()メソッドで独自のCellPaintイベントを発生させることができます。独自のコントロールクラスを作成するときに最もうまく動作するようになるため、PictureBoxを基本クラスにしてOnPaint()をオーバーライドします。また、イベントハンドラの呼び出しがたくさんあると考えてください。ビットマップを描画するオプションを却下しないでください。 –

+0

ビットマップをリストにバインドするにはどうすればよいですか?リストが変更されるたびにピクチャボックスのビットマップを再描画する必要があります。私の場合、おそらく遅くなるでしょう(私はテトリスのゲームを作っています)。 –

答えて

1

あなたのpictureboxが巨大でない限り、それは遅くなるとは思わない。 PBoxはダブルバッファであり、うまく動作するはずです。

はこのことを考えてみましょう:あなたの CellPaintイベント が見えますがそれは本当に セル 時に呼び出されるので、あなたのTLPの全表面が にあなたにそれを無効に各時間を再描画されている小さな。 So:PBoxの状況とあまり違いはありません。

あなた自身のPaintCellPaintの例です。これは、単純な2d-Color配列と2つのintsを使用して現在のセルサイズを格納します。 に再計算PictureBoxボードを再計算してください!

Color[,] cellList; 
int cellWidth = 23; 
int cellHeight = 23; 

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    if (cellList == null) InitCells(22, 22); 


    for (int c = 0; c < cellList.GetLength(0); c++) 
     for (int r = 0; r < cellList.GetLength(1); r++) 
     { 
      TableLayoutCellPaintEventArgs tep = new 
       TableLayoutCellPaintEventArgs(e.Graphics, 
        Rectangle.Round(e.Graphics.ClipBounds), 
        new Rectangle(c*cellWidth, r*cellHeight, cellWidth, cellHeight), 
        c, r); 
      pictureBox1_CellPaint(e, tep); 
     } 
    // insert the gridline drawing here: 
    for (int c = 0; c <= cellList.GetLength(1); c++) 
      e.Graphics.DrawLine(Pens.DarkSlateBlue, 0, c * cellHeight, 
           cellWidth * cellList.GetLength(0), c * cellHeight); 
    for (int c = 0; c <= cellList.GetLength(0); c++) 
      e.Graphics.DrawLine(Pens.DarkSlateBlue, c * cellWidth, 0, 
           c * cellWidth, cellHeight * cellList.GetLength(1)); 
} 

private void pictureBox1_CellPaint(object sender, TableLayoutCellPaintEventArgs e) 
{ 
    //if (mainVisualization.mainGrid != null) 
    // if (mainVisualization.mainGrid.cellList != null) 
      using (var b = new SolidBrush(cellList[e.Column, e.Row])) 
       e.Graphics.FillRectangle(b, e.CellBounds); 
} 

あなたはそれはあなたがTLPのために持っていたコードの直接のクローンであることがわかります。あなたが本当にはそれがアップしているが、あなたがあなた自身のcellListデータ構造を使用したいと思うでしょうもちろん

..あなたはCellPaintイベントをシミュレートすることができる方法の例..ですこと

やるべきかどうかわかりませんグリッド線の描画をどのように統合するかを決めることができます。最も簡単な方法は、cellPaintループの後に描画することです。

セルサイズを再計算することにより、

(およびPictureBoxInvalidating)それはうまくその内容をresizeます:

enter image description here

+0

恐ろしいです!それは魅力のように機能します!これは非常によく、詳細な答えです。 –

関連する問題