【C#】迷路を作ろう 動的にコントロールの配置

スポンサーリンク

迷路を作ろう の続きです。

今回は、操作するプレーヤーを配置していきたいと思います。

では、やっていきましょうっっ!!

コントロールを新規に追加する

今回はピクチャーボックスを配置したいと思います。

GUI上に配置していなくても、コード上で書けば配置できるのでやっていきましょう。

やる事は、3つです。

①ピクチャーボックスを定義する
②ピクチャーボックスのインスタンスを生成する
③ピクチャーボックスをコントロールに追加する

細かいことはさておき、3項目をコードに表しましょう!!

  //ラベルを定義する
  PictureBox picbx;
        
  //インスタンスの生成
  picbx = new PictureBox();

  //コントロールに追加する
  this.Controls.Add(picbx);

コントロールを最前面に表示する

コントロールに追加した場合、1番最初に追加されたコントロールが最前面に、一番最後に追加されたコントロールが最背面に配置されます。

その為、今のままでは、せっかく設置したピクチャーボックスが最背面になってしまいます。

最前面に移動させましょう。

//最前面に配置する
picbx.BringToFront();

コントロールのプロパティを設定する

ピクチャーボックスのプロパティを設定していきましょう!!

設定する事は下記内容です。

①名前
②画像
③表示
④大きさ(ラベルのマスの一回り小さくしたい)
⑤画像サイズモード
⑥配置(スタートマスの真ん中に配置したい)

この内容をコードに表記しています。

string picbxname = "picbxplayer";
picbx.Name = picbxname;      //名前
picbx.Image = BmpPlayer;   //画像
picbx.Visible = true;    //表示 
picbx.Size = new Size(playersize, playersize);  //サイズ
picbx.SizeMode = PictureBoxSizeMode.StretchImage; //画像サイズモード

//スタート位置のLocation(配置)とSize(大きさ)を取得
Point pnt = lblMaze(0, 1).Location;
Size sz = lblMaze(0, 1).Size;

//スタートマスの真ん中に行くように計算する。
int x = pnt.X + (sz.Width / 2) - (playersize / 2);
int y = pnt.Y + (sz.Height / 2) - (playersize / 2);
picbx.Location = new Point(x, y);  //配置

Imageプロパティは、コンストラクタ時にコンテンツに組み込んだ画像を読み込んでおきました。

事前に定義もしています。(private Bitmap BmpPlayer;)

//現在のコードを実行しているAssemblyを取得
System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly();

//指定されたマニフェストリソースを読み込む
BmpPlayer = new Bitmap(myAssembly.GetManifestResourceStream("App_Maze.img.player.png"));

※Imageプロパティはその時に、外部の画像を読み込んでも問題はありません。

インスタンスを多重に生成するのを防ぐ

今のままでは、無条件でインスタンスを生成してしまうため、ピクチャーボックスのインスタンスがあるかを確認しましょう。

多重にインスタンスを生成してしまうと、メモリーが溢れて、パンクしてしまいます。

やり方は、複数あると思いますが、今回はコントロールを取得して、無かった場合のみインスタンスを生成します。

//2回目以降を考えて、名前から取得する
picbx = (PictureBox)this.Controls[picbxname];
if(picbx == null)
{
    picbx = new PictureBox();
}

コントロールの名前から、コントロールを取得し、取得できない場合はnullの為、インスタンスを生成します。

関数として作成する

今までの内容を関数にまとめました。

private void Placement_Player()
{
    //ラベルを定義する & ラベルの名前を定義する
    PictureBox picbx;
    string picbxname = "picbxplayer";

    //2回目以降を考えて、名前から取得する
    picbx = (PictureBox)this.Controls[picbxname];
    if(picbx == null)
    {
        picbx = new PictureBox();
    }

    picbx.Name = picbxname;
    picbx.Image = BmpPlayer;
    picbx.Visible = true;
    picbx.Size = new Size(playersize, playersize);
    picbx.SizeMode = PictureBoxSizeMode.StretchImage;

    //スタート位置のLocation(配置)とSize(大きさ)を取得
    Point pnt = lblMaze(0, 1).Location;
    Size sz = lblMaze(0, 1).Size;

    //スタートマスの真ん中に行くように計算する。
    int x = pnt.X + (sz.Width / 2) - (playersize / 2);
    int y = pnt.Y + (sz.Height / 2) - (playersize / 2);
    picbx.Location = new Point(x, y);

    //コントロールに追加する
    this.Controls.Add(picbx);
    picbx.BringToFront();

}

実際にこの関数を使用し、動かしてみましょう。無事にピクチャーボックスが配置される事が分かります。

まとめ

コントロールを動的に配置する事を行いました。※今回はピクチャーボックス

流れとしては、

①定義
②インスタンスの生成
③プロパティの設定
④コントロールを追加
⑤最前面に設定

イメージでは、追加すると最前面になりそうだったので、⑤の内容は覚えていた方がいいかもしれません。

メモメモ。。。

コメント

タイトルとURLをコピーしました