ここから本文です

【Visual C#】クリックすると画像の変わるボタンを作成する方法についてお聞きした...

nag********さん

2016/6/1518:12:58

【Visual C#】クリックすると画像の変わるボタンを作成する方法についてお聞きしたいことがあります。

(プログラム中で生成されるインスタンスはForm,Background,Buttonの3つです)
フォーム画面(Form1)に描画された背景(Background)の上に、
クリックすると画像の変わるボタン(Button)を作成しようとしています。

まず、Backgroundクラスは以下のように定義されています。

class Background
{
PictureBox background;
public Background(Form1 fm)
{
background = new Background();
background.Width = 800;
background.Height = 600;
background.Image = "ファイルパス";
background.Parent = fm;
}
}

次に、ボタンクラスは以下のように定義されています。
class Button
{
public Button(PictureBox background)
{

button = new PictureBox();
button.Width = button.Height = 100;
button.Image = Image.FromFile("ファイルパス");
button.Parent = background;

button.Click += new EventHandler(button_Clicked);
}
public void button_Clicked(object sender, EventArgs e)
{
(※既に生成されているボタン).Width = button.Height = 100;
(※既に生成されているボタン).Image = Image.FromFile("ボタン押後の画像ファイルパス");
(※既に生成されているボタン).Parent = (※既に生成されている背景)
}
}

Buttonクラスのイベントハンドラの中身を見て頂ければお分かり頂けると思うのですが、
イベントハンドラに引数として現在生成されているインスタンスを渡す方法が分からず、手が止まっています。

どうしたら良いでしょうか?

補足Buttonクラスって既に存在するクラスでしたか...。
すみませんが、質問文中のButtonクラスを、Game_Buttonクラス等に改名して読んで頂きたいです。

閲覧数:
315
回答数:
2
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

質問の意味は、わかります。
もしも私が解釈した仕様であれば、その仕様は、ごちゃごちゃして説明しづらいと思います。
よって、まずその仕様を下記に書きます。



[もともと行ないたかった仕様]
ピクチャボックスの中に(上に)ボタンを配置する。
その際に、そのボタンは、透明化する(ボタンの文字列や枠だけ見えて、ボタンの背景は透けて、ピクチャボックスの画像が見えるようにする)。


[今回の質問の仕様]
上記の「もともと行ないたかった仕様」では、何をやってもボタンが透明化しない。
そこで、以下の仕様にすることにした。
ピクチャボックスの中に(上に)、別のピクチャボックスを配置する。
その際に、中側の(上側の)ピクチャボックスは、透明化する(中側のピクチャボックスに描画する枠だけ見えて、中側のピクチャボックスの背景は透けるようにする)。
この場合、中側の(上側の)ピクチャボックスの透明化は、うまく行く。
しかし、中側の(上側の)ピクチャボックスをボタン代わりにする際に、そのクリックイベントの扱い方が、わからないので本質問を出した。


[回答本編: 方法1]
上記仕様で合っている場合は、下記の通りです。
画像を貼り付けるピクチャボックスをpictureBox1とし、ボタン代わりにするピクチャボックスをpictureBox2とすると、

// pictureBox2の親コントロールをpictureBox1と指定する
pictureBox1.Controls.Add(pictureBox2);

とします。
全体のコードは、下記に記します。
なお、下記の全体のコードは、pictureBox2のクリックイベントの扱い方までは書いていません。
しかし、普通に、

pictureBox1.何々;

と言う指定が行なえるので、イベントハンドラをいじらなくても操作が行なえます。


「<C#> ピクチャーボックスの上に、透明化した別のピクチャーボックスを配置するサンプル No.1
--- 透明化ピクチャーボックスに円を描画する」
http://note.chiebukuro.yahoo.co.jp/detail/n375793


[方法2]
やったことはないのですが、質問のようにParentプロパティを使う手法でしたら、以下のようにすればよいと思います。
ParentプロパティをPictureBoxクラスへのキャスト(型変換)をすれば、ピクチャボックスとして機能するはずです。

PictureBox Pic_Box_Work = (PictureBox)button.Parent;

そのあとは、普通に、

Pic_Box_Work.何々;

と言う指定が行なえるので、画像表示用ピクチャボックスの操作が行なえます。

  • 質問者

    nag********さん

    2016/6/1706:50:15

    回答ありがとうございます。

    サンプルプログラムの方を見させて頂きました。

    サンプルプログラム中で、button1というオブジェクトはデフォルトのボタンコントロールのままになっていますよね。

    そのボタンコントロールの画像やサイズを任意のものに変更することは可能なのでしょうか?

  • その他の返信(5件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2016/6/17 19:24:32

丁寧な回答ありがとうございました。
無事解決致しました、大変助かりました。

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

mak********さん

2016/6/1523:57:15

Backgroundクラスがbackgroundをメンバに持っているのと同じように、buttonをメンバに持てばいいのではないですか?
そもそもbuttonを定義している所がないようですが…
ちなみにイベントハンドラのsenderもbuttonと同じになります。
それ以前に、ボタンのクリックイベントをボタンで処理しているのですか?
ボタンクリックで画像変更以外の本処理をする場合は、別のイベントを使うのでしょうか?
私ならこういう場合はButtonクラスには画像変更のメソッドだけを用意しておいて、クリックイベントはフォームで処理して、そこから画像変更のメソッドを呼ぶようにします。そうすればイベントは1つで済みます。

background = new Background();
これは、
background = new PictureBox();
の間違いですよね?

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる