2015-11-28 24 views
5

私はWindowsフォームアプリケーションを使用して2Dでマジックスクエアを作成することになっています。それは次のようになります。Windowsフォームを使用してマジックスクエアを作成する方法は?

Image of 3x3 magic Square with numbers and grid shown.

しかし、ユーザーは、正方形(3×3,5×5、7×7など)の大きさを決めることができるはずです。私はすでにコンソールアプリケーションにコードを書いていましたが、2Dグラフィックスを追加する方法はわかりません。

誰かがすでにこの質問をしました(How do I put my result into a GUI?)。回答のうちの1つはDataGridViewですが、それが画像のように見えないので、私が探しているものかどうかはわかりません。

アイデアやアドバイスはありますか?

+0

あなたは 'TableLayoutPanel'を使用してパネルにボタンを動的に追加できます。 –

答えて

6

あなたはTableLayoutPanelを使用して動的にパネルにボタンを追加することができます。

ボタンと対話する必要がない場合は、代わりにLabelを追加できます。

動的に四角形を作成します。

public void CreateSquare(int size) 
{ 
    //Remove previously created controls and free resources 
    foreach (Control item in this.Controls) 
    { 
     this.Controls.Remove(item); 
     item.Dispose(); 
    } 

    //Create TableLayoutPanel 
    var panel = new TableLayoutPanel(); 
    panel.RowCount = size; 
    panel.ColumnCount = size; 
    panel.BackColor = Color.Black; 

    //Set the equal size for columns and rows 
    for (int i = 0; i < size; i++) 
    { 
     var percent = 100f/(float)size; 
     panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, percent)); 
     panel.RowStyles.Add(new RowStyle(SizeType.Percent, percent)); 
    } 

    //Add buttons, if you have your desired output in an array 
    //you can set the text of buttons from your array 
    for (var i = 0; i < size; i++) 
    { 
     for (var j = 0; j < size; j++) 
     { 
      var button = new Button(); 
      button.BackColor = Color.Lime; 
      button.Font = new Font(button.Font.FontFamily, 20, FontStyle.Bold); 
      button.FlatStyle = FlatStyle.Flat; 

      //you can set the text of buttons from your array 
      //For example button.Text = array[i,j].ToString(); 
      button.Text = string.Format("{0}", (i) * size + j + 1); 
      button.Name = string.Format("Button{0}", button.Text); 
      button.Dock = DockStyle.Fill; 

      //If you need interaction with buttons 
      button.Click += b_Click; 
      panel.Controls.Add(button, j, i); 
     } 
    } 
    panel.Dock = DockStyle.Fill; 
    this.Controls.Add(panel); 
} 

をあなたは一例として、ボタン

void button_Click(object sender, EventArgs e) 
{ 
    var button = (Button)sender; 
    //Instead put your logic here 
    MessageBox.Show(string.Format("You clicked {0}", button.Text)); 
} 

との相互作用が必要な場合は、スクリーンショット

CreateSquare(3); 

を呼び出すことができます

enter image description here

+0

ありがとう!これは、3x3の正方形に対して完全に機能します。しかし、サイズが違うと(5x5,7x7)、私は異なる結果を得ます。 "forループ"は大丈夫だと思われるので、なぜ私はその出力を得ているのかわかりません。 – Jack

+0

私の悪いです。数字を正しく表示するだけで、ウィンドウを大きくして、数字を表示する必要がありました(「24」が表示されず、「2」しか表示されません)。再度、感謝します! – Jack

+0

@Jackあなたは大丈夫です、はい、ウィンドウを大きくするか、フォントを小さくすることができます:) –

3

フォームを作成し、このプロパティを使用して

tableLayoutPanel1.Dock = DockStyle.Fill; 
tableLayoutPanel1.BackColor = Color.Gold; 

をTableLayoutPanelを追加し、これはあなたが行と列を作成すると、正しく割合を設定に合うように

enter image description here

結果であることができますこのようにして:

enter image description here

この後、ボタンまたはラベルを各四角形に追加できます。

enter image description here

関連する問題