2012-03-19 94 views
0

我有一個WinForms用戶控件,我試圖繪製15個15格的正方形。如果控制的大小而變化,那麼平方應該越來越小,但仍然有15行15個平方,這樣的模式:在用戶控件中創建15x15正方形網格

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

我試圖使用ClientSize.WidthClientSize.Height了15分,但其沒有完全正確地出現。任何幫助這個算法,將不勝感激!順便說一句,這是用C#編寫的。

這裏是我的代碼:

Graphics 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

那麼,「沒有完全正確地出現」是什麼意思? (*有用的*問題描述*和*代碼,請) – 2012-03-19 02:16:21

+0

「沒有完全正確地出現」意味着當我調整用戶控件的大小時,通常會在末尾添加一行或缺少一行 – Icemanind 2012-03-19 02:20:40

+0

除非該部門是完美的會有一點區別。但是,這聽起來像是由四捨五入錯誤引起的。我會建議總是通過向下舍入來拍攝*低*邊,然後使用該(積分)值作爲循環中的乘數。請記住,每個網格單元格可能應包含其右下邊緣(繪圖時),並應在初始總大小計算中考慮整個網格的左上邊緣。 – 2012-03-19 02:25:02

回答

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的網格。

如果您想避開黑色邊框,請分別將ClientSize.Width.Height分別設爲ColumnCountRowCount的倍數。

+0

我可以攔截控件的調整大小事件並將「調整大小」「捕捉」到15的倍數?如果可以的話,這個解決方案可能會工作 – Icemanind 2012-03-19 02:40:44

+0

我的印象是'int/int - > int',總是截斷(舍入到零)...... – 2012-03-19 03:10:52

+0

@icemanind,是的。只需爲「Me.Resize」或「Me.SizeChanged」添加事件處理程序,並在其中設置「ClientSize」。調整大小時可能會出現一些圖形閃爍。我還沒有想出如何避免這種情況。 – 2012-03-19 03:24:09

1

既然你有一個完美的廣場,它會容易得多;如果控件的寬度比高度大,則將高度分爲15,並將其用作每個方塊的邊。如果寬度比寬度寬,則將寬度分爲15,並將其用作每個方塊的邊。

+0

我剛剛發佈了代碼。我正在做你說的我的想法,但它仍然出錯。就像在底部附近會有一條額外的線。 – Icemanind 2012-03-19 02:27:12