![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
動的生成されたピクチャーボックスのイベントハンドラの作り方がわからないのか、イベントハンドラに記述する処理がわからないのか、どっちなのかよくわかりませんが……
// タグ用クラス
public class Card
{
public int no;
public Bitmap bmp;
public Card(int no, Bitmap bmp)
{
this.no = no;
this.bmp = bmp;
}
}
// フォーム1クラス
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// クラスの内部変数
private static Bitmap[] cardbmp = {cardbmp01, cardbmp02, ……, cardbmp52};
private PictureBox[] PB = new PictureBox[52];
private int old_no;
private Bitmap empty = new Bitmap(50, 75);
// フォームが立ち上がったとき
private void Form1_Load(object sender, EventArgs e)
{
old_no = -1;
this.ClientSize = new Size(50 * 13, 75 * 4);
for (int i = 0; i < 52; i++) {
// ピクチャーボックスの生成
PB[i] = new PictureBox();
PB[i].Location = new Point(50 * (i % 13), 75 * (i / 13));
PB[i].Size = new Size(50, 75);
PB[i].BorderStyle = BorderStyle.FixedSingle;
// イベントハンドラの登録
PB[i].Click += new EventHandler(this.Card_Click);
// ピクチャーボックスの関連付け
this.Controls.Add(PB[i]);
// ピクチャーボックスの表示
DrawCard(i, cardbmp[i]);
PB[i].Tag = new Card(i, cardbmp[i]);
}
}
// カード描画処理
private void DrawCard(int no, Bitmap bmp)
{
Graphics gs = PB[no].CreateGraphics();
gs.DrawImage(bmp, 0, 0, PB[no].Width, PB[no].Height);
}
// カードのクリア処理
private void ClearCard(int no)
{
Graphics gs = PB[no].CreateGraphics();
gs.Clear(Color.Green);
}
// クリック時のイベントハンドラ
public void Card_Click(object sender, EventArgs e)
{
// クリックされたピクチャーボックスの情報を取得
Card cinf = (Card)(((PictureBox)sender).Tag);
if (old_no >= 0) {
// クリックされたピクチャーボックスの画像を
// 表示のないピクチャーボックスに描画
DrawCard(old_no, cinf.bmp);
PB[old_no].Tag = new Card(old_no, cinf.bmp);
}
// クリックされたピクチャーボックスをクリア
ClearCard(cinf.no);
PB[cinf.no].Tag = new Card(cinf.no, empty);
old_no = cinf.no;
}
}
ここではどのピクチャーボックスをクリックしてもイベントハンドラとしてCard_Clickが呼ばれる。
ピクチャーボックスの番号と表示してる画像のビットマップをクラスCardのオブジェクトとしてTagプロパティに登録してるので、イベントハンドラではそれを見てクリックされたピクチャーボックスの判断をしている。
イベントハンドラの処理は、クリックされたピクチャーボックスのビットマップをクリアされているピクチャーボックスに移し、クリックされたピクチャーボックスをクリアしている。(初回はクリアのみ)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript jQueryで同じクラス名のものを別物として扱いたい 1 2022/06/17 14:14
- 写真・ビデオ iphoneからPCへ写真をインポート、保存先がわかりません。 2 2022/09/29 02:06
- Windows 10 壁紙フォルダが表示されない 1 2022/11/16 21:58
- ドライブ・ストレージ PCを操作すると重いです 3 2022/04/29 21:57
- iCloud iCloudフォトについて教えて下さい。 1 2023/05/30 16:41
- その他(プログラミング・Web制作) pythonで、tkinterとpillowの組み合わせ 2 2022/08/16 17:42
- その他(クラウドサービス・オンラインストレージ) データ保存先をOneDriveからPC本体に変えたらDocumentとPictureフォルダが消えた 1 2023/07/30 15:48
- Excel(エクセル) 【EXCEL】=セル&セルが上手く表示できない。 7 2022/09/04 21:32
- Windows 10 画面上の[タスクバー]の位置の変更 1 2022/06/12 21:10
- Excel(エクセル) エクセル シート内のボックスを縦並びから横並びに 7 2023/04/05 04:28
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
unityでのC++エラーの原因がわ...
-
C#でのWNetAddConnection3の使...
-
C#で別のFormへ複数の値を返そ...
-
C#で、あるクラスのメンバーす...
-
JavaFXでの表内のチェックボッ...
-
大量のデータを読み込んで表示...
-
文字列の置換
-
ピクチャボックスのクリックイ...
-
アプレットでマウスイベントが...
-
キーリピート?(Javaプログラミ...
-
Thread.sleepのInterruptedExce...
-
[C#.net]スレッド化された別フ...
-
Junitテストでvoid戻り値メッソ...
-
クラス配列で例外ヌルリファレ...
-
なぜエラーになるのかがわかり...
-
マウスクリックで別のスレッド...
-
Processingでマウスクリックで...
-
setIcon() の反対のようなもの...
-
【C#】 データベース未使用での...
-
c# refで渡すようにオブジェク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C#で、あるクラスのメンバーす...
-
Junitテストでvoid戻り値メッソ...
-
C#でのWNetAddConnection3の使...
-
Processingでマウスクリックで...
-
ボタンの複数割り当てについて
-
エンターキーを押すとOKボタン...
-
C# 矢印キーの取得
-
C# visibleプロパティをfalseに...
-
Thread.sleepのInterruptedExce...
-
C# DataGridView列カスタマイズ
-
C#でキーイベントが発生しない...
-
LVM_SETITEMSTATEでListViewの...
-
[C#.net]スレッド化された別フ...
-
GetDIBits関数の使い方について
-
C# 半角カナの文字化けについて
-
C# 親フォームで指定した値を...
-
javaアプレット repaintのタイ...
-
デスクトップマスコットのドラ...
-
C#で別のFormへ複数の値を返そ...
おすすめ情報