none
C#でのIF文を使ったフォーム背景画像の設定方法について

    質問

  • コントロールのボタン「button1」を押したときに、フォームの背景画像を変更するようにしたいと思い、

    以下のコードを記述しましたが、実行しても変化がありません。      

    おそらく、文の書き方がおかしいのだと思うのですが、どう書いたら良いのか、調べてもわからなかった

    ため、質問させて頂きます。

    背景画像を変更する条件として、リソースに登録されている「P100m」という名前の画像が、そのとき

    の背景画像として設定されていたら、リソースに登録されている「P200m」という名前の画像に変更する、

    というものです。IF文を使用せずに、必ず「P200m」に変更するように記述すると動くので、条件文の

    書き方の部分に変更が必要なのだと思います。C#初心者ですが、よろしくお願いいたします。

    private void button1_Click(object sender, EventArgs e)
    {
    //P100mが表示されている場合、P200mを表示
    if (this.BackgroundImage == Properties.Resources.P100m)
    {
    this.BackgroundImage = Properties.Resources.P200m;
    }
    {

    2018年1月25日 0:01

回答

  • if 文で比較する際、右辺では新たにイメージのインスタンスが作成されているのかもしれませんね。回避方法ですが、他にもいろいろな方法があるかと思いますが、BackgroundImage.Tag にリソース名を保持しておいて if 文で比較するのはどうでしょうか?

    using System;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                this.BackgroundImage = Properties.Resources.P100m;
                this.BackgroundImage.Tag = "P100m";
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if ((string)this.BackgroundImage.Tag == "P100m")
                {
                    this.BackgroundImage = Properties.Resources.P200m;
                    this.BackgroundImage.Tag = "P200m";
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                if ((string)this.BackgroundImage.Tag == "P200m")
                {
                    this.BackgroundImage = Properties.Resources.P100m;
                    this.BackgroundImage.Tag = "P100m";
                }
            }
        }
    }
    2018年1月25日 1:19

すべての返信

  • yoshi00000111111 さん、こんにちは。
    フォーラム オペレーターの立花です。

    ご投稿くださいましてありがとうございます。
    YAHOO! JAPAN 知恵袋にも同じ投稿をされていらっしゃいますか?

    C#でのIF文を使った背景画像の設定方法について
    https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11185184286

    情報が分散してしまうので、あとから閲覧する方や、調査をして回答いただいた方のためにも
    どちらかに絞った方がよいかと思いますのでご検討くださいませ。

     - フォーラム利用時の注意点のお知らせです。
    ※初めてご投稿された方を対象にお知らせしています。

    ご利用の際は、下記内容をお守りいただきますと
    情報が寄せられやすくなりますので、ぜひご一読ください。
    ・フォーラムでご質問頂くにあたっての注意点
    ・フォーラムへの回答に関するガイドラインおよびフォーラム運営について(再掲)
    ご意見、ご要望はこちらのフォーラムまで。
    各種設定方法はフォーラム内を [かんたん フォーラム ガイド] で検索してみてください。


    参考になった投稿には回答済みマークの設定にご協力ください
    MSDN/TechNet Community Support 立花楓

    2018年1月25日 0:28
    モデレータ
  • 立花様

    フォーラム利用のルールをよく理解しておらずに、大変、失礼いたしました。

    知恵袋の方は削除することにします。

    2018年1月25日 0:37
  • yoshi00000111111 さん、立花です。
    早々にご確認くださいましてありがとうございます。

    それでは参加者の皆様からの回答をお待ちくださいませ。


    参考になった投稿には回答済みマークの設定にご協力ください
    MSDN/TechNet Community Support 立花楓

    2018年1月25日 0:48
    モデレータ
  • if 文で比較する際、右辺では新たにイメージのインスタンスが作成されているのかもしれませんね。回避方法ですが、他にもいろいろな方法があるかと思いますが、BackgroundImage.Tag にリソース名を保持しておいて if 文で比較するのはどうでしょうか?

    using System;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                this.BackgroundImage = Properties.Resources.P100m;
                this.BackgroundImage.Tag = "P100m";
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if ((string)this.BackgroundImage.Tag == "P100m")
                {
                    this.BackgroundImage = Properties.Resources.P200m;
                    this.BackgroundImage.Tag = "P200m";
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                if ((string)this.BackgroundImage.Tag == "P200m")
                {
                    this.BackgroundImage = Properties.Resources.P100m;
                    this.BackgroundImage.Tag = "P100m";
                }
            }
        }
    }
    2018年1月25日 1:19
  • kenjinote 様

    ご教示頂きました方法を試してみたところ、求めていた通りの動作になりました。

    お力をお貸しいただき、本当にありがとうございました。

    2018年1月25日 2:50
  • すでに回答としてマークがついていますが・・・

    Properties.Resources.P100m とするとリソースから ResourceManager.GetObject メソッドで Bitmap 型のオブジェクトを取得してきます。

    以下の MDSN ライブラリの説明のセクション「パフォーマンスに関する考慮事項」によると "同じ name パラメーターで GetObject メソッドを複数回呼び出した場合、戻り値が同じオブジェクトの参照になるとは限りません・・・" とありますが、それが理由で this.BackgroundImage == Properties.Resources.P100m が true にならないということのようです。

    ResourceManager.GetObject メソッド (String, CultureInfo)
    https://msdn.microsoft.com/ja-jp/library/2kd8ks0y(v=vs.100).aspx

    以下のようにすれば望む結果が得られると思います。

    本件とは直接関係ない話ですが、== 演算子については値型と参照型、参照型でも string 型とその他では結果が違いますので注意してください。

    == 演算子 (C# リファレンス)
    https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/equality-comparison-operator

    2018年1月25日 3:01
  • SurferOnWww 様

    丁寧な説明ありがとうございました!とても良くわかりました。

    今後のコーディングの参考にさせて頂きます。

    2018年1月26日 3:40