#背景
ラベルと画像を「組」にしたものを、画面上にたくさん配置したいと考えています。マウスを画像の上に乗せたときに、画像とラベルを同時に変更したいと考えています。
マウスを、画像の上に移動させたときに、MouseMove イベントが発生します。このイベントをとらえて、画像の背景色を変更させようと考え、次のようなプログラムを書いてみました。しかし「ふたつ同時に変更する」ということがうまくいきません。
#ソースコード
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace mytest 12{ 13 public partial class Form1 : Form 14 { 15 16 public static Panel PL; 17 18 public static void MoveOnPic(object sender, EventArgs e) 19 { 20 (sender as PictureBox).BackColor = Color.Red; 21 } 22 23 public Form1() 24 { 25 InitializeComponent(); 26 27 PL = new Panel(); 28 Controls.Add(PL); 29 PL.Size = new Size(800, 600); 30 31 Test tt; 32 tt = new Test(50); 33 tt = new Test(150); 34 } 35 } 36 37 public class Test 38 { 39 PictureBox Pic; 40 Label LB; 41 42 public Test(int y) 43 { 44 LB = new Label(); 45 Form1.PL.Controls.Add(LB); 46 LB.Size = new Size(100, 50); 47 LB.Location = new Point(50, y); 48 LB.BackColor = Color.FromArgb(40, 255, 0, 0); 49 50 Pic = new PictureBox(); 51 Form1.PL.Controls.Add(Pic); 52 Pic.Size = new Size(100, 50); 53 Pic.BackColor = Color.FromArgb(40, 0, 0, 255); 54 Pic.Location = new Point(200, y); 55 Pic.MouseMove += new MouseEventHandler(Form1.MoveOnPic); 56 } 57 } 58}
#エラー
この状態では、エラーは発生しません。
#質問
上のプログラムでは、マウスが画像の上に移動したときに、画像の背景色を変えましたが、ラベルの背景色も同時に変えるには、どのようにすればよろしいでしょうか。
上のプログラムでは、MouseOnPic 関数の引数の sender は Test Class の Pic を指しています。同じ class の中には、LB もありますので、
Pic と同じクラスに所属している LB について、
LB.BackColor = Color.Blue;
という命令を実行する
ということをやりたいのですが、MouseOnPic の引数の sender から 同じ class 内の LB にたどりつく方法がわかりません。
お手数ですが、御教授いただければ幸いです。
#解決方法
mmaeda様から教えていただいた方法で、解決しました。
その後、できるだけプログラムを簡素化しようと試みて、以下のようにしてみました。
このままコピペすると、ちゃんと動くと思います。
C#
1using System.Drawing; 2using System.Windows.Forms; 3 4namespace mytest 5{ 6 public partial class Form1 : Form 7 { 8 public static Panel PL; 9 10 public Form1() 11 { 12 InitializeComponent(); 13 PL = new Panel(); 14 Controls.Add(PL); 15 PL.Size = new Size(800, 600); 16 17 new Test(60); 18 new Test(120); 19 new Test(180); 20 new Test(240); 21 } 22 23 public static void MyMove(PictureBox pic, Label LB) 24 { 25 pic.BackColor = System.Drawing.Color.Red; 26 LB.BackColor = System.Drawing.Color.Yellow; 27 } 28 29 public static void MyLeave(PictureBox pic, Label LB) 30 { 31 pic.BackColor = Color.FromArgb(40, 0, 0, 255); 32 LB.BackColor = Color.FromArgb(40, 255, 0, 0); 33 } 34 } 35 36 public class Test 37 { 38 public PictureBox Pic; 39 public Label LB; 40 41 public Test(int y) 42 { 43 LB = new Label(); 44 Form1.PL.Controls.Add(LB); 45 LB.Size = new Size(100, 50); 46 LB.Location = new Point(50, y); 47 LB.BackColor = Color.FromArgb(40, 255, 0, 0); 48 49 Pic = new PictureBox(); 50 Form1.PL.Controls.Add(Pic); 51 Pic.Size = new Size(100, 50); 52 Pic.BackColor = Color.FromArgb(40, 0, 0, 255); 53 Pic.Location = new Point(200, y); 54 Pic.MouseMove += (s, e) => Form1.MyMove(Pic, LB); 55 Pic.MouseLeave += (s, e) => Form1.MyLeave(Pic, LB); 56 } 57 } 58}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/14 20:42
2020/01/14 22:23
2020/01/17 21:50