2

次の C# コードを使用して、ユーザー コントロールに 7 x 5 のグリッドを描画しようとしています。

Pen p = _createPen( Brushes.Red );

int slotWidth = this.Width / 7;
int slotHeight = this.Height / 5;

// columns = days
for ( int c = 1; c < 7; c++ )
{
    // rows = weeks
    for ( int r = 1; r < 5; r++ )
    {
        g.FillRectangle( Brushes.LightGray, new Rectangle( 1, ( ( r - 1 ) * slotHeight ) + 1, this.Width - 2, 10 ) );
        g.DrawLine( p, new Point( 0, r * slotHeight ), new Point( this.Width, r * slotHeight ) );
            }
        g.DrawLine( p, new Point( c * slotWidth, 1 ), new Point( c * slotWidth, this.Height - 2 ) );
    }
}

私が抱えている問題は、最後の列の線が塗りつぶされた四角形の上に描画されていることですが、他の列はそうではありません。FillRectangle()が最初に実行されるため、後続のDrawLine()メソッドが長方形を描画する必要がある理由はわかりませんが、そうではありません。

ユーザー コントロールのPaint()イベントにコードが追加されました。

4

1 に答える 1

4

簡単な行を配置します。

g.DrawLine(p, new Point(c * slotWidth, 1), new Point(c * slotWidth, this.Height - 2));

行の for ループの前。

  // columns = days
  for (int c = 1; c < 7; c++)
  {
       g.DrawLine(p, new Point(c * slotWidth, 1), new Point(c * slotWidth, this.Height - 2));
       // rows = weeks
       for (int r = 1; r < 5; r++)
       {
            g.FillRectangle(Brushes.LightGray, new Rectangle(1, ((r - 1) * slotHeight) + 1, this.Width - 2, 10));
            g.DrawLine(p, new Point(0, r * slotHeight), new Point(this.Width, r * slotHeight));
       }              
   }

次の反復がないため、最後の行が他の行を上書きしています。最後の反復の前の反復では、赤い列の線を四角形で毎回塗りつぶしています。

于 2013-07-23T14:26:37.393 に答える