2016年11月9日水曜日

C#のフォームの下にあるモノをクリックする

C#のFormにはTransparencyKeyというプロパティがあり、コレに色を設定するとそのフォーム上ではその色を透過色として扱うことができる(1bitα)。
コレを使うとフォームの後ろにあるボタンとかをクリックできるようになる。



上の画像ではForm1の手前にForm2があり、Form1にはいくつかのボタンが設置してある。
Form2はPictureBoxをDock:Fill, Modifiers:Publicで設置してある。
Form1のソースは以下の通り

using System;
using System.Drawing;
using System.Windows.Forms;

namespace TransparencyKey
{
    public partial class Form1 : Form
    {
        Form2 f2;

        public Form1()
        {
            InitializeComponent();

            f2 = new Form2();

            Bitmap bmp = new Bitmap(400, 400);
            using (Graphics g = Graphics.FromImage(bmp))
            {
                g.Clear(f2.BackColor);

                g.FillRectangle(Brushes.Lime, 100, 100, 100, 100);
            }

            f2.Owner = this;
            f2.TransparencyKey = f2.BackColor;
            f2.pictureBox1.Image = bmp;
            f2.Size += bmp.Size - f2.pictureBox1.Size;
            f2.Show();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Button b = sender as Button;

            if (b == null)
            {
                return;
            }

            label1.Text = b.Name;
        }
    }
}

Form2の初期化もForm1のコンストラクタ内で行っているが、Form1自体の動作としてはボタンが押されたらラベルにボタン名を表示しているだけ。
Form2についてはピクチャボックスに幅100x高さ100の塗りつぶし領域を作り、それ以外はBackColorで塗りつぶしてある。またTransparencyKeyにBackColorを指定してあり、BackColorの部分は透過とする。それからOwnerにForm1を指定し、Form1をクリックしても常にForm2が手前に居続けるようにしている。

上の画像では一部のボタンが緑の矩形に隠れているが、見えている部分であればクリックすることが可能。緑色の部分をクリックするとForm2がフォーカスする。
また透過した部分は常に見えている部分にマウスの処理が移動する。例えば後ろにウェブブラウザがあればリンクをクリックしたり、文字を選択したりすることが可能。


今回はPictureBoxに設定した画像はBackColorで塗りつぶしたが、例えばPNG画像で透過に塗りつぶした場所はPictureBoxでForm.BackColorに置き換わり、TransparencyKeyにBackColorが設定されていれば透過となる。


正直、Formの裏をクリックさせたいという需要がどこにあるかさっぱり想像できないが、昔何かをやろうとして調べたときに面倒そうだなぁと思って断念したことが有る。こんなに簡単にできるとは思わなかった。
背景をクリックしたいというのは、例えば半透明のフォームを最前面に常駐させて時計として使うみたいな用途が有るかもしれない。もっとも今回の方法ではそれは実現できないわけだけど。

0 件のコメント:

コメントを投稿