イベントハンドラの「裏技」 01/15 水
こんな方法があるんだと、びっくり仰天です。
でも、この記事を読んでおられる皆様は、「いったい何がびっくり仰天なのか」、「なぜ、そのことが、びっくり仰天に値するのか」が、分からないだろうなあと思います。申し訳ありません。
自分用のメモとして少し書いておくと、まず「イベントハンドラ」とは、マウスを動かしたとか、マウスをクリックしたとか、キーボードのボタンを押したとか、人間がコンピュータに対して、何らかの操作を行ったということに関係しています。
「こんな操作をしたよ」ということを、上手にコンピュータに伝えるための道具が「イベントハンドラ」です。
当然のことながら、マウスを動かすということと、キーボードのキーを押すということは、まったく別の種類の事柄です。したがって、プログラムでも、別の種類のものとして扱っています。
ところが、「裏技」を使うと「なんでもあり」になってしまいます。マウスもキーボードもなんでもあり、ですし操作する対象も、画像を扱っていたはずなのに、ボタンを操作してしまうということも可能です。まるでジョーカーのような働きをしています。
プログラムは、次のとおりです。
using System.Drawing; using System.Windows.Forms; namespace mytest { public partial class Form1 : Form { public static Panel PL; public Form1() { InitializeComponent(); PL = new Panel(); Controls.Add(PL); PL.Size = new Size(800, 600); new Test(60); new Test(120); new Test(180); new Test(240); } public static void MyMove(PictureBox pic, Label LB) { pic.BackColor = System.Drawing.Color.Red; LB.BackColor = System.Drawing.Color.Yellow; } public static void MyLeave(PictureBox pic, Label LB) { pic.BackColor = Color.FromArgb(40, 0, 0, 255); LB.BackColor = Color.FromArgb(40, 255, 0, 0); } } public class Test { public PictureBox Pic; public Label LB; public Test(int y) { LB = new Label(); Form1.PL.Controls.Add(LB); LB.Size = new Size(100, 50); LB.Location = new Point(50, y); LB.BackColor = Color.FromArgb(40, 255, 0, 0); Pic = new PictureBox(); Form1.PL.Controls.Add(Pic); Pic.Size = new Size(100, 50); Pic.BackColor = Color.FromArgb(40, 0, 0, 255); Pic.Location = new Point(200, y); Pic.MouseMove += (s, e) => Form1.MyMove(Pic, LB); Pic.MouseLeave += (s, e) => Form1.MyLeave(Pic, LB); } } }
いちおう、画像も、添付しておきます。