none
pictureBoxをクリックすると画像が変わるようにしたい RRS feed

  • 質問

  • 行いたいことは、picureBoxに表示してある、ビットマップをクリックするごとに2枚のビットマップが入れ替わるようにしたいという
    実に単純なことです。

    プロジェクトのResourcesフォルダーに2枚のビットマップA.Bがあります。

    Clickイベントハンドラーに

            private void pictureBox1_Click(object sender, EventArgs e)
            {
                if (pictureBox1.Image==WindowsFormsApplication1.Properties.Resources.A)
                {
                    pictureBox1.Image = WindowsFormsApplication1.Properties.Resources.B;
                }
           else
                {
                    pictureBox1.Image = WindowsFormsApplication1.Properties.Resources.A;
                }

             }
    なるコードを記述しているのですが、上記コードではif文がTRUEになることがありません。

    本やインターネットで調べても答えが得られませんでの、質問させて頂きました。
    極めて初歩的な内容とは思うのですが、どうかどうかよろしくお願い致します。

    2010年2月25日 16:47

すべての返信

  • Properties.Resources から Bitmap を取得する場合、毎回新しいインスタンスが生成されます。
    今のやり方・考え方ではダメです。
    案を少し提示しておきますので、考えてみてください。

    案1
    Resources.A, Resources.B を最初に 1 回だけ取得し、メンバー変数に入れておく。
    pictureBox.Image に代入するのはメンバー変数から得た参照とし、比較も Image と メンバー変数で行う。
    なお、フォームを閉じたときなどにメンバー変数の Bitmap は Dispose するべきでしょう。
    (1 回だけしか Resources にアクセスしないことで、インスタンスを無闇に増やさない)

    案2
    どちらを表示しているかを現すメンバー変数を別途作る。
    その変数を見て、次にどちらを表示するべきか判断する。
    ただし、毎回 Resources にアクセスするのであれば、古い画像を Dispose する必要あり。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年2月25日 22:27
    モデレータ
  • Image.Equals Methodを使用してみてください。
    2010年2月25日 22:35
  • Image.Equals Methodを使用してみてください。
    それは false を返しますよ。
    Image クラス独自で Equals をオーバーライドしていないので、単なる参照の比較になります。
    ( == 演算子と等価)

    http://msdn.microsoft.com/ja-jp/library/system.drawing.image_members.aspx
    Equals 指定した Object が、現在の Object と等しいかどうかを判断します。 (Object から継承されます。)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年2月25日 22:46
    モデレータ
  • ご指摘のとおりOnlineのMSDNだと、オーバーライドの記載がないですね。

    私はLocalのVista SDKのImage.Equalsを見ていたのですが、
    そちらには以下のように記載されていますね。

      Overloaded. Determines whether two Object instances are equal. (inherited from Object)

    表現がOverloadedになっておりますが、
    OverloadedのMethodを使用すれば、
    Objectの中身を見て判断してくれるものだと考えていました。

    ここでいうOverloadedとは、
    別の意味を指し示しているのか、
    記載ミスでしょうか。

    2010年2月25日 23:25
  • object.Equals(object, object) という同じ名前の違うメソッドがありますよ、ということだと思います。

    2010年2月25日 23:51
  • そういうことですか。
    有難うございます。

    私が示した手段は、適切ではないですね。

    2010年2月26日 0:34