PictureBoxの透過

やりたいこと

C#のフォームアプリでPictureBoxを2枚重ねてレイヤーのように透過表示させる。

はまったところ その1

前面のPictureBox の BackColor を Color.Transparent にする。これで背面のPictureBoxが透けて見えるはずと思った。しかし、実際には背面のPictureBoxをも透過して Form 本体が透けて見えてしまった。BackColor が Color.Transparent のとき、透けて見えるのは背面のコントロールではなく親コントロールらしい。

解決策としては、FormのLoadイベントで、背面のPictureBoxを前面のPictureBoxの親として設定する。

    pictureBoxFront.BackColor = Color.Transparent;
    pictureBoxFront.Parent = pictureBoxBack;

はまったところ その2

ところが、上記のように設定すると前面のPictureBoxが消えて見えなくなる場合がある。この現象が起こる条件はよく分からない。ただ、前面のPictureBoxをデザイナで配置していたのが問題のように思われる。

解決策として、前面のPictureBoxはデザイナで配置せず、FormのLoadイベントで生成・設定する。

    pictureBoxFront= new PictureBox();
    pictureBoxFront.BackColor = Color.Transparent;
    pictureBoxFront.Parent = pictureBoxBack;
    pictureBoxFront.Width  = pictureBoxBack.Width;
    pictureBoxFront.Height = pictureBoxBack.Height;
    pictureBoxFront.Location = new Point(0, 0);
    //pictureBoxBack.Controls.Add(pictureBoxFront); 不要?

参考