ひとりも見捨てないことを、あきらめない

学校教育、社会教育、数学、技術家庭科、Youtube、EdTech、ICT、プログラミング、その他

イベントハンドラの「裏技」 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);
        }
    }
}

 いちおう、画像も、添付しておきます。

f:id:takase_hiroyuki:20200115192008p:plain