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 全体の流れ
今回のプログラムの流れは次のようになります。
- for文でカードを作る – PictureBox を5枚作る
- クリックイベントを登録 –
cards[i].Click += CardClicked - カードがクリックされる
- CardClicked メソッドが呼ばれる
- sender にクリックされたカードが入る
- 配列を順番に調べて一致するカードを見つける
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 で取得
↓
配列の中身と比較
↓
どのカードか特定
この仕組みが理解できると、
- カードゲーム
- ボタン操作
- メニュー処理
など、多くのアプリで応用できるようになります。




ディスカッション
コメント一覧
まだ、コメントがありません