2012-03-19 11 views
0

私はWinFormsユーザーコントロールを持っており、15個の四角形の15行を描画しようとしています。コントロールのサイズが変更した場合、その後、四角は小さくなるはずですが、それでもこのようなパターン15個の正方形の15行、持っている:ユーザーコントロールで15x15の四角形グリッドを作成

OOOOOOOOOOOOOOO 
OOOOOOOOOOOOOOO 
OOOOOOOOOOOOOOO 
OOOOOOOOOOOOOOO 
OOOOOOOOOOOOOOO 
OOOOOOOOOOOOOOO 
OOOOOOOOOOOOOOO 
OOOOOOOOOOOOOOO 
OOOOOOOOOOOOOOO 
OOOOOOOOOOOOOOO 
OOOOOOOOOOOOOOO 
OOOOOOOOOOOOOOO 
OOOOOOOOOOOOOOO 
OOOOOOOOOOOOOOO 
OOOOOOOOOOOOOOO 

を私は15で分割するClientSize.WidthClientSize.Heightを使用しようとしたが、そのています正確に正しく出てこない。このアルゴリズムの助けがあれば幸いです!

これはC#であります。

ここで私が持っているコードである。

グラフィックG = e.Graphicsは、

 g.DrawRectangle(Pens.Black, 0, 0, ClientSize.Width - 1, ClientSize.Height - 1); 

     if (ClientSize.Width > ClientSize.Height) 
     { 
      int ndx = (int)Math.Ceiling(ClientSize.Height/15f); 
      for (int x = 0; x < ClientSize.Width; x += ndx) 
      { 
       for (int y=0 ; y<ClientSize.Height; y+=ndx) 
       { 
        g.DrawLine(Pens.Black, x, y, x + ndx, y); 
        g.DrawLine(Pens.Black, x, y, x, y + ndx); 
       } 
      } 
     } 
     else 
     { 
      int ndx = (int)Math.Ceiling(ClientSize.Width/15f); 
      for (int x = 0; x < ClientSize.Width; x += ndx) 
      { 
       for (int y = 0; y < ClientSize.Height; y += ndx) 
       { 
        g.DrawLine(Pens.Black, x, y, x + ndx, y); 
        g.DrawLine(Pens.Black, x, y, x, y + ndx); 
       } 
      } 
     } 
     g.Dispose(); 
+0

「まさに正しいものはない」とはどういう意味ですか? –

+0

「正確には出てこない」とは、ユーザーコントロールのサイズを変更すると、通常、余分な行や末尾に行がないことを意味します。 – Icemanind

+0

分割が完璧でない限り少し違いがあります。ただし、丸め誤差が原因であるようです。 * low *側では常に切り捨てて、その積分値をループの乗数として使用することをおすすめします。各グリッドセルには右下エッジ(描画時)が含まれている必要があり、グリッド全体の左上端が初期合計サイズ計算で考慮される必要があることに注意してください。 –

答えて

1

グリッドは、コンテナの幅と高さが15で割り切れる場合にのみ適合します。丸めてみます。

const int ColumnCount = 15; 
const int RowCount = 15; 
int cellwidth = (int)Math.Floor(ClientSize.Width/ColumnCount); 
int cellheight = (int)Math.Floor(ClientSize.Height/RowCount ); 

グリッドを描画した後、最後の行と列を超えて領域を明示的に黒く塗りつぶします。太い黒色の枠線がありますが、15x15グリッドが明確に定義されます。

あなたが黒の境界線を避けたい場合は、それぞれColumnCountRowCountの倍数であることをClientSize.Width.Heightを強制します。

+0

コントロールのresizeイベントをインターセプトし、サイズを15の倍数に「スナップ」できますか?可能であれば、この解決策はうまくいくかもしれません – Icemanind

+0

私は印象の下にあった 'int/int - > int'、常に切り捨て(ゼロに丸めます)... –

+0

@icemanind、はい。単に 'Me.Resize'や' Me.SizeChanged'のイベントハンドラを追加し、そこに 'ClientSize'を設定してください。サイズ変更中にグラフィカルなちらつきが発生することがあります。私はこれを回避する方法を研究していない。 –

1

完全な正方形なので、はるかに簡単です。コントロールが背の高いよりも広い場合は、高さを15で割って、それを各四角の辺として使用します。幅が広いよりも大きい場合は、幅を15に分割し、それを各四角の辺として使用します。

+0

私はちょうどコードを掲載しました。私はあなたが言ったことをやっているが、それでも間違っていると思う。下に余分な線があるように。 – Icemanind

関連する問題