WinForms実習:クリックされたカードを見分ける方法

配列とイベントでクリックされたカードを判定する

前回の実習では、カードをクリックするとメッセージが表示されるところまで作りました。

今回は一歩進めて、

「どのカードがクリックされたのか」

を見分ける方法を整理します。


この実習で学ぶこと

今回のポイントは次の4つです。

  • Clickイベント
  • sender
  • 配列
  • for文での比較

これらを組み合わせることで、

クリックされたカードを特定する

ことができます。


1 Clickイベントを登録する

カードを作るときに、クリックイベントを登録します。

cards[i].Click += CardClicked;

これは

  • cards[i] がクリックされたら
  • CardClicked メソッドを実行する

という意味です。

for文で作ったすべてのカードに、このイベントが登録されます。


2 イベントメソッドを書く

クリックされたときに実行されるメソッドを作ります。

void CardClicked(object sender, EventArgs e)
{
    MessageBox.Show("カードがクリックされました");
}

これでカードをクリックするとメッセージが表示されます。


3 sender とは何か

イベントメソッドの中にあるこの部分です。

object sender

これは

イベントを発生させたコントロール

です。

今回の場合は

クリックされた PictureBox

が入っています。


4 sender を PictureBox として扱う

sender は object 型なので、そのままでは PictureBox として扱えません。

そこでキャストを行います。

PictureBox clickedCard = (PictureBox)sender;

これで

クリックされたカード

を取り出すことができます。


5 配列のどのカードかを調べる

次に、

  • cards[0]
  • cards[1]
  • cards[2]
  • cards[3]
  • cards[4]

のどれがクリックされたのかを調べます。

そのために for文で順番に比較します。

for (int i = 0; i < cards.Length; i++)
{
    if (cards[i] == clickedCard)
    {
        MessageBox.Show((i + 1) + "枚目のカードです");
        break;
    }
}

ここでは

cards[i] と clickedCard が同じか

を調べています。

一致した場所が

クリックされたカード

になります。


6 全体の流れ

今回のプログラムの流れは次のようになります。

  1. for文でカードを作る – PictureBox を5枚作る
  2. クリックイベントを登録 – cards[i].Click += CardClicked
  3. カードがクリックされる
  4. CardClicked メソッドが呼ばれる
  5. sender にクリックされたカードが入る
  6. 配列を順番に調べて一致するカードを見つける

7 完成コード

カードのイメージ画像は、どれも同じなので最初の方で取得しているバージョンになります

using System;
using System.Drawing;
using System.Windows.Forms;

namespace CardArraySample
{
    public partial class Form1 : Form
    {
        PictureBox[] cards = new PictureBox[5];
        Image cardImage = Image.FromFile("card.png");

        public Form1()
        {
            InitializeComponent();
            CreateCards();
        }

        void CreateCards()
        {
            int startX = 20;
            int space = 120;

            for (int i = 0; i < cards.Length; i++)
            {
                cards[i] = new PictureBox();
                cards[i].Width = 100;
                cards[i].Height = 150;
                cards[i].Left = startX + i * space;
                cards[i].Top = 30;
                cards[i].SizeMode = PictureBoxSizeMode.StretchImage;
                cards[i].Image = cardImage;

                // クリックイベントに「CardClicked」メソッドを登録する
                // カードがクリックされたとき、このメソッドが呼ばれる
                cards[i].Click += CardClicked;

                this.Controls.Add(cards[i]);
            }
        }

        // カードがクリックされたときに実行されるイベントハンドラ
        void CardClicked(object sender, EventArgs e)
        {
            // senderには「クリックされたコントロール」が入っている
            // 今回はPictureBoxなのでPictureBox型に変換する
            PictureBox clickedCard = (PictureBox)sender;

            // 配列の中から「どのカードがクリックされたか」を探す
            for (int i = 0; i < cards.Length; i++)
            {
                // 配列の中のカードとクリックされたカードが同じか確認
                if (cards[i] == clickedCard)
                {
                    // 何枚目のカードか表示する
                    MessageBox.Show((i + 1) + "枚目のカードです");

                    // 見つかったのでループ終了
                    break;
                }
            }
        }
    }
}

今日のポイント

今回の核心はこの流れです。

クリックされたコントロール
    ↓
sender で取得
    ↓
配列の中身と比較
    ↓
どのカードか特定

この仕組みが理解できると、

  • カードゲーム
  • ボタン操作
  • メニュー処理

など、多くのアプリで応用できるようになります。


訪問数 34 回, 今日の訪問数 34回

記事下広告